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