Как мне получить NVVM IR (LLVM IR) из .cu-файла и как скомпилировать NVVM IR в бинарник?

У меня есть программа CUDA C/C++ для CUDA 7.5. И как известно: libNVVM Library — оптимизирующая библиотека компилятора, генерирующая PTX из NVVM IR.

Я могу получить PTX, используя: nvcc -ptx <file>.cu -o <file>.ptx

Но как я могу получить NVVM IR (LLVM IR) от <file>.cu?

И как мне скомпилировать NVVM IR (LLVM IR) или Optimized IR для целевой архитектуры?

Нужны ли мне для этого сторонние библиотеки или программы, такие как: libcuda.lang, ...?

введите здесь описание изображения

введите здесь описание изображения

Компилятор NVVM (основанный на LLVM) генерирует код PTX из NVVM IR.

Компиляторы NVVM IR и NVVM в основном не зависят от используемого исходного языка. Часть PTX codegen компилятора NVVM должна знать исходный язык из-за разницы в DCI (интерфейсе драйвера/компилятора).

С технической точки зрения, NVVM IR — это LLVM IR с набором правил, ограничений и соглашений, а также набором поддерживаемых встроенных функций. Программа, указанная в NVVM IR, всегда является допустимой программой LLVM. Легальная программа LLVM может не быть легальной программой NVVM.


person Alex    schedule 09.12.2015    source источник
comment
github.com/apc-llc/nvcc-llvm-ir   -  person talonmies    schedule 09.12.2015
comment
Привет, Алекс, не мог бы ты получить LLVM IR с clang++/llvm для кода CUDA? Я тоже задавался этим вопросом: clang++ -S -emit-llvm -o axpy -I<CUDA install path>/samples/common/inc -L<CUDA install path>/<lib64 or lib> axpy.cu -lcudart_static -lcuda -ldl -lrt -pthread!   -  person algoProg    schedule 13.10.2016


Ответы (1)


Очень короткий ответ заключается в том, что вы не можете этого сделать. Парсер NVIDIA является проприетарным и закрытым исходным кодом, и они не раскрывают генератор ИК-кода таким образом, чтобы его можно было использовать, как вы спрашиваете.

Тем не менее, вы не первый, кто задается этим вопросом, и вы можете найти полезную, но совершенно неофициальную и неподдерживаемую информацию здесь.

person Community    schedule 01.01.2016
comment
Спасибо! т.е. nvcc — это драйвер компилятора с закрытым исходным кодом. Но nvopencc — это .cu-parser, основанный на open64 и выпущенный под лицензией GPL, не так ли? habrastorage.org/files/553/c7e/300/ PDF: nvidia.com/object/io_1213955090354.html - person Alex; 02.01.2016
comment
@Alex: nvopencc - это не парсер/компилятор на основе LVMM, это устаревший компилятор первого поколения на основе open64, с которым изначально поставлялась CUDA. Это также напрямую излучает PTX. Текущий синтаксический анализатор на основе LVVM является проприетарным и закрытым исходным кодом и скрыт в libNVMM, без внешних API или документации, которые позволили бы получить доступ к испускаемому коду IR LVMM. - person talonmies; 02.01.2016
comment
Спасибо тебе за пояснение. Но если мы можем скомпилировать .cu-файлы без nvcc, используя clang+llvm: clang++ -o axpy -I<CUDA install path>/samples/common/inc -L<CUDA install path>/<lib64 or lib> axpy.cu -lcudart_static -lcuda -ldl -lrt -pthread, то можем ли мы получить llvm-ir, используя clang++ -S -emit-llvm -o axpy -I‹CUDA путь установки ›/samples/common/inc -L‹Путь установки CUDA›/‹lib64 или lib› axpy.cu -lcudart_static -lcuda -ldl -lrt -pthread? llvm.org/docs/CompileCudaWithLLVM.html - person Alex; 02.01.2016
comment
Вы читали ссылку, которую я вам дал? Да, clang++ может компилировать простой код CUDA, но синтаксический анализатор clang с открытым исходным кодом не может делать ничего похожего на оптимизацию, которую может выполнять синтаксический анализатор NVIDIA. Таким образом, вы можете получить некоторую форму IR, но насколько она хороша или насколько хорошо она скомпилируется в PTX, у меня нет опыта. - person talonmies; 02.01.2016