【发布时间】:2022-11-23 09:43:04
【问题描述】:
寄存器的数量在 gpu 中是有限的,例如A100。每个线程不能使用超过 255 个寄存器。
但在我的测试中,即使不超过 255,编译器也会使用本地内存而不是寄存器。关于如何将我的数据保存在寄存器中以及何时将其保存在本地内存中,是否有更详细的指南?
我尝试在我的内核中定义一个本地数组。看起来数组 len 会影响编译器的操作。
template<int len>
global void test(){
// ...
float arr[len];
// ...
}
【问题讨论】:
-
为防止将本地内存用于数组,请改用共享内存或在循环之前使用“#pragma unpack”或手动展开循环或使用 Boost 预处理器取消循环代码。也许你可以重新设计你的算法,这样它就不需要本地数组,例如每个线程处理一个数组元素,而不是一个线程循环处理一个数组。
-
@Sebastian 是
#pragma unroll,不是“解包”。如果循环的长度在编译时可见,则 CUDA 编译器已经非常积极地展开,所以通常它不再有任何区别。 -
@Sebastian 是的,你是对的。其实我可以使用共享内存。但是我想使用寄存器来提高内核的性能(寄存器比共享内存快)。
-
@paleonix 你是对的,
unroll,对不起。我体验过当前编译器的代码,它不会自动展开,所以值得一试。也许阿尔文,你可以更详细一点,如何访问数组以提供更具体的建议,如何防止使用本地内存。
标签: cuda gpu-local-memory