我目前的CUDA代码执行速度比CPU代码慢约3-4倍。
我删除了所有无关的CPU / GPU传输,因此大部分计算都是在GPU上完成的,只有最终结果才会传回CPU内存。
为了加快速度,我做了一些阅读,并发现由于GPU内存总线要慢得多,访问GPU设备内存也很慢。而且,由于我的计算使用大型数组 - 因此使用大量内存访问 - 即使我将threadsPerBlock
设置为1024的最大值,这也会减慢速度。
我想我现在唯一的选择就是将数据块复制到每个块操作的MP共享内存中,然后在该内存上进行计算。
我想知道如何以突发模式将一大块内存最有效地复制到共享内存中。我应该通过复制每个warp中的起始线程索引吗?
任何具有相关代码或功能的解决方案都将非常感谢!
答案 0 :(得分:2)
没有突发模式这样的东西。从全局到共享内存的最快内存复制只是通过线程来实现:
__global__ void mykernel(int *globaldata){
__shared__ int localdata[256];
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (threadIdx.x < 256)
localdata[threadIdx.x] = globaldata[idx];
__syncthreads();
(... rest of kernel code)
}
如果启动上面的内核,每个块至少有256个字节(内核中有很多块),那么你将获得良好的内存带宽和利用率。
CUDA C best practices guide有更多关于如何使用shared memory来有效加快各种操作的代码示例。