先编写CUDA算子和对应的调用函数。 然后编写torch cpp函数建立PyTorch和CUDA之间的联系,用pybind11封装。 最后用PyTorch的cpp扩展库进行编译和调用。 运行时间分析 我们知道,CUDA kernel函数是异步的,所以不能直接在CUDA函数两端加上time.time()测试时间,这样测出来的只是调用CUDA api的时间,不包括GPU端运行的时间。 所...
先编写CUDA算子和对应的调用函数。 然后编写torch cpp函数建立PyTorch和CUDA之间的联系,用pybind11封装。 最后用PyTorch的cpp扩展库进行编译和调用。 运行时间分析 我们知道,CUDA kernel函数是异步的,所以不能直接在CUDA函数两端加上time.time()测试时间,这样测出来的只是调用CUDA api的时间,不包括GPU端运行的时间。 所...
先编写CUDA算子和对应的调用函数。 然后编写torch cpp函数建立PyTorch和CUDA之间的联系,用pybind11封装。 最后用PyTorch的cpp扩展库进行编译和调用。 运行时间分析 我们知道,CUDA kernel函数是异步的,所以不能直接在CUDA函数两端加上time.time()测试时间,这样测出来的只是调用CUDA api的时间,不包括GPU端运行的时间。 所...
这是正确的统计时间的方法,我们打开Nsight Systems,放大kernel运行那一段可以看到下图: 其中第1和第3个框分别是cuda和torch的GPU warm up过程,这部分没有进行线程同步(上面的黄色块)。 而第2和第4个框就分别是cuda和torch的加法执行过程了,我们可以放大来看看。 可以看出,每执行一次(一个框)都经过了三个步骤:...