llvm 中对 CUDA 内存类型(例如共享、全局)的加载和存储操作的定义
Definitions for load and store operations on CUDA memory types (e.g. shared, global) in llvm
在LLVM源代码文件llvm/lib/Target/NVPTX/NVPTXIntrinsics.td
中,atom_add、atom_sub、atom_max、atom_min、atom_inc的定义, atom_dec等关于CUDA内存类型可以看出。但是我无法在这些文件的任何地方找到对 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)
中处理加载指令。
在LLVM源代码文件llvm/lib/Target/NVPTX/NVPTXIntrinsics.td
中,atom_add、atom_sub、atom_max、atom_min、atom_inc的定义, atom_dec等关于CUDA内存类型可以看出。但是我无法在这些文件的任何地方找到对 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)
中处理加载指令。