В файле исходного кода LLVM llvm/lib/Target/NVPTX/NVPTXIntrinsics.td
определения для atom_add, atom_sub, atom_max, atom_min, atom_inc, atom_dec и т. Д. Типов памяти CUDA могут быть видел. Но я не смог найти загрузку и хранить операции с памятью CUDA в любом месте этих файлов. Итак, где операции загрузки и хранения определены для типов памяти CUDA в llvm?Определения для операций загрузки и хранения в типах памяти CUDA (например, общий, глобальный) в llvm
ответ
Вы не найдете их как внутренне, потому что для загрузки и хранения в иерархии памяти 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)
.