CUDA:使用多个线程访问全局内存

时间:2014-05-31 13:14:25

标签: arrays cuda global-variables

我遇到以下内核的问题(我用compute_30,sm_30编译了这个):

__global__ void kernel(){
// globalThreadID:
int tidX = threadIdx.x + blockIdx.x * blockDim.x;

bool* array;
if (tidX == 1) array = new bool[10]; // allocate global array for every thread?!

if (tidX < 10)
{
    array[tidX] = calculate something;
}


read the array.....

}

这里CUDA调试器有时会抱怨9次访问违规,我在访问数组时只得到零!!

有人知道为什么吗?

1 个答案:

答案 0 :(得分:1)

发生此错误是因为array是运行时堆中的线程范围 alococation。您只是为tidX = 1的线程分配它。 tidX = {0,2,3,4,5,6,7,8,9}的线程正在尝试取消引用未初始化的指针。显然,这将导致在运行时访问语音。

编辑:

如果您希望数组对同一块中的每个线程可见并可访问,则可以使用__shared__内存空间。如果希望数组对内核启动中的每个线程都可见,则必须将其作为参数传递给内核,或者在转换单元范围内将其声明为__device__内存。