Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redefinitions when compiling CUDA with clang on Windows

Tags:

c++

cuda

clang++

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?

Side note

According to clang's documentation, clang can overload based on __global__/__device__ qualifiers, shouldn't the code just compile anyways?

Details

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
like image 735
Passer By Avatar asked May 26 '17 06:05

Passer By


People also ask

Does Clang support Cuda?

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.

Can Clang compile for Windows?

On Windows, you can now compile with Clang, but LLVM doesn't ship with a standard library.

Does Clang compile faster than GCC?

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.

Can you compile GCC with Clang?

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++).


1 Answers

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

  • cuda's math_functions.hpp
  • clang's __clang_cuda_math_forward_declares.h
  • clang's __clang_cuda_cmath.h

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.

like image 184
Passer By Avatar answered Sep 24 '22 18:09

Passer By