CUDA __global__ 函数中内核参数的内存 space

Memory space of kernel arguments in CUDA __global__ function

在如下所示的 CUDA 函数中:

__global__ void Kernel(int value) {
    value += 1;
    ...
}

void Host() {
    Kernel<<<10, 10>>>(123);
}

value 的内存 space 是在 Kernel 设备(全局)、共享还是本地?

如果一个线程修改它,该修改是否对其他线程可见?还是变量位于每个线程的堆栈上,就像函数内部定义的变量一样?

Is the memory space of value inside Kernel device (global), shared, or local?

它在逻辑本地space。作为内核启动过程的一部分,内核参数从特定的 __constant__ 内存库开始。然而对于大多数实际使用,参数将首先被复制到一个线程局部寄存器,它是逻辑局部space的一部分。即使对于不是 LD 但可以引用 __constant__ 内存的 SASS 指令,使用也是有效的本地的、每线程的,就像寄存器是本地的、每线程的一样。

If one thread modifies it, will that modification become visible to other threads?

一个线程中的修改对其他线程不可见。如果您修改它,将(首先)对其在线程局部寄存器中的值执行修改。

Or is the variable located on the stack of each thread, as with variables defined inside the function?

堆栈在线程的逻辑局部space中,所以我不确定这个问题的目的是什么。一个线程的堆栈不与另一个线程共享。根据我的经验,这样一个变量出现在堆栈上的唯一方法是,如果它被用作函数调用过程的一部分(即不是线程本身,因为它最初是由内核启动过程产生的,而是来自那个线程)。

此外,在函数内部定义的变量(例如局部变量)也不一定会出现在堆栈中。这主要是编译器决策的函数。它们可能在寄存器中,它们可能出现(例如由于溢出)在实际设备内存中(但仍在逻辑本地 space 中)或者它们可能在堆栈中,在某些时候,可能作为函数调用。

这应该可以使用 CUDA binary utilities 进行大部分验证。