This is an archive of the discontinued LLVM Phabricator instance.

[OpenMP][bugfix] Add missing math functions variants for log and abs.
ClosedPublic

Authored by gtbercea on May 16 2019, 4:46 PM.

Diff Detail

Event Timeline

gtbercea created this revision.May 16 2019, 4:46 PM
Herald added a project: Restricted Project. · View Herald TranscriptMay 16 2019, 4:46 PM
tra added inline comments.May 16 2019, 4:57 PM
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 ?
In general long double is not supported by CUDA. I'd provide a declaration here, if it's absolutely needed, but no definition, so if someone attempts to actually use it, the application will fail to link.

Silently reducing precision by falling back to double is the wrong thing to do, IMO.

gtbercea marked an inline comment as done.May 16 2019, 5:31 PM
gtbercea added inline comments.
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; }
  ^
gtbercea marked an inline comment as done.May 16 2019, 5:38 PM
gtbercea added inline comments.
lib/Headers/__clang_cuda_device_functions.h
1604 ↗(On Diff #199937)

Agreed.

efriedma added inline comments.
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++.)

jdoerfert added inline comments.May 16 2019, 9:38 PM
lib/Headers/__clang_cuda_cmath.h
55–56

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.

This LGTM me, @tra or @efriedma any objections?

gtbercea updated this revision to Diff 200048.May 17 2019, 8:19 AM
  • update patch
gtbercea added a comment.EditedMay 17 2019, 8:20 AM

@tra I eliminated the long double definition for log and only left the declaration.

tra accepted this revision.May 17 2019, 9:31 AM

I'd add a comment with a brief explanation for the const variant and a TODO() to remove it.

Looks OK to me otherwise.

This revision is now accepted and ready to land.May 17 2019, 9:31 AM
This revision was automatically updated to reflect the committed changes.

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