When including the random header in C++, some of the math functions it relies on are not present in the CUDA headers. We include this variants in this case.
Details
- Reviewers
jdoerfert hfinkel tra caomhin - Commits
- rZORG832535b22648: [OpenMP][bugfix] Add missing math functions variants for log and abs.
rG832535b22648: [OpenMP][bugfix] Add missing math functions variants for log and abs.
rG144291e14c1b: [OpenMP][bugfix] Add missing math functions variants for log and abs.
rL361066: [OpenMP][bugfix] Add missing math functions variants for log and abs.
rC361066: [OpenMP][bugfix] Add missing math functions variants for log and abs.
Diff Detail
- Repository
- rC Clang
Event Timeline
lib/Headers/__clang_cuda_cmath.h | ||
---|---|---|
55–56 | Where do these functions come from? https://en.cppreference.com/w/cpp/numeric/math/fabs does not seem to show any abs functions with const args. | |
lib/Headers/__clang_cuda_device_functions.h | ||
1604 ↗ | (On Diff #199937) | Should the return type also be long double ? Silently reducing precision by falling back to double is the wrong thing to do, IMO. |
lib/Headers/__clang_cuda_cmath.h | ||
---|---|---|
55–56 | What's happening is that when including the random header file, this header file uses abs with const arguments: const double __n = _M_nd(__urng); const double __y = -std::abs(__n) * __param._M_sm - 1; And without there functions here the error I get is: In file included from test.c:8: In file included from /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/random:52: /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/random.tcc:1476:27: error: call to 'abs' is ambiguous const double __y = -std::abs(__n) * __param._M_sm - 1; ^~~~~~~~ /usr/include/stdlib.h:770:12: note: candidate function extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur; ^ /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/cstdlib:166:3: note: candidate function abs(long __i) { return __builtin_labs(__i); } ^ /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/cstdlib:174:3: note: candidate function abs(long long __x) { return __builtin_llabs (__x); } ^ /usr/lib/gcc/ppc64le-redhat-linux/4.8.5/../../../../include/c++/4.8.5/cstdlib:179:3: note: candidate function abs(__int128 __x) { return __x >= 0 ? __x : -__x; } ^ |
lib/Headers/__clang_cuda_device_functions.h | ||
---|---|---|
1604 ↗ | (On Diff #199937) | Agreed. |
lib/Headers/__clang_cuda_cmath.h | ||
---|---|---|
55–56 | Overloading ignores the "const"; float abs(float) is the same thing. So probably clearer to declare it without the extra "const" modifiers, and then clean up the redundant definitions. That said, I'm not sure how you managed to pick up the declarations from cstdlib, but not cmath. What files are getting included when this fails? (Actually, in C++17, both cmath and cstdlib are supposed to declare all the float and integer overloads of abs, but that's only implemented in newer versions of libstdc++.) |
lib/Headers/__clang_cuda_cmath.h | ||
---|---|---|
55–56 |
Until we get support for OpenMP omp declare variant begin/end support in clang (X), we will only provide the CUDA declarations & definitions for math functions, not the host ones. It is one of these problems that arises when the single source language needs both, device and host definitions. (In CUDA the __device__ overload is the way out, in OpenMP it will be variant with an appropriate device context.) (X) I'm right now working on integrating this into OpenMP 5.1 but we can implement it as soon as the design is decided on. |
I'd add a comment with a brief explanation for the const variant and a TODO() to remove it.
Looks OK to me otherwise.
I'm not sure about this diff. I think it's breaking <iostream> and <algorithm>. Raised bug https://bugs.llvm.org/show_bug.cgi?id=42972
Where do these functions come from? https://en.cppreference.com/w/cpp/numeric/math/fabs does not seem to show any abs functions with const args.