所有线程在 CUDA 中使用相同数量的寄存器吗?

Do all threads use the same number of registers in CUDA?

if (threadIdx.x < 128) {
  float reg[32];
  // do something with reg...
} else {
  return;
}

假设每个块有 256 个线程,但只有一半线程在使用寄存器,另一半在做其他事情(在本例中什么都不做)。我的问题是,这个线程块将使用多少个寄存器(仅考虑 reg)? 32 * 256 或 32 * 128 ?

所有线程使用相同数量的寄存器。

这是一个compile-time决定,这个决定与运行时行为无关,编译器决定了网格中所有线程的寄存器使用(即内核启动),它不是以任何方式决定的每个线程。在运行时,必须为每个线程分配必要数量的寄存器,无论它们是否“使用”它们。参见

您的问题的答案是,无论线程“做什么”,每个块的寄存器数等于每个线程的寄存器数(在编译时确定)乘以每个块的线程数。

因此在您的示例中,它可能是 32*256,而不是 32*128