在内核中设置固定大小的数组时,例如:
int my_array[100];
阵列最终在哪个存储空间?
特别是,我想知道这样的数组是否可以存储在> = 2.0设备上的寄存器文件或共享内存中,如果是,那么要求是什么。
答案 0 :(得分:8)
对于Fermi(可能还有早期的架构),要将数组存储在寄存器文件中,必须满足以下条件:
(1)的原因是寄存器索引直接在SASS指令中编码。没有办法间接地处理寄存器。
限制(2)寄存器数量的主要因素是:
(1)的潜在解决方法是循环展开。如果循环使用循环计数器作为数组的索引,则展开循环(使用#pragma unroll
或手动)会导致数组索引成为常量,因为现在每个数组访问都有一个单独的SASS指令。
部分基于此NVIDIA演示文稿:Local Memory and Register Spilling。该文档还详细介绍了变量和数组的位置如何影响性能。
答案 1 :(得分:3)
如果没有足够的寄存器,内核中的本地数组(如已定义的数组)将分配在寄存器和本地存储器中。
如果要在共享内存中分配数组,则必须按如下方式指定:
__shared__ int my_array[100];