Если я укажу NVCC -gencode arch=native, что мне использовать для аргумента code=?

Вопрос или проблема

Предположим, у меня есть машины с GPU с вычислительными возможностями XX и YY. Прочитав:

https://stackoverflow.com/a/35657430/1593077

Я знаю, что могу вызвать nvcc так:

nvcc \
    -o myapp \
    -gencode arch=compute_XX,code=sm_XX \
    myapp.cu

или так:

nvcc \
    -o myapp \
    -gencode arch=compute_XX,code=sm_XX \
    -gencode arch=compute_YY,code=sm_YY \
    myapp.cu

для обоих GPU. Но, предположим, я хочу использовать вариант arch=native, который мы получили несколько лет назад, вместо указания отдельных значений. Это должно быть проще и более понятно, но – похоже, у меня не получается:

$ nvcc -o myapp -gencode arch=native myapp.cu 
nvcc fatal   : Опция '--generate-code arch=native', отсутствует код
$ nvcc -o myapp -gencode arch=native,code=sm_89 myapp.cu 
nvcc fatal   : Неподдерживаемая архитектура gpu 'native'

Примечание: Использую версию NVCC CUDA 12.6.

На самом деле это проще, чем всё это. Используйте:

nvcc -o myapp -arch=native myapp.cu 

без аргумента -gencode.

Обратите внимание, что, как указано в Руководстве по программированию CUDA указывает:

Когда указано -arch=native, nvcc обнаруживает видимые GPU на системе и генерирует коды для них, программа PTX не будет сгенерирована для этой опции. Это предупреждение, если на системе нет видимых поддерживаемых GPU, и будет использована архитектура по умолчанию.

Ответ или решение

При использовании компилятора NVCC для генерации кода под ваши графические процессоры с опцией -arch=native, вам не нужно указывать аргумент code. Это становится возможным благодаря тому, что NVCC сам определяет аппаратные возможности, доступные на вашей системе, и автоматически создает код для них.

В вашем случае, для компиляции CUDA-программы, можно воспользоваться следующей командой:

nvcc -o myapp -arch=native myapp.cu

Это более простой подход, который позволяет избежать необходимости вручную указывать архитектуры и соответствующие коды. Ниже приводится более подробная информация о данном процессе:

  1. Автоматическое определение архитектуры: Используя параметр -arch=native, компилятор NVCC анализирует наличие всех видимых графических процессоров на вашей машине и создает код с учетом их вычислительных возможностей (Compute Capability). Это значит, что вам не нужно беспокоиться о том, какие архитектуры указать, так как компилятор это делает автоматически.

  2. Отсутствие PTX: При использовании -arch=native не будет генерироваться PTX (Parallel Thread Execution) код. Это значит, что конечный бинарный файл будет оптимизирован непосредственно для вашей аппаратной конфигурации. Это хорошее решение, если ваш код должен выполняться исключительно на машине, где он был скомпилирован.

  3. Предупреждения о поддержке: Если на вашей системе нет поддерживаемых графических процессоров, NVCC выдаст предупреждение и использует архитектуру по умолчанию. Это может помочь избежать неожиданных ошибок в процессе выполнения вашей программы.

  4. Актуальность документации: Убедитесь, что вы консультируетесь с последней документацией по CUDA, чтобы быть в курсе изменений и новых возможностей, которые могут быть представлены в актуальных версиях компилятора и платформы.

В заключение, использование -arch=native с NVCC предоставляет гибкий и удобный способ генерации кода, эффективно адаптированного под ваши текущие аппаратные возможности, без необходимости вручную указывать каждую из поддерживаемых архитектур.

Оцените материал
Добавить комментарий

Капча загружается...