我遇到以下内核的问题(我用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次访问违规,我在访问数组时只得到零!!
有人知道为什么吗?
答案 0 :(得分:1)
发生此错误是因为array
是运行时堆中的线程范围 alococation。您只是为tidX = 1
的线程分配它。 tidX = {0,2,3,4,5,6,7,8,9}
的线程正在尝试取消引用未初始化的指针。显然,这将导致在运行时访问语音。
编辑:
如果您希望数组对同一块中的每个线程可见并可访问,则可以使用__shared__
内存空间。如果希望数组对内核启动中的每个线程都可见,则必须将其作为参数传递给内核,或者在转换单元范围内将其声明为__device__
内存。