Arrays CUDA:使用多线程访问全局内存
我对以下内核有一个问题(我用compute\u 30、sm\u 30编译了这个):Arrays CUDA:使用多线程访问全局内存,arrays,cuda,global-variables,Arrays,Cuda,Global Variables,我对以下内核有一个问题(我用compute\u 30、sm\u 30编译了这个): \uuuu全局\uuuuu无效内核(){ //全局线程ID: int tidX=threadIdx.x+blockIdx.x*blockDim.x; 布尔*数组; if(tidX==1)array=newbool[10];//为每个线程分配全局数组?! 如果(tidX
\uuuu全局\uuuuu无效内核(){
//全局线程ID:
int tidX=threadIdx.x+blockIdx.x*blockDim.x;
布尔*数组;
if(tidX==1)array=newbool[10];//为每个线程分配全局数组?!
如果(tidX<10)
{
数组[tidX]=计算某物;
}
读取数组。。。。。
}
在这里,CUDA调试器有时会抱怨9次访问冲突,而我在访问阵列时只得到零
有人知道为什么吗?发生错误是因为
array
是运行时堆中的线程作用域位置。您仅将其分配给tidX=1
的线程。具有tidX={0,2,3,4,5,6,7,8,9}
的线程正在尝试取消对未初始化指针的引用。显然,这将导致运行时出现访问错误
编辑:
如果希望阵列对同一块中的每个线程都可见并可访问,可以使用
\uuuuu共享\uuuu
内存空间。如果希望数组对内核启动中的每个线程都可见,则必须将其作为参数传递给内核,或者在转换单元范围内将其声明为\uuuu设备\uuuuu
内存。好,我看到问题了。。。。但是我如何使这个数组对每个线程都可访问(而不声明线程数?@user3694255:如果这回答了您的问题,请接受此选项,以便将其从未回答的问题队列中删除,并在下一个问题出现的人的搜索结果中更为可见。您可以将其改为\uuuuuuuuuuuuuuuuuuuuuuuuuuu共享
变量。
__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.....
}