每个 CUDA 线程的本地内存

Local memory for each CUDA thread

下面我有一个简单的程序。我的问题是“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;
}

My question is that where is "temp" actually stored?

temp 的分配存储在称为设备堆的位置。它是全局记忆的一种形式。但是 temp 变量本身(即指针值)在本地内存中 - 其他线程不共享或不可见。

I need array temp for each idx so that every thread has individual array temp.

你会明白的,但要遵守下面的警告。每个线程都有自己单独的数组,由其局部变量 temp 引用。每个线程都将在设备堆上单独分配存储空间。

人们通常在使用内核 newmalloc 时遇到问题。主要原因之一是设备堆最初限制为 8MB,跨越 all 设备堆分配。因此,如果有足够多的线程执行 newmalloc 的足够分配请求,您将从 space.

中得到 运行

当你从 space 中 运行 时,API 发出信号的方式是 return 用于分配的零指针值(NULL 指针)。如果您随后尝试使用此 NULL 指针,您将遇到麻烦。

出于调试目的(即证明这种情况正在发生),请在使用前测试指针是否为 NULL(即 == 0)。如果它是 NULL,则不要使用它(也许打印一条错误消息)。

您可以在 documentation 或 SO cuda 标签上的许多问题中阅读更多相关信息。如果您阅读这些来源中的任何一个,您会发现可以增加设备堆的大小。