Nvcc 12.3 with gcc 13.2 not working

I believe this may be an nvcc issue. Currently, on arch linux gcc 13 is the default gcc version. However, cuda uses (should use?) gcc 12, and indeed, gcc 12 is a dependency of the cuda package and it is correctly installed.

Unfortunately, nvcc is mixing gcc 12 and 13, and this seems to cause the issue.

For example, as of today:

$ cat test.cu
#include <stdio.h>

int main() { }
$ nvcc test.cu
/usr/include/bits/floatn.h(86): error: invalid combination of type specifiers
  typedef __float128 _Float128;
                     ^

/usr/include/bits/floatn-common.h(214): error: invalid combination of type specifiers
  typedef float _Float32;
                ^

/usr/include/bits/floatn-common.h(251): error: invalid combination of type specifiers
  typedef double _Float64;
                 ^

/usr/include/bits/floatn-common.h(268): error: invalid combination of type specifiers
  typedef double _Float32x;
                 ^

/usr/include/bits/floatn-common.h(285): error: invalid combination of type specifiers
  typedef long double _Float64x;
                      ^

5 errors detected in the compilation of "test.cu".

Even though the headers (which are glibc headers) have the necessary guards, e.g.:

#  if !__GNUC_PREREQ (7, 0) || (defined __cplusplus && !__GNUC_PREREQ (13, 0))
typedef float _Float32;
#  endif

they are defeated by nvcc mixing gcc 12 and 13.

$ strace -e execve -s 9999 -f nvcc test.cu
[...]
[pid 189798] execve("/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/cc1plus", ["/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/cc1plus", "-E", "-quiet", "-D_GNU_SOURCE", "/tmp/tmpxft_0002e564_00000000-2.cpp", "-mtune=generic", "-march=x86-64", "-dumpbase", "tmpxft_0002e564_00000000-2.cpp", "-dumpbase-ext", ".cpp"], 0x1cc0d80 /* 64 vars */) = 0
[...]
[pid 189800] execve("/usr/lib/gcc/x86_64-pc-linux-gnu/12.3.0/cc1plus", ["/usr/lib/gcc/x86_64-pc-linux-gnu/12.3.0/cc1plus", "-E", "-quiet", "-I", "/opt/cuda/bin/../targets/x86_64-linux/include", "-D_GNU_SOURCE", "-D", "__CUDA_ARCH_LIST__=520", "-D", "__CUDACC__", "-D", "__NVCC__", "-D", "__CUDACC_VER_MAJOR__=12", "-D", "__CUDACC_VER_MINOR__=3", "-D", "__CUDACC_VER_BUILD__=52", "-D", "__CUDA_API_VER_MAJOR__=12", "-D", "__CUDA_API_VER_MINOR__=3", "-D", "__NVCC_DIAG_PRAGMA_SUPPORT__=1", "-include", "cuda_runtime.h", "test.cu", "-o", "/tmp/tmpxft_0002e564_00000000-5_test.cpp4.ii", "-m64", "-mtune=generic", "-march=x86-64", "-dumpdir", "/tmp/", "-dumpbase", "tmpxft_0002e564_00000000-5_test.cpp4.cu", "-dumpbase-ext", ".cu"], 0x21cd730 /* 77 vars */) = 0
[...]
[pid 189801] execve("/opt/cuda/bin/cudafe++", ["cudafe++", "--c++17", "--gnu_version=130201", "--display_error_number", "--orig_src_file_name", "test.cu", "--orig_src_path_name", "/tmp/test.cu", "--allow_managed", "--m64", "--parse_templates", "--gen_c_file_name", "/tmp/tmpxft_0002e564_00000000-6_test.cudafe1.cpp", "--stub_file_name", "tmpxft_0002e564_00000000-6_test.cudafe1.stub.c", "--gen_module_id_file", "--module_id_file_name", "/tmp/tmpxft_0002e564_00000000-4_test.module_id", "/tmp/tmpxft_0002e564_00000000-5_test.cpp4.ii"], 0x555e63c36340 /* 75 vars */) = 0

Note that gcc 13 is used first, then gcc 12, then cudafe++ is executed with --gnu_version=130201, which ultimately fails with the above error messages.

Specifying -ccbin=/opt/cuda/bin (which has the gcc and g++ symbolic links to the gcc 12 versions) fixes the issue, and gcc 12 will be used all the way (and --gnu_version=120300 will be specified when executing cudafe++). (If you use meson, you can set -D cuda_ccbindir=/opt/cuda/bin.)

EDIT: It looks like I’m way too late. Based on the following comment, this has already been reported to nvidia: cuda.sh · 4e66a3ddd593027aaadbf731b6c56de154292344 · Arch Linux / Packaging / Packages / cuda · GitLab