CUDA:哪个内存空间是固定大小的数组存储?

Rog*_*ahl 6 arrays cuda

在内核中设置固定大小的数组时,例如:

int my_array[100];
Run Code Online (Sandbox Code Playgroud)

阵列最终在哪个内存空间?

特别是,我想知道这样的数组是否可以存储在> = 2.0设备的寄存器文件或共享存储器中,如果是,那么要求是什么.

Rog*_*ahl 8

对于Fermi(可能还有早期架构),要将数组存储在寄存器文件中,必须满足以下条件:

  1. 该数组仅使用常量索引
  2. 有寄存器可用
  3. 希望编译器还进行一些分析以确定对整体性能的影响

(1)的原因是寄存器索引直接在SASS指令内编码.没有办法间接地处理寄存器.

限制(2)寄存器数量的主要因素是:

  • SASS指令仅包含6位寄存器索引,它将内核中可以使用的寄存器数量限制为64.实际数量为63,因此保留了一些.
  • SM具有一个寄存器块,这些寄存器由同时在线的所有线程共享.
  • 保存变量也需要寄存器,因此编译器必须平衡寄存器使用情况以获得最佳整体性能.

(1)的潜在解决方法是循环展开.如果循环使用循环计数器作为数组的索引,则展开循环(使用#pragma unroll或手动)会导致数组索引成为常量,因为现在每个数组访问都有一个单独的SASS指令.

部分基于此NVIDIA演示文稿:本地内存和寄存器溢出.该文档还详细介绍了变量和数组的位置如何影响性能.