Despite an almost identical question already asked, the answer is for OSX and no longer holds true (and is really hacky anyways).
The problem is when compiling cuda with clang on windows, there is tonnes of redefinitions in math_functions.hpp
.
With some investigations, apparently cuda decided to put its math_functions.hpp
and math_functions.h
functions in namespace std
(is this even legal?), and collided with all the libstdc++ functions in cmath
and clang's own headers for compiling cuda.
How do I deal with this? Preferably not with the hacky way shown in the previous question?
According to clang's documentation, clang can overload based on __global__
/__device__
qualifiers, shouldn't the code just compile anyways?
Versions:
clang 4.0.0 (built like this)
libstdc++ came from gcc 7.1.0
cuda 8.0
windows 10
Full error output
clang++ hellocuda.cu --cuda-path=E:\cuda\development --cuda-gpu-arch=sm_20 -LE:\cuda\development\lib\x64 -lcudart_static -ldl -lrt -std=c++1y -O2 -pedantic -Wall -Wextra -fms-extensions -o program.exe
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:1684:14: error: redefinition of
'__isnan'
__func__(int __isnan(double a))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:525:28: note:
previous definition is here
__CRT_INLINE int __cdecl __isnan (double _x)
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:1764:14: error: redefinition of
'__signbit'
__func__(int __signbit(double a))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:611:28: note:
previous definition is here
__CRT_INLINE int __cdecl __signbit (double x) {
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:1776:17: error: redefinition of
'copysign'
__func__(double copysign(double a, double b))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:1069:31: note:
previous definition is here
__CRT_INLINE double __cdecl copysign (double x, double y)
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:3161:14: error: redefinition of
'__signbitl'
__func__(int __signbitl(long double a))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:636:28: note:
previous definition is here
__CRT_INLINE int __cdecl __signbitl (long double x) {
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:3166:14: error: redefinition of
'__signbitf'
__func__(int __signbitf(float a))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:624:28: note:
previous definition is here
__CRT_INLINE int __cdecl __signbitf (float x) {
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:3191:14: error: redefinition of
'__isnanl'
__func__(int __isnanl(long double a))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:565:28: note:
previous definition is here
__CRT_INLINE int __cdecl __isnanl (long double _x)
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:3196:14: error: redefinition of
'__isnanf'
__func__(int __isnanf(float a))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:546:28: note:
previous definition is here
__CRT_INLINE int __cdecl __isnanf (float _x)
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:191:
E:\cuda\development/include\math_functions.hpp:3360:16: error: redefinition of
'copysignf'
__func__(float copysignf(float a, float b))
^
E:\TDM-GCC\mingw64 7.1.0\mingw64\x86_64-w64-mingw32\include\math.h:1076:30: note:
previous definition is here
__CRT_INLINE float __cdecl copysignf (float x, float y)
^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:250:
E:\cuda\development/include\math_functions.hpp:365:43: error: functions that differ
only in their return type cannot be overloaded
static __inline__ __host__ __device__ int isinf(double a)
~~~ ^
E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_math_forward_declares.h:107:17: note:
previous declaration is here
__DEVICE__ bool isinf(double);
~~~~ ^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:250:
E:\cuda\development/include\math_functions.hpp:381:43: error: functions that differ
only in their return type cannot be overloaded
static __inline__ __host__ __device__ int isinf(float a)
~~~ ^
E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_math_forward_declares.h:108:17: note:
previous declaration is here
__DEVICE__ bool isinf(float);
~~~~ ^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:250:
E:\cuda\development/include\math_functions.hpp:413:43: error: functions that differ
only in their return type cannot be overloaded
static __inline__ __host__ __device__ int isnan(double a)
~~~ ^
E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_math_forward_declares.h:115:17: note:
previous declaration is here
__DEVICE__ bool isnan(double);
~~~~ ^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:250:
E:\cuda\development/include\math_functions.hpp:429:43: error: functions that differ
only in their return type cannot be overloaded
static __inline__ __host__ __device__ int isnan(float a)
~~~ ^
E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_math_forward_declares.h:116:17: note:
previous declaration is here
__DEVICE__ bool isnan(float);
~~~~ ^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:250:
E:\cuda\development/include\math_functions.hpp:461:43: error: functions that differ
only in their return type cannot be overloaded
static __inline__ __host__ __device__ int isfinite(double a)
~~~ ^
E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_math_forward_declares.h:101:17: note:
previous declaration is here
__DEVICE__ bool isfinite(double);
~~~~ ^
In file included from <built-in>:1:
In file included from E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_runtime_wrapper.h:250:
E:\cuda\development/include\math_functions.hpp:477:43: error: functions that differ
only in their return type cannot be overloaded
static __inline__ __host__ __device__ int isfinite(float a)
~~~ ^
E:\LLVM\bin\..\lib\clang\4.0.0\include\__clang_cuda_math_forward_declares.h:102:17: note:
previous declaration is here
__DEVICE__ bool isfinite(float);
~~~~ ^
14 errors generated.
makefile:15: recipe for target 'all' failed
mingw32-make: *** [all] Error 1
Clang currently supports CUDA 7.0 through 11.5. If clang detects a newer CUDA version, it will issue a warning and will attempt to use detected CUDA SDK it as if it were CUDA 11.5. Before you build CUDA code, you'll need to have installed the CUDA SDK.
On Windows, you can now compile with Clang, but LLVM doesn't ship with a standard library.
Clang is much faster and uses far less memory than GCC. Clang aims to provide extremely clear and concise diagnostics (error and warning messages), and includes support for expressive diagnostics. GCC's warnings are sometimes acceptable, but are often confusing and it does not support expressive diagnostics.
Correcting my own answer: yes you CAN. Compile your code with "clang++ -stdlib=libstdc++". Then it will link correctly to g++-compiled library (including Crypto++).
I tried quite a bit of stuff. They failed. In the end I dug into the headers and literally macroed out anything that has a conflict, which are located in
clang uses _MSC_VER
to detect Windows, which is defined only if -fms-compatibility flag is used, but this causes a ton of other errors elsewhere for unknown reasons.
cuda uses a mixture of _WIN32
and _MSC_VER
to detect Windows. As far as I can tell, just macroing away everything that is a redefinition is simply the easiest way to do this.
This seems to be working, as in no other header errors popped up.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With