所有线程在 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
。
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
。