[PATCH] D62046: [OpenMP][bugfix] Add missing math functions variants for log and abs.

Johannes Doerfert via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu May 16 21:41:29 PDT 2019


jdoerfert added inline comments.


================
Comment at: lib/Headers/__clang_cuda_cmath.h:55-56
+#if defined(_OPENMP) && defined(__cplusplus)
+__DEVICE__ const float abs(const float __x) { return ::fabsf((float)__x); }
+__DEVICE__ const double abs(const double __x) { return ::fabs((double)__x); }
+#endif
----------------
efriedma wrote:
> gtbercea wrote:
> > tra wrote:
> > > 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.
> > 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; }
> >   ^
> > ```
> 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++.)
> 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?

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.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62046/new/

https://reviews.llvm.org/D62046





More information about the cfe-commits mailing list