-1

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

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

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

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

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

任何具有相关代码或功能的解决方案都将不胜感激!

4

1 回答 1

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最佳实践指南有更多关于如何使用共享内存来有效加速各种操作的代码示例。

于 2013-02-28T00:04:48.330 回答