我需要通过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];
}
}
这是非常低效的,因为对于某些idx,[start,end]区域非常大,这使得该线程发出太多的复制命令。有没有办法有效地实施它?
谢谢,
郑
答案 0 :(得分:1)
你写它的方式,我猜每个线程都试图将整个'start'写成'end'块。这真的真的效率低下。
你需要做这样的事情。
___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];
}
}
答案 1 :(得分:0)
尝试使用:
CUresult cuMemcpyDtoD(
CUdeviceptr dst,
CUdeviceptr src,
unsigned int bytes
)
更新:
你是对的:http://forums.nvidia.com/index.php?showtopic=88745
没有有效的方法可以正确地执行此操作,因为CUDA的设计要求您只在内核中使用少量数据。