Как добавить более одного кода CUDA с использованием современного CMAKE (для каждой цели)? - PullRequest
0 голосов
/ 03 февраля 2019

Я не могу заставить современный cmake (для каждой цели) установить более чем один флаг CUDA gencode.

Пример CMake:

target_compile_options(myHeaderLib INTERFACE                        
                        $<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_50,code=sm_50>
                        $<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_52,code=sm_52>
                        $<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_53,code=sm_53>
                        $<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_60,code=sm_60>
                        $<$<COMPILE_LANGUAGE:CUDA>:-gencode arch=compute_62,code=sm_62>
                        )

Это будетвыходные данные:

... -gencode arch=compute_50,code=sm_50 arch=compute_52,code=sm_52 arch=compute_53,code=sm_53

Но необходимо следующее:

... -gencode arch=compute_50,code=sm_50  -gencode arch=compute_52,code=sm_52  -gencode arch=compute_53,code=sm_53 ...

И НЕТ просто настроек $ {CUDA_NVCC_FLAGS} не является надежным решением (это не таксовременный CMAKE должен быть сделан).

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Я знаю, что это было давно.Но недавно я подал вопрос, и оказалось, что генераторы также могут работать отлично.Хитрость комбинирования «SHELL:» с генераторами заключается в том, чтобы заключить в генераторы двойные кавычки.

Вот ссылка , в которой сопровождающий cmake указывает на мою ошибку.Надеюсь, что это поможет другим в будущем.

target_compile_options(foo PRIVATE
  "$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-gencode arch=compute_60,code=sm_60>"
  )
target_compile_options(foo PRIVATE
  "$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-gencode arch=compute_52,code=sm_52 -gencode arch=compute_50,code=sm_50>"
  )
0 голосов
/ 03 февраля 2019

Это из-за стратегии CMake " de-duplication " для параметров компиляции.

С помощью target_compile_options вы создаете правильный список параметров

-gencode arch=compute_50,code=sm_50  -gencode arch=compute_52,code=sm_52 ...

, ноCMake удаляет все -gencode, кроме первого:

-gencode arch=compute_50,code=sm_50 arch=compute_52,code=sm_52 ...

отчет об ошибках о необходимости отключить "дедупликацию" CMake в некоторых случаях, и он был решен в 3.12 версия путем добавления SHELL: конструкции.

Начиная с CMake 3.12, это должно работать:

target_compile_options(myHeaderLib INTERFACE
   "SHELL:-gencode arch=compute_50,code=sm_50"
   "SHELL:-gencode arch=compute_52,code=sm_52"
)

Как SHELL: работает

Во-первых, размещение комбинированных опций в двойных кавычках не позволяет CMake «дедуплицировать» общие опции: CMake видит разные строки

-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52

и не считает их дублированными.

Затемконструкция SHELL объясняет CMake, что строку внутри заданных двойных кавычек необходимо разделить на отдельные параметры командной строки.Но это разбиение выполняется после этапа «дедупликации», поэтому повторяющиеся -gencode из разных SHELL: строк не удаляются.

...