Как я должен заставить CMake также создавать файлы PTX для моих ядер - PullRequest
0 голосов
/ 05 мая 2019

Я строю проект с кодом CUDA, используя последний CMake, который имеет встроенную поддержку CUDA (версия> = 3.8 или более поздняя версия, если необходимо).

Как я могу сказать CMake (также) генерировать файлы PTX для моих различных ядер?

Что-то, что я пробовал, что не работает (?):

Начиная с CMake 3.9, мы можем определить библиотеку объектов, которая будет иметь PTX, а не виды объектов, используя свойство CUDA_PTX_COMPILATION :

add_library(myptx OBJECT a.cu b.cu)
set_property(TARGET myptx PROPERTY CUDA_PTX_COMPILATION ON)

Однако это не правильное решение проблемы - чего-то не хватает. Предположим, мы имеем в a.cu:

__global__ void foo() { return; }

и b.cu:

__global__ void bar(int* a) { *a = 5; }

и мы запускаем cmake и make со следующим CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)
add_library(myptx OBJECT a.cu b.cu)
set_property(TARGET myptx PROPERTY CUDA_PTX_COMPILATION ON)

файлы PTX не генерируются и nvcc не запускается. Не знаю почему.

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Попробуйте включить язык CUDA.

cmake_minimum_required(VERSION 3.9)
enable_language(CUDA)
add_library(myptx OBJECT a.cu b.cu)
set_property(TARGET myptx PROPERTY CUDA_PTX_COMPILATION ON)

PTX расположены в ${CMAKE_BINARY_DIR}/CMakeFiles/myptx.dir

1 голос
/ 05 мая 2019

Вы можете передать параметр командной строки --keep в nvcc, что позволит хранить все промежуточные файлы в том же каталоге, который используется для других выходных данных. В более новых версиях CMake вы должны написать:

target_compile_options(
    some_target
    another_target
    yet_another_target_etc
    PRIVATE 
    "--keep"
)

и это должно сделать это. Кажется, .ptx заканчивается там, где находится бинарный файл. Но обратите внимание, что вы также получите миллиард других файлов: .cpp4.ii, .cudafe1.c, .cudafe1.cpp, .fatbin и так далее. Так что, хотя это работает, это не очень хорошее решение.

...