在 llvm 中对 CUDA 内存类型(例如共享、全局)进行加载和存储操作的定义



>在 LLVM 源代码文件llvm/lib/Target/NVPTX/NVPTXIntrinsics.td中,可以看到 CUDA 内存类型上 atom_add、atom_sub、atom_max、atom_min、atom_inc、atom_dec等的定义。但是我无法在这些文件中的任何位置找到对 CUDA 内存的加载和存储操作。那么,在 llvm 中为 CUDA 内存类型定义加载和存储操作的位置是什么?

您不会将它们视为内部函数,因为没有用于加载和存储到 CUDA 内存层次结构的内部函数。NVPTX 使用加载或存储指令的指针操作数上的地址空间来确定应生成哪个 PTX 指令。

对指向address space 1的指针的加载将转换为ld.global.<type>,而在指向address space 3(共享内存)的指针上执行的加载将导致ld.shared.<type>指令。加载到通用指针,即address space 0中的指针将导致ld.<type>指令。

此转换在 NVPTX 后端的指令选择期间发生。查看./llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp以了解 NVPTX 中的指令选择是如何发生的。例如,在SDNode *NVPTXDAGToDAGISel::SelectLoad(SDNode *N)处理加载指令。

最新更新