我对以下内核有问题(我使用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
是一个螺纹范围在运行时堆aloocation。您仅使用为其分配线程tidX = 1
。具有的线程tidX = {0,2,3,4,5,6,7,8,9}
正试图取消引用未初始化的指针。显然,这将导致运行时访问失败。
编辑:
如果希望该数组对同一块中的每个线程可见并且可访问,则可以使用__shared__
内存空间。如果希望数组对内核启动中的每个线程可见,则必须将其作为参数传递给内核,或者__device__
在转换单元范围内将其声明为内存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句