我遇到过一种情况,我需要提供一些数组作为全局函数的输入,我需要每个线程能够以这样的方式对数组执行操作,它们不会影响其他线程的方式数组的副本,我提供以下代码作为我想要实现的目标的一个例子。
__global__ void testLocalCopy(double *temper){
int threadIDx = threadIdx.x + blockDim.x * blockIdx.x;
// what I need is for each thread to set temper[3] to its id without affecting any other threads copy
// so thread id 0 will have a set its copy of temper[3] to 0 and thread id 3 will set it to 3 etc.
temper[3]=threadIDx;
printf("For thread %d the val in temper[3] is %lf \n",threadIDx,temper[3]);
}
只是为了重述,有没有一种方法可以让某个线程确定没有其他线程正在更新它的temper值[3]?
我最初认为我可以通过使用常量内存来解决这个问题,但由于常量内存是readonly,这不符合我的需求,
我正在使用cuda 4.0,请参阅下面的主要功能。
int main(){
double temper[4]={2.0,25.9999,55.3,66.6};
double *dev_temper;
int size=4;
cudaMalloc( (void**)&dev_temper, size * sizeof(double) );
cudaMemcpy( dev_temper, &temper, size * sizeof(double), cudaMemcpyHostToDevice );
testLocalCopy<<<2,2>>>(dev_temper);
cudaDeviceReset();
cudaFree(dev_temper);
}
提前致谢, 康纳
答案 0 :(得分:1)
在内核函数中,您可以将内存分配为
int temper_per_thread [4];
现在,每个线程都可以在内核中对此数组进行单独且唯一的访问,例如下面的代码将使用当前线程索引填充temper_per_thread
:
temper_per_thread [0] = threadIDx;
temper_per_thread [1] = threadIDx;
temper_per_thread [2] = threadIDx;
temper_per_thread [3] = threadIDx;
当然,如果您希望将所有这些特定于线程的阵列传输回CPU,则需要采用不同的方法。 1)分配更大部分的全局内存。 2)全局内存的这个较大部分的大小将是线程数乘以每个线程唯一的元素数。 3)索引数组写入,使每个线程始终写入全局内存中的唯一位置。 4)在内核完成后执行GPU到CPU memcpy。