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