通过CUDA线程复制全局内存

通过CUDA线程复制全局内存,cuda,gpgpu,Cuda,Gpgpu,我需要通过CUDA线程(不是从主机)将全局内存中的一个数组复制到全局内存中的另一个数组 我的代码如下: __global__ void copy_kernel(int *g_data1, int *g_data2, int n) { int idx = blockIdx.x * blockDim.x + threadIdx.x; int start, end; start = some_func(idx); end = another_func(idx); unsigned

我需要通过CUDA线程(不是从主机)将全局内存中的一个数组复制到全局内存中的另一个数组

我的代码如下:

__global__ void copy_kernel(int *g_data1, int *g_data2, int n)
{
  int idx = blockIdx.x * blockDim.x + threadIdx.x;
  int start, end;
  start = some_func(idx);
  end = another_func(idx);
  unsigned int i;
  for (i = start; i < end; i++) {
      g_data2[i] = g_data1[idx];
  }
}
\uuuuu全局\uuuuu无效复制\u内核(int*g\u数据1,int*g\u数据2,int n)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;
int开始,结束;
开始=一些函数(idx);
end=另一个函数(idx);
无符号整数i;
for(i=start;i
这是非常低效的,因为对于某些idx,[start,end]区域非常大,这使得该线程发出太多复制命令。有没有办法有效地实施它

谢谢,

尝试使用以下方法:

CUresult cuMemcpyDtoD(
    CUdeviceptr dst,
    CUdeviceptr src,
    unsigned int bytes   
)   
更新:

你说得对:


没有有效的方法可以正确地做到这一点,因为CUDA的设计希望您只使用内核中的少量数据。

按照您编写的方式,我猜每个线程都在尝试将整个“开始”块写入“结束”块。这是非常低效的

你需要这样做

___shared___ unsigned sm_start[BLOCK_SIZE];
___shared___ unsigned sm_end[BLOCK_SIZE];
sm_start[threadIdx.x] = start;
sm_end[threadIdx.y] = end;
__syncthreads();
for (int n = 0; n < blockdDim.x; n++) {
g_data2 += sm_start[n];
unsigned lim = sm_end[n] - sm_start[n];
  for (int i = threadIdx.x; i < lim; i += blockDim.x) {
      g_data2[i] = g_data1[idx];
  }
}
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
___共享\uuuuuuu无符号sm\u结束[块大小];
sm_start[threadIdx.x]=开始;
sm_end[threadIdx.y]=end;
__同步线程();
对于(int n=0;n与QBA的答案相同:这个函数只能从主机函数调用,而不是从一个yxGualLuxy函数调用。因此,基于英伟达论坛线程,看起来最好的方法是让你的线程与你的设备可以正常操作的最大数据类型一起工作(这样每个迭代只产生一个拷贝指令),最佳线程数必须根据经验确定,因为它取决于设备的内存结构。