CUDA
А зачем?
Пожалуй, сразу отвечу, для чего было придумано такое решение. Когда мы держали проект в виде OpenSource, то пытались сохранить политику «скачал код, собрал одной кнопкой», но с момента использования технологии CUDA ситуация стала сложнее… Большая часть комьюнити кричала, что ничего не собирается и устанавливать сторонние SDK они не хотят.
Интеграция CUDA прямо в .vcxproj
Решили мы проблему весьма просто: запихнули командную строку CUDA в «события перед сборкой», а тулсет в SDK/tools/CUDA.
События перед сборкой
События перед сборкой — это список команд, который будет выполнен на начальном этапе компиляции.
CMD для интеграции CUDA выглядит следующим образом"
nvcc.exe -gencode=arch=compute_30,code=\"sm_30,compute_30\" --use-local-env -x cu -I..\..\engine.vc2008\xrCore\XMLCore -I../../sdk/include/dx/ -I../../sdk/include/ -I..\..\engine.vc2008\xrQSlim\src -I../../sdk/include/optix/ -I../../sdk/include/cuda/ -I$(xrIncl) -G --keep-dir $(Platform)\$(Configuration) -maxrregcount=0 --machine 64 --compile -cudart static -g -DFORCE_NO_EXCEPTIONS -D_USE_MATH_DEFINES -DWIN32 -DDEBUG -D_WINDOWS -D_USRDLL -DXRLC_LIGHT_EXPORTS -D_SECURE_SCL=0 -D_ITERATOR_DEBUG_LEVEL=0 -D_VC80_UPGRADE=0x0710 -DWIN32 -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDLL -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /FS /Zi /RTC1 /MD " -o $(IntermediateOutputPath)LightPoint.cu.obj "$(ProjectDir)LightPoint.cu"
Данный код не требует пояснения, т.к. он просто копируется из CMD от CUDA вашего проекта
Вытаскиваем toolset
Ну, тут процесс весьма прост: пытаемся собрать, ловим ошибку, докидываем .exe/.dll -> check again. Для упрощения жизни:
- nvcc.exe
- nvcc.profile
- nvlink.exe
- nvvm64_32_0.dll
- ptxas.exe
- cudafe++.exe
- fatbinary.exe
- cicc.exe
- bin2c.exe
- gpu-library-advisor.exe
Компоновка
Ну и самое просто под конец — подключить скомпилированный .cu файл в компоновку: Свойства -> Компоновщик -> Командная строка и вписываем в дополнительные опции your_file_name.cu.obj.
Заключение
Таким образом у любого обладателя VS при сборке вашего проекта, не будет требоваться установленный CUDA SDK.