I am aware this issue has been posted multiple times but I couldnt find the issue in my nvcc command. I am using CMake to build my project.
The relevant parts of root cmake:
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
set(CMAKE_CUDA_ARCHITECTURES 90)
endif()
if(NOT DEFINED CMAKE_CUDA_STANDARD)
set(CMAKE_CUDA_STANDARD 20)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
endif()
project(ProjectName CUDA CXX)
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)
And the other cmake file:
find_package(CUDAToolkit)
...
add_executable(ProjectName ${...})
set_target_properties(ProjectName PROPERTIES OUTPUT_NAME ProjectName )
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${...})
...
target_include_directories(ProjectName PRIVATE ${CUDA_INCLUDE_DIRS})
...
target_link_libraries(Lavender PUBLIC ${CUDA_LIBRARIES})
target_link_libraries(Lavender PRIVATE CUDA::cudart CUDA::cuda_driver)
...
The nvcc command that fails is:
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\bin\nvcc.exe" --use-local-env -ccbin "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\HostX64\x64" -x cu -rdc=true
-IC:\Users\Mate\Desktop\Projekti\ProjectName\ProjectName
-IC:\Users\Mate\Desktop\Projekti\ProjectName\ProjectName\External
-IC:\Users\Mate\Desktop\Projekti\ProjectName\Libraries\spdlog\include
-IC:\Users\Mate\Desktop\Projekti\ProjectName\Libraries\DirectXMath\include
-IC:\Users\Mate\Desktop\Projekti\ProjectName\Libraries\CLI11\include
-IC:\Users\Mate\Desktop\Projekti\ProjectName\Libraries\pbrtParser
IC:\Users\Mate\Desktop\Projekti\ProjectName\Libraries\pbrtParser\pbrtParser\include
-I"C:\Program Files (x86)\SDL2\include"
-I"C:\Program Files (x86)\SDL2\include\SDL2"
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\include"
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\include"
--keep-dir x64\Debug
-maxrregcount=0
--machine 64
--compile
-cudart static
-std=c++20
--generate-code=arch=compute_90,code=[compute_90,sm_90]
/MT
/FICore/CoreTypes.h
/FICore/Defines.h
/FIMath/MathTypes.h
-Xcompiler="/EHsc -Zi -Ob0"
-g
-D_WINDOWS -D"PROJECT_NAME_PATH=\"C:/Users/Mate/Desktop/Projekti/ProjectName/ProjectName\"" -DNOMINMAX -DLAVENDER_DEBUG_BUILD -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -DWIN32
-D_WINDOWS -D"PROJECT_NAME_PATH=\"C:/Users/Mate/Desktop/Projekti/ProjectName /ProjectName\"" -DNOMINMAX -DPROJECT_NAME_DEBUG_BUILD -D"CMAKE_INTDIR=\"Debug\"" -Xcompiler "/EHsc /W1 /nologo /Od /FS /Zi /RTC1 /MDd "
-Xcompiler /Fd"ProjectName .dir\Debug\vc143.pdb"
-o ProjectName .dir\Debug\Renderer.obj "C:\Users\Mate\Desktop\Projekti\ProjectName\ProjectName\Scene\Renderer.cu"
From what I see here, all paths with spaces are quoted which was my first suspicion. And yes, for some reason, some flags are duplicated (-DNOMINMAX -DLAVENDER_DEBUG_BUILD etc)
Thanks for your help.
The issue seems to be /FI flags for force include in MSVC. Removing them the nvcc doesnt fail (I get other but now expected errors). I tried rewriting my force includes in cmake like this:
if(MSVC)
target_compile_options(ProjectName
PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:
/FI"Core/CoreTypes.h"
/FI"Core/Defines.h"
/FI"Math/MathTypes.h"
>
)
else()
target_compile_definitions(Lavender
PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:
-include Core/CoreTypes.h
-include Core/Defines.h
-include Math/MathTypes.h
>
endif()
target_compile_options(ProjectName
PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:
-include Core/CoreTypes.h
-include Core/Defines.h
-include Math/MathTypes.h
>
)
However this doesnt work for some reason. I get nvcc fatal again, and this is the command:
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\bin\nvcc.exe" --use-local-env -ccbin "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\HostX64\x64" -x cu -rdc=true -IC:\Users\Mate\Desktop\Projekti\Lavender\Lavender -IC:\Users\Mate\Desktop\Projekti\Lavender\Lavender\External -IC:\Users\Mate\Desktop\Projekti\Lavender\Libraries\spdlog\include -IC:\Users\Mate\Desktop\Projekti\Lavender\Libraries\DirectXMath\include -IC:\Users\Mate\Desktop\Projekti\Lavender\Libraries\CLI11\include -IC:\Users\Mate\Desktop\Projekti\Lavender\Libraries\pbrtParser -IC:\Users\Mate\Desktop\Projekti\Lavender\Libraries\pbrtParser\pbrtParser\include -I"C:\Program Files (x86)\SDL2\include" -I"C:\Program Files (x86)\SDL2\include\SDL2" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\include" --keep-dir x64\Debug -maxrregcount=0 --machine 64 --compile -cudart static -std=c++20 --generate-code=arch=compute_90,code=[compute_90,sm_90] --pre-include Core/CoreTypes.h Core/Defines.h Math/MathTypes.h -Xcompiler="/EHsc -Zi -Ob0" -g -D_WINDOWS -D"LAVENDER_PATH=\"C:/Users/Mate/Desktop/Projekti/Lavender/Lavender\"" -DNOMINMAX -DLAVENDER_DEBUG_BUILD -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -DWIN32 -D_WINDOWS -D"LAVENDER_PATH=\"C:/Users/Mate/Desktop/Projekti/Lavender/Lavender\"" -DNOMINMAX -DLAVENDER_DEBUG_BUILD -D"CMAKE_INTDIR=\"Debug\"" -Xcompiler "/EHsc /W1 /nologo /Od /FS /Zi /RTC1 /MDd " -Xcompiler "/FdLavender.dir\Debug\vc143.pdb" -o Lavender.dir\Debug\Renderer.obj "C:\Users\Mate\Desktop\Projekti\Lavender\Lavender\Scene\Renderer.cu"
If I leave just one include like this:
target_compile_options(Lavender
PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:
-include Core/CoreTypes.h
#-include Core/Defines.h
#-include Math/MathTypes.h
>
It doesnt fail.
Not a big deal since I bypass easily by actually including the files (atleast in .cu file) but maybe someone knows what’s the issue.
I forgot about this post, but this fixed my issue:
target_compile_options(Lavender
PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:
--pre-include=${CMAKE_CURRENT_SOURCE_DIR}/Core/CoreTypes.h
--pre-include=${CMAKE_CURRENT_SOURCE_DIR}/Core/Defines.h
--pre-include=${CMAKE_CURRENT_SOURCE_DIR}/Math/MathTypes.h
>
)