Ответ 1
ПРИМЕЧАНИЕ С выпуском версии 3.2 инструментария CUDA, NVIDIA теперь включает файл правил с Toolkit, а не SDK. Поэтому я разделил этот ответ на две половины, используя правильные инструкции для вашей версии Toolkit.
ПРИМЕЧАНИЕ Эти инструкции действительны для 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 (щелкните правой кнопкой мыши по проекту и выберите "Свойства" , затем в Linker → "General" добавить
$(CUDA_PATH)\lib\$(PlatformName)
в дополнительные библиотеки и в Linker → Input addcudart.lib
к дополнительным зависимостям), см. примечания [2] и [3] - При необходимости добавьте файлы CUDA include к пути поиска, необходимые, если вы включаете любые файлы CUDA в ваши .cpp файлы (в отличие от файлов .cu) (щелкните правой кнопкой мыши по проекту и выберите "Свойства" , затем в C/С++ → Общие добавить
$(CUDA_PATH)\include
в дополнительные каталоги Include), см. Примечание [3] - Затем просто создайте проект и файлы .cu будут скомпилированы в .obj и автоматически добавлены в ссылку.
Некоторые другие советы:
- Измените генерацию кода, чтобы использовать статически загруженную среду выполнения C в соответствии с временем выполнения CUDA; щелкните правой кнопкой мыши по проекту и выберите "Свойства" , затем в C/С++ → "Генерация кода" измените библиотеку времени выполнения на /MT (или/MTd для отладки, и в этом случае вам нужно будет отобразить это в Runtime API → Host → Runtime Библиотека), см. Примечание [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\общем каталоге SDK) "учит" Visual Studio, как компилировать и связывать любые .cu файлы в вашем проекте в ваше приложение.
- Создайте новый проект с использованием стандартных мастеров MS (например, пустого проекта консоли)
- Реализовать ваш хост (последовательный) код в файлах .c или .cpp
- Внедрите свои оболочки и ядра в файлы .cu.
- Добавьте
Cuda.rules
(щелкните правой кнопкой мыши проект, пользовательские правила сборки, найдите файл правил и убедитесь, что он отмечен галочкой) - Добавьте библиотеку времени выполнения CUDA (щелкните правой кнопкой мыши по проекту и выберите "Свойства" , затем в Linker → "Общие" добавьте
$(CUDA_LIB_PATH)
в дополнительные библиотеки и в Linker → Input addcudart.lib
к дополнительным зависимостям), см. примечание [2] ниже - При необходимости добавьте файлы CUDA include к пути поиска, необходимые, если вы включаете любые файлы CUDA в ваши .cpp файлы (в отличие от файлов .cu) (щелкните правой кнопкой мыши по проекту и выберите "Свойства" , затем в C/С++ → Общие добавить
$(CUDA_INC_PATH)
в дополнительные каталоги включения) - Затем просто создайте проект и файлы .cu будут скомпилированы в .obj и автоматически добавлены в ссылку.
Некоторые другие советы:
- Измените генерацию кода, чтобы использовать статически загруженную среду выполнения C, чтобы соответствовать времени выполнения CUDA, щелкните правой кнопкой мыши проект и выберите "Свойства" , затем в C/С++ → "Генерация кода" измените библиотеку времени выполнения на /MT (или/MTd для отладки, в этом случае вам нужно будет отобразить это в CUDA Build Rule → Hybrid CUDA/С++ Options), см. примечание [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()
, если функция не работает - реальное приложение (в отличие от образца) должно, вероятно, обрабатывать отказ более элегантно!
Примечание
- Вы также можете использовать правила FLEF, специфичные для Toolkit.
NvCudaRuntimeApi.v3.2.rules
. Это означает, что вместо поиска CUDA Toolkit в% CUDA_PATH% он будет выглядеть в% CUDA_PATH_V3_2%, что, в свою очередь, означает, что вы можете иметь несколько версий CUDA Toolkit, установленных в вашей системе, и разные проекты могут ориентироваться на разные версии. См. Также примечание [3]. - Файл правил не может изменять настройки компиляции и компоновщика C/С++, поскольку он просто добавляет параметры компиляции для кода CUDA. Поэтому вам нужно сделать этот шаг вручную. Не забудьте сделать это для всех конфигураций!
- Если вы хотите стабилизировать определенную версию CUDA Toolkit, вы должны заменить CUDA_PATH на CUDA_PATH_V3_2. См. Также примечание 1.
- Наличие несоответствующей версии среды выполнения C может вызвать множество проблем; в частности, если у вас есть какие-либо ошибки в отношении LIBCMT (например,
LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs
) или многократно определенные символы для стандартных функций библиотеки, это должно быть вашим первым подозреваемым.