每个CUDA线程的本地内存



下面有一个简单的程序。我的问题是";temp";实际存储?它是全局内存还是本地内存?我需要每个idx的数组临时,这样每个线程都有单独的数组临时。在这种情况下,它工作正常。但在我的实际程序中,当我试图从test2填充temp[0]时,它使程序停止。假设我们有1024个线程,那么它只运行大约200个线程的内核。所以,我想知道temp是否是共享的。如果是的话,也许那里发生了碰撞。我也没有收到任何错误消息。请有人解释一下。

__device__ void test2(int temp[], int idx) {
temp[0] = idx;
printf("%d ", temp[0]);
}
__global__ void test() {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
int *temp = (int *) malloc(100 * sizeof (int));
test2(temp, idx);
}
int main() {
test << <1, 1024 >> >();
return 0;
}

我的问题是"temp";实际存储?

temp的分配存储在一个称为设备堆的地方。它是一种全局记忆。然而,temp变量本身(即指针值(在本地内存中,其他线程不共享或不可见。

我需要每个idx的数组温度,这样每个线程都有单独的数组温度。

您会得到的,但需注意以下事项。每个线程都有自己的单独数组,由其局部变量temp引用。每个线程在设备堆上都有一个单独的存储分配。

人们通常对内核内的newmalloc有问题。其中一个主要原因是设备堆最初被限制为8MB,跨越所有的设备堆分配。因此,如果有足够多的线程执行足够的分配请求的newmalloc,那么空间就会用完。

当空间不足时,API发出信号的方式是返回分配的零指针值(NULL指针(。如果您尝试使用这个NULL指针,您将遇到问题。

出于调试目的(即证明这一点正在发生(,在使用指针之前测试指针是否为NULL(即== 0(。如果指针为NULL,则不要使用它(可能会打印错误消息(。

您可以在文档中或SOcuda标签上的许多问题中阅读更多关于此的信息。如果您阅读了这些源中的任何一个,您会发现您可以增加设备堆的大小。

最新更新