当我.reg
用来声明寄存器时......它们在哪里?
我的意思是:如果我.reg
在设备函数内部使用寄存器存储在每个线程拥有的寄存器文件中......但是如果我.reg
在全局范围内的模块中声明一个变量(不是.global
,只是全局范围)怎么办?
任何.reg
声明都会在 PTX 寄存器状态空间中结束。映射到硬件特性的方式由汇编器决定,但寄存器或本地内存的通常规则仍然适用。您应该知道,模块范围内的寄存器状态空间声明仅在 PTX 1.x 和 2.x 代码中受支持,并且不能与 CUDA ABI 一起使用。PTX 文档说明:
寄存器与其他状态空间的不同之处在于它们不是完全可寻址的,即不可能引用寄存器的地址。当编译使用应用程序二进制接口 (ABI) 时,寄存器变量被限制在函数范围内,并且不能在模块范围内声明。在编译包含模块范围的 .reg 变量的旧版 PTX 代码(3.0 之前的 ISA 版本)时,编译器会静默禁用 ABI。