ПРИМЕЧАНИЕ С выпуском версии 3.2 набора инструментов CUDA NVIDIA теперь включает в себя файл rules вместе с набором инструментов, а не SDK. Поэтому я разделил этот ответ на две половины, используя правильные инструкции для вашей версии Инструментария.
ПРИМЕЧАНИЕ Эти инструкции действительны для Visual Studio 2005 и 2008. Для Visual Studio 2010 см. этот ответ .
CUDA TOOLKIT 3.2 и более поздние версии
Я рекомендую использовать файл NvCudaRuntimeApi.rules
(или NvCudaDriverApi.rules
, если используется API драйвера), предоставляемый NVIDIA, он выпускается вместе с инструментарием и поддерживает новейшие флаги компилятора. Лично я бы посоветовал не использовать мастер VS, но только потому, что я действительно не думаю, что он вам нужен.
Файл правил (установлен в каталог Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults
) "учит" Visual Studio, как скомпилировать и связать любые файлы .cu в вашем проекте с вашим приложением.
- Создание нового проекта с использованием стандартных мастеров MS (например, пустой консольный проект)
- Реализация кода вашего хоста (последовательного) в файлах .c или .cpp
- Реализация ваших оболочек и ядер в .cu файлах
- Добавьте
NvCudaRuntimeApi.rules
(щелкните правой кнопкой мыши проект, Пользовательские правила сборки , поставьте галочку в соответствующем поле), см. Примечание 1
- Добавьте библиотеку времени выполнения CUDA (щелкните правой кнопкой мыши проект и выберите Свойства , затем в Линкер -> Общие добавьте
$(CUDA_PATH)\lib\$(PlatformName)
в Дополнительные каталоги библиотек а в Linker -> Input добавьте cudart.lib
к дополнительным зависимостям ), см. примечания [2] и [3]
- При желании добавьте включаемые файлы CUDA в путь поиска, что необходимо, если вы включаете какие-либо файлы CUDA в свои файлы .cpp (в отличие от файлов .cu) (щелкните правой кнопкой мыши проект и выберите Свойства , затем в C / C ++ -> General добавьте
$(CUDA_PATH)\include
в каталоги дополнительных включений ), см. примечание [3]
- Затем просто соберите свой проект, и файлы .cu будут скомпилированы в .obj и автоматически добавлены в ссылку
Некоторые другие советы:
- Измените генерацию кода, чтобы использовать статически загруженную среду выполнения C, чтобы она соответствовала среде выполнения CUDA; щелкните правой кнопкой мыши по проекту и выберите Свойства , затем в C / C ++ -> Генерация кода измените Runtime Library на / MT (или / MTd для отладки, в этом случае вам нужно будет отразить это в Runtime API -> Host -> Runtime Library ), см. примечание [4]
- Включить подсветку синтаксиса с помощью файла usertype.dat, включенного в SDK, см. Readme.txt в
<sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8
Я бы также рекомендовал включить поддержку Intellisense со следующей записью реестра (замените 9.0 на 8.0 для VS2005 вместо VS2008):
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++]
"NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl"
Между прочим, я бы рекомендовал избегать cutil , если это возможно, вместо этого бросить свою собственную проверку. Cutil не поддерживается NVIDIA, он просто используется для того, чтобы примеры в SDK были сфокусированы на реальной программе и структуре алгоритма и избегали повторения одного и того же в каждом примере (например, при разборе командной строки). Если вы напишите свой собственный, тогда у вас будет намного лучший контроль и вы будете знать, что происходит. Например, оболочка cutilSafeCall
вызывает exit()
в случае сбоя функции - реальное приложение (в отличие от образца), вероятно, должно обработать ошибку более элегантно!
CUDA TOOLKIT 3.1 и более ранние версии
Я бы использовал файл Cuda.rules
, предоставленный NVIDIA вместе с SDK, он выпускается вместе с инструментарием и поддерживает новейшие флаги компилятора. Лично я бы посоветовал не использовать мастер VS, но только потому, что я действительно не думаю, что он вам нужен.
Файл правил (в каталоге C \ common SDK) "учит" Visual Studio, как скомпилировать и связать любые файлы .cu в вашем проекте с вашим приложением.
- Создание нового проекта с использованием стандартных мастеров MS (например, пустой консольный проект)
- Реализация кода вашего хоста (последовательного) в файлах .c или .cpp
- Реализация ваших оболочек и ядер в .cu файлах
- Добавьте
Cuda.rules
(щелкните правой кнопкой мыши проект, Пользовательские правила сборки , найдите файл правил и убедитесь, что он отмечен галочкой)
- Добавьте библиотеку времени выполнения CUDA (щелкните проект правой кнопкой мыши и выберите Свойства , затем в Компоновщик -> Общие Добавьте
$(CUDA_LIB_PATH)
в Дополнительные каталоги библиотек и в Linker -> Input добавьте cudart.lib
к Дополнительные зависимости ), см. примечание [2] ниже
- При желании добавьте включаемые файлы CUDA в путь поиска, что необходимо, если вы включаете какие-либо файлы CUDA в свои файлы .cpp (в отличие от файлов .cu) (щелкните правой кнопкой мыши проект и выберите Свойства , затем в C / C ++ -> General добавьте
$(CUDA_INC_PATH)
в Дополнительные каталоги включения )
- Затем просто соберите свой проект и файлы .cu будут скомпилированы в .obj и автоматически добавлены в ссылку
Некоторые другие советы:
- Измените генерацию кода, чтобы использовать статически загруженную среду выполнения C, чтобы соответствовать среде выполнения CUDA, щелкните правой кнопкой мыши проект и выберите Свойства , затем в C / C ++ -> Генерация кода изменить Runtime Library в / MT (или / MTd для отладки, в этом случае вам нужно будет отразить это в Правиле сборки CUDA -> Параметры гибридной CUDA / C ++ ), см. примечание [ 4]
- Включить подсветку синтаксиса с помощью файла usertype.dat, включенного в SDK, см. Readme.txt в
<sdk_install_dir>\C\doc\syntax_highlighting\visual_studio_8
Я бы также рекомендовал включить поддержку Intellisense со следующей записью реестра (замените 9.0 на 8.0 для VS2005 вместо VS2008):
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++]
"NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl"
Между прочим, я бы рекомендовал избегать cutil , если это возможно, вместо этого бросить свою собственную проверку Cutil не поддерживается NVIDIA, он просто используется для того, чтобы примеры в SDK были сфокусированы на реальной программе и структуре алгоритма и избегали повторения одного и того же в каждом примере (например, при разборе командной строки). Если вы напишите свой собственный, тогда у вас будет намного лучший контроль и вы будете знать, что происходит. Например, оболочка cutilSafeCall
вызывает exit()
, если функция не работает - реальное приложение (в отличие от образца), вероятно, должно обрабатывать ошибку более элегантно!
Примечание
- Вы также можете использовать правила, относящиеся к версии инструментария, например, fule.
NvCudaRuntimeApi.v3.2.rules
. Это означает, что вместо поиска CUDA Toolkit в% CUDA_PATH% он будет выглядеть в% CUDA_PATH_V3_2%, что, в свою очередь, означает, что в вашей системе может быть установлено несколько версий CUDA Toolkit, и разные проекты могут предназначаться для разных версий. Смотрите также примечание [3].
- Файл правил не может изменять параметры компиляции и компоновщика C / C ++, поскольку он просто добавляет параметры компиляции для кода CUDA. Поэтому вам нужно сделать этот шаг вручную. Не забудьте сделать это для всех конфигураций!
- Если вы хотите стабилизироваться на определенной версии CUDA Toolkit, вам следует заменить CUDA_PATH на CUDA_PATH_V3_2. Смотрите также примечание 1 .
- Несоответствующая версия среды выполнения C может вызвать множество проблем; в частности, если у вас есть какие-либо ошибки в отношении LIBCMT (например,
LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs
) или многократно определенных символов для стандартных библиотечных функций, то это должно быть вашим первым подозрением.