以突发模式读取cuda数据

时间:2013-02-27 22:06:34

标签: c++ c cuda gpu gpu-programming

我目前的CUDA代码执行速度比CPU代码慢约3-4倍。

我删除了所有无关的CPU / GPU传输,因此大部分计算都是在GPU上完成的,只有最终结果才会传回CPU内存。

为了加快速度,我做了一些阅读,并发现由于GPU内存总线要慢得多,访问GPU设备内存也很慢。而且,由于我的计算使用大型数组 - 因此使用大量内存访问 - 即使我将threadsPerBlock设置为1024的最大值,这也会减慢速度。

我想我现在唯一的选择就是将数据块复制到每个块操作的MP共享内存中,然后在该内存上进行计算。

我想知道如何以突发模式将一大块内存最有效地复制到共享内存中。我应该通过复制每个warp中的起始线程索引吗?

任何具有相关代码或功能的解决方案都将非常感谢!

1 个答案:

答案 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来有效加快各种操作的代码示例。