cuda线程是否可以拥有参数的本地/私有副本,该副本可以在不影响其他线程的情况下进行更新

cuda线程是否可以拥有参数的本地/私有副本,该副本可以在不影响其他线程的情况下进行更新,cuda,Cuda,我遇到了这样一种情况,即我需要提供大量数组作为全局函数的输入,我需要每个线程能够以这样一种方式在数组上执行操作,即它们不会影响其他线程复制数组的方式,我提供以下代码作为我试图实现的示例 __global__ void testLocalCopy(double *temper){ int threadIDx = threadIdx.x + blockDim.x * blockIdx.x; // what I need is for each thread to set t

我遇到了这样一种情况,即我需要提供大量数组作为全局函数的输入,我需要每个线程能够以这样一种方式在数组上执行操作,即它们不会影响其他线程复制数组的方式,我提供以下代码作为我试图实现的示例

__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]);

}
重申一下,有没有一种方法可以让给定的线程确定没有其他线程正在更新其回火值[3]

我最初认为我可以通过使用常量内存来解决这个问题,但由于常量内存是只读的,这并不能满足我的需要

我正在使用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);

}
intmain(){
双回火[4]={2.0,25.9999,55.3,66.6};
双重德福脾气;
int size=4;
Cudamaloc((空心**)和偏差回火,尺寸*尺寸(双);
cudaMemcpy(偏差状态和状态,尺寸*尺寸(双精度),cudaMemcpyHostToDevice);
testLocalCopy(开发环境);
cudaDeviceReset();
cudaFree(dev_-tempere);
}
提前感谢,,
Connor

在内核函数中,您可以根据需要分配内存

int回火每螺纹[4]

现在,每个线程都将在内核中单独且唯一地访问此数组,例如,下面的代码将使用当前线程索引填充
template\u per\u thread

回火每螺纹[0]=螺纹IDX

回火每螺纹[1]=螺纹IDX

回火每螺纹[2]=螺纹IDX

回火每螺纹[3]=螺纹IDX


当然,如果您希望将所有这些特定于线程的阵列传输回CPU,您将需要一种不同的方法。1) 分配更大部分的全局内存。2) 全局内存的较大部分的大小是线程数乘以每个线程唯一的元素数。3) 对数组写入进行索引,使每个线程始终写入全局内存中的唯一位置。4) 在内核完成后,对CPU memcpy执行GPU操作。

您有大量内存,可以使用一维(y维)的2D数组,该数组等于线程数?我可以问一下,您为什么需要这个吗?我正在尝试加速的程序将4个参数作为参数,每个参数包含3600个双参数,它使用这些参数和其他参数来计算结果,如果每个线程都有一个本地副本,我想我可能可以减少我必须的cudamalloc和cudamemcpu的值,我确实让malloc在内核中工作,并且可以从参数中记下值,我会继续工作并让您知道,什么最适合我。我知道至少有一个方面的问题我正在工作,我将不得不使用二维数组,谢天谢地MCPy/malloc在内核中可能是非常低效的在绝大多数情况下!为了避免过早的优化,我建议在内核启动之前通过cudamalloc从CPU中存储所有数据。在此之后,分析结果,然后查看每个线程是否更适合管理阵列的本地副本。谢谢,我现在正在线程中使用malloc和memcpy,如果我能达到所需的加速,我会让您知道,谢谢您花时间回答