嘿, 我有两个2000的数组。我想编写一个内核将一个数组复制到另一个数组。该阵列代表1000个粒子。索引0-999将包含一个x值和1000-1999位置的y值。CUDA - 指定<<<x,y> >> for for循环
我需要一个for循环来复制从1个数组到另一个数组的N
粒子。例如:
int halfway = 1000;
for(int i = 0; i < N; i++){
array1[i] = array2[i];
array1[halfway + i] = array[halfway + i];
}
由于N的数量始终小于2000,我可以创建2000个线程吗?或者我必须创建几个块。
我在想这样一个内核中:
int tid = threadIdx.x;
if (tid >= N) return;
array1[tid] = array2[tid];
array1[halfway + tid] = array2[halfway + tid];
,并调用它,如下所示:
kernel<<<1,2000>>>(...);
将这项工作?它会很快吗?或者我会更好地将问题分解成块。我不知道如何做到这一点,也许(这是正确的?)
int tid = blockDim.x*blockIdx.x + threadIdx.x;
if (tid >= N) return;
array1[tid] = array2[tid];
array1[halfway + tid] = array2[halfway + tid];
kernel<<<4,256>>>(...);
我正在尝试的东西出来,它只是需要接近10分钟我的程序运行。当然,我认为'cudaMemcpy'就够了。你是说我的多块解决方案可以像现在这样工作,或者我需要一个带有'blockDim.x'增量的for循环? 4是块数的明智选择?干杯 – user660414 2011-03-15 16:29:09
我还补充说,由于在主机和设备之间移动数据的速度有多慢,因此需要大量的计算才能使GPU的性价比更高。在这种情况下,如果内核比CPU上的简单for循环更快,我会感到惊讶。 如果你正在用这些设备内存粒子阵列进行其他计算,我希望是这种情况,那么值得的是什么:) – tugudum 2011-03-15 16:31:10
@ user660414您需要循环以支持大于4 * 256的数组。 – tugudum 2011-03-15 16:35:23