Как начать новый проект CUDA в Visual Studio 2008? - PullRequest
27 голосов
/ 12 января 2010

Это невероятно простой вопрос, но как мне начать новый проект CUDA в Visual Studio 2008? Я нашел тонны документации по вопросам, связанным с CUDA, но ничего о том, как начать новый проект. Я работаю с Windows 7 x64 Visual Studio 2008 C ++. Мне бы очень хотелось найти какое-то действительно простое приложение Hello World, чтобы просто скомпилировать и запустить базовую программу.

Edit:

Я попробовал твои шаги, Том. Я установил консольное приложение. Затем я удалил .cpp по умолчанию, который он вставил, и скопировал три файла из шаблона проекта, чтобы было что скомпилировать. Когда я компилировал это, template_gold.cpp жаловался на отсутствие stdafx.h, поэтому я включил это. Теперь сборка завершается с этим:

1>------ Build started: Project: CUDASandbox, Configuration: Debug x64 ------
1>Compiling...
1>template_gold.cpp
1>Linking...
1>LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup
1>D:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\x64\Debug\CUDASandbox.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://d:\Stuff\Programming\Visual Studio 2008\Projects\CUDASandbox\CUDASandbox\x64\Debug\BuildLog.htm"
1>CUDASandbox - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Ответы [ 4 ]

45 голосов
/ 12 января 2010

ПРИМЕЧАНИЕ С выпуском версии 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(), если функция не работает - реальное приложение (в отличие от образца), вероятно, должно обрабатывать ошибку более элегантно!


Примечание

  1. Вы также можете использовать правила, относящиеся к версии инструментария, например, fule. NvCudaRuntimeApi.v3.2.rules. Это означает, что вместо поиска CUDA Toolkit в% CUDA_PATH% он будет выглядеть в% CUDA_PATH_V3_2%, что, в свою очередь, означает, что в вашей системе может быть установлено несколько версий CUDA Toolkit, и разные проекты могут предназначаться для разных версий. Смотрите также примечание [3].
  2. Файл правил не может изменять параметры компиляции и компоновщика C / C ++, поскольку он просто добавляет параметры компиляции для кода CUDA. Поэтому вам нужно сделать этот шаг вручную. Не забудьте сделать это для всех конфигураций!
  3. Если вы хотите стабилизироваться на определенной версии CUDA Toolkit, вам следует заменить CUDA_PATH на CUDA_PATH_V3_2. Смотрите также примечание 1 .
  4. Несоответствующая версия среды выполнения C может вызвать множество проблем; в частности, если у вас есть какие-либо ошибки в отношении LIBCMT (например, LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs) или многократно определенных символов для стандартных библиотечных функций, то это должно быть вашим первым подозрением.
4 голосов
/ 06 мая 2011

Какой замечательный вопрос !! Для всей документации CUDA, это то, что я всегда считал очевидным упущением ... На самом деле, я очень рад, что нашел этот пост, потому что после использования CUDA в течение довольно долгого времени, я все еще не имел Не нашел официального, правильного способа заставить VS производить программу CUDA с нуля.

Когда мне нужно было запустить новую программу CUDA, я всегда просто копировал и изменял пример " template " из каталога SDK. Это может быть не совсем то, что вы ищете, потому что он не запускается заново, но - это быстрый способ заставить проект с поддержкой CUDA работать в VS со всеми правильными именами проектов / файлов ...

  1. Сделайте копию примера " template " из SDK и переименуйте каталог - единственное необходимое содержимое в каталоге - это исходный код и VS .sln и. файлы vcproj
  2. Переименование файлов .sln и .vcproj
  3. Откройте файл .sln в текстовом редакторе и переименуйте переменную Project и .vcproj имя файла в 3-й строке файла
  4. Откройте файл .vcproj в текстовом редакторе и переименуйте переменные Name и RootNamespace в первых нескольких строках файла
  5. Откройте проект с помощью VS и откройте страницы свойств (щелкните правой кнопкой мыши имя проекта на панели обозревателя решений, выберите «Свойства»)
  6. Измените имя выходного файла на страницах свойств (в разделе Свойства конфигурации -> Компоновщик -> Общие) ... Прежде чем изменить имя файла, я выбираю «Все конфигурации» из раскрывающегося меню «Конфигурация» и «x64» из раскрывающегося меню «Платформа», поскольку я работаю в 64-разрядной системе
  7. Измените Файл базы данных программы на страницах свойств (в разделе Свойства конфигурации -> Компоновщик -> Отладка) ... Прежде чем изменить имя файла, я выбираю "Отладка" и "x64" в раскрывающихся списках.
3 голосов
/ 05 августа 2010

Возможно, вы захотите взглянуть на это руководство: http://www.programmerfish.com/how-to-run-cuda-on-visual-studio-2008-vs08/

3 голосов
/ 12 января 2010
  • Установите мастер CUDA VS. Он настроит VS и добавит CUDA Project в меню «новый проект».
  • Убедитесь, что у вас установлен компилятор x64 (необходимо проверить во время установки VS).
  • Проверьте, есть ли у вас x64 libs, includes, nvcc dir и в пути поиска.
  • Создание нового проекта с использованием шаблона CUDA.
  • Измените тип проекта на x64 и настройку CUDA на Native (если у вас есть карта с поддержкой nv cuda) или эмулируйте иначе.
  • Шаблон создаст пользовательские правила сборки, которые компилируют файлы .cu с nvcc и другие файлы с компилятором по умолчанию.
  • если vs пытается скомпилировать файлы .cu с помощью компилятора C / C ++, щелкните этот файл в обозревателе решений и отключите компиляцию этих файлов (красная точка на значке файла)

Дополнительную информацию об установке мастера CUDA на VS2008 можно найти здесь и здесь

[править]
Если вы не хотите использовать мастер, вам нужно вручную настроить пути CUDA lib / include / nvcc и добавить собственные правила сборки для каждой новой программы CUDA. Для получения дополнительной информации, как это сделать, посмотрите на Tom's Answer.

...