Summary
When sccache wraps nvcc on Windows, passing -Xcompiler "/openmp:llvm" through to
the host MSVC compiler causes sccache to log
Cannot cache(multiple input files, [...]) and return exit code 1, instead of
caching or falling through to a direct compile. The cl.exe argument list shown
in the error contains exactly one source file (the x_0.cudafe1.cpp produced
by nvcc), so the "multiple input files" classification appears wrong.
Likely cause: sccache's MSVC argument parser splitting /openmp:llvm on : and
counting llvm as a second positional (input file) argument.
Environment
- sccache: 0.15.0
- OS: Windows Server Core LTSC2019 (inside a Docker container)
- MSVC: 14.43.34808 (Visual Studio 2022 BuildTools)
- nvcc: CUDA 13.0 (sm_75 used for repro; not arch-specific)
- Host arch: x86_64
Minimal reproducer
echo __global__ void k() {} > hello.cu
echo int main() { k^<^<^<1,1^>^>^>(); return 0; } >> hello.cu
set SCCACHE_DIR=C:\Temp\sc
set SCCACHE_LOG=debug
sccache --stop-server >NUL 2>&1
sccache nvcc -forward-unknown-to-host-compiler ^
-Xcompiler "/openmp:llvm" ^
--generate-code arch=compute_75,code=sm_75 ^
-std=c++17 -c hello.cu -o hello.obj
Exit code: 1. Removing -Xcompiler "/openmp:llvm" makes the same invocation
succeed (exit 0) and cache.
Verbatim error
"C:\\BuildTools\\VC\\Tools\\MSVC\\14.43.34808\\bin\\HostX64\\x64\\cl.exe"
["/std:c++17", "-Fohello.obj", "-D__CUDA_ARCH__=750", "-D__CUDA_ARCH_LIST__=750",
"-nologo", "-c", "-TP", "-DCUDA_DOUBLE_MATH_FUNCTIONS", "-EHsc", "-MT",
"/openmp:llvm", "-Ic:/tools/cuda/...", ...,
"C:/Users/.../sccache_nvccXXXXX\\x_0.cudafe1.cpp"]
The bracketed file list contains exactly one source file.
Bisection
Four -Xcompiler flag combos against the same hello-world .cu:
┌──────┬──────────────────────────────┬──────┬──────────────────────┐
│ Case │ -Xcompiler flags │ Exit │ Cannot cache emitted │
├──────┼──────────────────────────────┼──────┼──────────────────────┤
│ 1 │ -MT, "/openmp:llvm", /bigobj │ 1 │ yes │
├──────┼──────────────────────────────┼──────┼──────────────────────┤
│ 2 │ -MT, "/openmp:llvm" │ 1 │ yes │
├──────┼──────────────────────────────┼──────┼──────────────────────┤
│ 3 │ -MT, /bigobj │ 0 │ no │
├──────┼──────────────────────────────┼──────┼──────────────────────┤
│ 4 │ -MT only (control) │ 0 │ no │
└──────┴──────────────────────────────┴──────┴──────────────────────┘
/openmp:llvm alone is sufficient to trigger; /bigobj is innocent.
Hypothesis
The MSVC argument parser appears to split /openmp:llvm on ":" and treat llvm
as a positional argument.
Impact
CUDA projects on Windows that pass -Xcompiler /openmp:llvm cannot be built
through sccache today. Not sure whether Linux is impacted.
Summary
When sccache wraps nvcc on Windows, passing
-Xcompiler "/openmp:llvm"through tothe host MSVC compiler causes sccache to log
Cannot cache(multiple input files, [...])and return exit code 1, instead ofcaching or falling through to a direct compile. The cl.exe argument list shown
in the error contains exactly one source file (the
x_0.cudafe1.cppproducedby nvcc), so the "multiple input files" classification appears wrong.
Likely cause: sccache's MSVC argument parser splitting
/openmp:llvmon:andcounting
llvmas a second positional (input file) argument.Environment
Minimal reproducer
Exit code: 1. Removing -Xcompiler "/openmp:llvm" makes the same invocation
succeed (exit 0) and cache.
Verbatim error
The bracketed file list contains exactly one source file.
Bisection
Four -Xcompiler flag combos against the same hello-world .cu:
/openmp:llvm alone is sufficient to trigger; /bigobj is innocent.
Hypothesis
The MSVC argument parser appears to split /openmp:llvm on ":" and treat llvm
as a positional argument.
Impact
CUDA projects on Windows that pass -Xcompiler /openmp:llvm cannot be built
through sccache today. Not sure whether Linux is impacted.