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

时间:2016-02-29 12:41:30

标签: llvm intrinsics llvm-clang llvm-ir

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

中为CUDA内存类型定义了加载和存储操作的位置

1 个答案:

答案 0 :(得分:2)

您不会将它们视为内在函数,因为没有用于加载和存储到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)中处理加载指令。