Index: test-suite/trunk/External/CUDA/CMakeLists.txt =================================================================== --- test-suite/trunk/External/CUDA/CMakeLists.txt +++ test-suite/trunk/External/CUDA/CMakeLists.txt @@ -44,6 +44,8 @@ # Create targets for CUDA tests that are part of the test suite. macro(create_local_cuda_tests VariantSuffix) create_one_local_test(axpy axpy.cu) + create_one_local_test(cmath cmath.cu) + create_one_local_test(math_h math_h.cu) create_one_local_test(empty empty.cu) create_one_local_test(printf printf.cu) create_one_local_test(future future.cu) Index: test-suite/trunk/External/CUDA/cmath.cu =================================================================== --- test-suite/trunk/External/CUDA/cmath.cu +++ test-suite/trunk/External/CUDA/cmath.cu @@ -0,0 +1,1742 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// This file was copied from libc++'s test suite, then modified to test CUDA. +// For the most part, this consists of adding __device__ attributes and +// deleting long double. + +// + +// This test requires c++11 (it's mostly decltype stuff). + +#if __cplusplus >= 201103L + +#include +#include +#include +#include + +template +struct eif {}; + +template struct eif { + typedef __T type; +}; + +// Defines an overload of __fn that accepts one two arithmetic arguments, calls +// __fn((double)x, (double)y), and returns a double. +// +// Note this is different from OVERLOAD_1, which generates an overload that +// accepts only *integral* arguments. +/*#define __CUDA_CLANG_FN_INTEGER_OVERLOAD_2(__retty, __fn) \ + template \ + __device__ typename eif::is_specialized && \ + std::numeric_limits<__T2>::is_specialized, \ + __retty>::type \ + __fn(__T1 __x, __T2 __y) { \ + return __fn((double)__x, (double)__y); \ + } +__CUDA_CLANG_FN_INTEGER_OVERLOAD_2(double, fmod);*/ + +/*template +__device__ typename std::enable_if::is_specialized && + std::numeric_limits::is_specialized, + double>::type +fmod(T1 x, T2 y) { + static_assert(std::numeric_limits::is_specialized, "X"); + static_assert(std::numeric_limits::is_specialized, "Y"); + return fmod((double)x, (double)y); +}*/ + +/*namespace std { +using ::fmod; +}*/ + +/*namespace std { + using ::fmod; +}*/ + +// See PR21083 +// Ambiguous is a user-defined type that defines its own overloads of cmath +// functions. When the std overloads are candidates too (by using or adl), +// they should not interfere. +struct Ambiguous : std::true_type { // ADL + __device__ operator float () { return 0.f; } + __device__ operator double () { return 0.; } +}; +__device__ Ambiguous abs(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous acos(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous asin(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous atan(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous atan2(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous ceil(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous cos(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous cosh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous exp(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fabs(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous floor(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fmod(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous frexp(Ambiguous, int*){ return Ambiguous(); } +__device__ Ambiguous ldexp(Ambiguous, int){ return Ambiguous(); } +__device__ Ambiguous log(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous log10(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous modf(Ambiguous, Ambiguous*){ return Ambiguous(); } +__device__ Ambiguous pow(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous sin(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous sinh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous sqrt(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous tan(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous tanh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous signbit(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fpclassify(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isfinite(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isnormal(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isgreater(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isgreaterequal(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isless(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous islessequal(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous islessgreater(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isunordered(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous acosh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous asinh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous atanh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous cbrt(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous copysign(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous erf(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous erfc(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous exp2(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous expm1(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fdim(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous hypot(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous ilogb(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous lgamma(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous llrint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous llround(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous log1p(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous log2(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous logb(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous lrint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous lround(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous nearbyint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous nextafter(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous nexttoward(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous remainder(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous remquo(Ambiguous, Ambiguous, int*){ return Ambiguous(); } +__device__ Ambiguous rint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous round(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous scalbln(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous scalbn(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous tgamma(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous trunc(Ambiguous){ return Ambiguous(); } + +__device__ void test_abs() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::abs(-1) == 1); + assert(std::abs(-1.) == 1); + assert(std::abs(-1.f) == 1); +} + +__device__ void test_acos() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::acos(1) == 0); + assert(std::acos(1.) == 0); + assert(std::acos(1.f) == 0); +} + +__device__ void test_asin() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::asin(0) == 0); + assert(std::asin(0.) == 0); + assert(std::asin(0.f) == 0); +} + +__device__ void test_atan() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::atan(0) == 0); + assert(std::atan(0.) == 0); + assert(std::atan(0.f) == 0); +} + +__device__ void test_atan2() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::atan2(0, 1) == 0); + assert(std::atan2(0, 1.) == 0); + assert(std::atan2(0, 1.f) == 0); + + assert(std::atan2(0., 1) == 0); + assert(std::atan2(0., 1.) == 0); + assert(std::atan2(0., 1.f) == 0); + + assert(std::atan2(0.f, 1) == 0); + assert(std::atan2(0.f, 1.) == 0); + assert(std::atan2(0.f, 1.f) == 0); +} + +__device__ void test_ceil() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::ceil(0) == 0); + assert(std::ceil(0.) == 0); + assert(std::ceil(0.f) == 0); +} + +__device__ void test_cos() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::cos(0) == 1); + assert(std::cos(0.) == 1); + assert(std::cos(0.f) == 1); +} + +__device__ void test_cosh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::cosh(0) == 1); + assert(std::cosh(0.) == 1); + assert(std::cosh(0.f) == 1); +} + +__device__ void test_exp() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::exp(0) == 1); + assert(std::exp(0.) == 1); + assert(std::exp(0.f) == 1); +} + +__device__ void test_fabs() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::fabs(-1) == 1); + assert(std::fabs(-1.) == 1); + assert(std::fabs(-1.f) == 1); +} + +__device__ void test_floor() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::floor(1) == 1); + assert(std::floor(1.) == 1); + assert(std::floor(1.f) == 1); +} + +__device__ void test_fmod() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fmod(1.5, 1) == .5); + assert(std::fmod(1.5, 1.) == .5); + assert(std::fmod(1.5, 1.f) == .5); + + assert(std::fmod(1.5f, 1) == .5); + assert(std::fmod(1.5f, 1.) == .5); + assert(std::fmod(1.5f, 1.f) == .5); + + assert(std::fmod(2, 1) == 0); + assert(std::fmod(2, 1.) == 0); + assert(std::fmod(2, 1.f) == 0); +} + +__device__ void test_frexp() +{ + int ip; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::frexp(0, &ip) == 0); + assert(std::frexp(0., &ip) == 0); + assert(std::frexp(0.f, &ip) == 0); +} + +__device__ void test_ldexp() +{ + int ip = 1; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::ldexp(1, ip) == 2); + assert(std::ldexp(1., ip) == 2); + assert(std::ldexp(1.f, ip) == 2); +} + +__device__ void test_log() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::log(1) == 0); + assert(std::log(1.) == 0); + assert(std::log(1.f) == 0); +} + +__device__ void test_log10() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::log10(1) == 0); + assert(std::log10(1.) == 0); + assert(std::log10(1.f) == 0); +} + +__device__ void test_modf() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + double i; + assert(std::modf(1, &i) == 0); + assert(std::modf(1., &i) == 0); + assert(std::modf(1.f, &i) == 0); +} + +__device__ void test_pow() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::pow(1, 1) == 1); + assert(std::pow(1., 1) == 1); + assert(std::pow(1.f, 1) == 1); + + assert(std::pow(1, 1.) == 1); + assert(std::pow(1., 1.) == 1); + assert(std::pow(1.f, 1.) == 1); + + assert(std::pow(1, 1.f) == 1); + assert(std::pow(1., 1.f) == 1); + assert(std::pow(1.f, 1.f) == 1); +} + +__device__ void test_sin() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::sin(0) == 0); + assert(std::sin(0.) == 0); + assert(std::sin(0.f) == 0); +} + +__device__ void test_sinh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::sinh(0) == 0); + assert(std::sinh(0.) == 0); + assert(std::sinh(0.f) == 0); +} + +__device__ void test_sqrt() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::sqrt(4) == 2); + assert(std::sqrt(4.) == 2); + assert(std::sqrt(4.f) == 2); +} + +__device__ void test_tan() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::tan(0) == 0); + assert(std::tan(0.) == 0); + assert(std::tan(0.f) == 0); +} + +__device__ void test_tanh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::tanh(0) == 0); + assert(std::tanh(0.) == 0); + assert(std::tanh(0.f) == 0); +} + +__device__ void test_signbit() +{ +#ifdef signbit +#error signbit defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::signbit(-1) == true); + assert(std::signbit(-1.) == true); + assert(std::signbit(-1.f) == true); +} + +__device__ void test_fpclassify() +{ +#ifdef fpclassify +#error fpclassify defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::fpclassify(-1) == FP_NORMAL); + assert(std::fpclassify(-1.) == FP_NORMAL); + assert(std::fpclassify(-1.f) == FP_NORMAL); +} + +__device__ void test_isfinite() +{ +#ifdef isfinite +#error isfinite defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isfinite(-1) == true); + assert(std::isfinite(-1.) == true); + assert(std::isfinite(-1.f) == true); +} + +__device__ void test_isnormal() +{ +#ifdef isnormal +#error isnormal defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isnormal(-1) == true); + assert(std::isnormal(-1.) == true); + assert(std::isnormal(-1.f) == true); +} + +__device__ void test_isgreater() +{ +#ifdef isgreater +#error isgreater defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isgreater(-1, 0) == false); + assert(std::isgreater(-1, 0.) == false); + assert(std::isgreater(-1, 0.f) == false); + + assert(std::isgreater(-1., 0) == false); + assert(std::isgreater(-1., 0.) == false); + assert(std::isgreater(-1., 0.f) == false); + + assert(std::isgreater(-1.f, 0) == false); + assert(std::isgreater(-1.f, 0.) == false); + assert(std::isgreater(-1.f, 0.f) == false); +} + +__device__ void test_isgreaterequal() +{ +#ifdef isgreaterequal +#error isgreaterequal defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isgreaterequal(-1, 0) == false); + assert(std::isgreaterequal(-1, 0.) == false); + assert(std::isgreaterequal(-1, 0.f) == false); + + assert(std::isgreaterequal(-1., 0) == false); + assert(std::isgreaterequal(-1., 0.) == false); + assert(std::isgreaterequal(-1., 0.f) == false); + + assert(std::isgreaterequal(-1.f, 0) == false); + assert(std::isgreaterequal(-1.f, 0.) == false); + assert(std::isgreaterequal(-1.f, 0.f) == false); +} + +__device__ void test_isinf() +{ +#ifdef isinf +#error isinf defined +#endif + static_assert((std::is_same::value), ""); + + typedef decltype(std::isinf((double)0)) DoubleRetType; +#ifndef __linux__ + static_assert((std::is_same::value), ""); +#else + // GLIBC < 2.26 defines 'isinf(double)' with a return type of 'int' in + // all C++ dialects. The test should tolerate this. + // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439 + static_assert((std::is_same::value + || std::is_same::value), ""); +#endif + + static_assert((std::is_same::value), ""); + assert(std::isinf(-1) == false); + assert(std::isinf(-1.) == false); + assert(std::isinf(-1.f) == false); +} + +__device__ void test_isless() +{ +#ifdef isless +#error isless defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isless(-1, 0) == true); + assert(std::isless(-1, 0.) == true); + assert(std::isless(-1, 0.f) == true); + + assert(std::isless(-1., 0) == true); + assert(std::isless(-1., 0.) == true); + assert(std::isless(-1., 0.f) == true); + + assert(std::isless(-1.f, 0) == true); + assert(std::isless(-1.f, 0.) == true); + assert(std::isless(-1.f, 0.f) == true); +} + +__device__ void test_islessequal() +{ +#ifdef islessequal +#error islessequal defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::islessequal(-1, 0) == true); + assert(std::islessequal(-1, 0.) == true); + assert(std::islessequal(-1, 0.f) == true); + + assert(std::islessequal(-1., 0) == true); + assert(std::islessequal(-1., 0.) == true); + assert(std::islessequal(-1., 0.f) == true); + + assert(std::islessequal(-1.f, 0) == true); + assert(std::islessequal(-1.f, 0.) == true); + assert(std::islessequal(-1.f, 0.f) == true); +} + +__device__ void test_islessgreater() +{ +#ifdef islessgreater +#error islessgreater defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::islessgreater(-1, 0) == true); + assert(std::islessgreater(-1, 0.) == true); + assert(std::islessgreater(-1, 0.f) == true); + + assert(std::islessgreater(-1., 0) == true); + assert(std::islessgreater(-1., 0.) == true); + assert(std::islessgreater(-1., 0.f) == true); + + assert(std::islessgreater(-1.f, 0) == true); + assert(std::islessgreater(-1.f, 0.) == true); + assert(std::islessgreater(-1.f, 0.f) == true); +} + +__device__ void test_isnan() +{ +#ifdef isnan +#error isnan defined +#endif + static_assert((std::is_same::value), ""); + + typedef decltype(std::isnan((double)0)) DoubleRetType; +#ifndef __linux__ + static_assert((std::is_same::value), ""); +#else + // GLIBC < 2.26 defines 'isnan(double)' with a return type of 'int' in + // all C++ dialects. The test should tolerate this. + // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439 + static_assert((std::is_same::value + || std::is_same::value), ""); +#endif + + static_assert((std::is_same::value), ""); + assert(std::isnan(-1) == false); + assert(std::isnan(-1.) == false); + assert(std::isnan(-1.f) == false); +} + +__device__ void test_isunordered() +{ +#ifdef isunordered +#error isunordered defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isunordered(-1, 0) == false); + assert(std::isunordered(-1, 0.) == false); + assert(std::isunordered(-1, 0.f) == false); + + assert(std::isunordered(-1., 0) == false); + assert(std::isunordered(-1., 0.) == false); + assert(std::isunordered(-1., 0.f) == false); + + assert(std::isunordered(-1.f, 0) == false); + assert(std::isunordered(-1.f, 0.) == false); + assert(std::isunordered(-1.f, 0.f) == false); +} + +__device__ void test_acosh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::acosh(1) == 0); + assert(std::acosh(1.) == 0); + assert(std::acosh(1.f) == 0); +} + +__device__ void test_asinh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::asinh(0) == 0); + assert(std::asinh(0.) == 0); + assert(std::asinh(0.f) == 0); +} + +__device__ void test_atanh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::atanh(0) == 0); + assert(std::atanh(0.) == 0); + assert(std::atanh(0.f) == 0); +} + +__device__ void test_cbrt() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::cbrt(1) == 1); + assert(std::cbrt(1.) == 1); + assert(std::cbrt(1.f) == 1); +} + +__device__ void test_copysign() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + // CUDA's copysign(float, double) returns a float. This is not per spec, + // but it's kind of reasonable -- given that copysign just copies the sign + // of the LHS to the RHS, there's no reason that we should have to promote + // the LHS from float to double. + //static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::copysign(1, 1) == 1); + assert(std::copysign(1., 1) == 1); + assert(std::copysign(1.f, 1) == 1); + + assert(std::copysign(1, 1.) == 1); + assert(std::copysign(1., 1.) == 1); + assert(std::copysign(1.f, 1.) == 1); + + assert(std::copysign(1, 1.f) == 1); + assert(std::copysign(1., 1.f) == 1); + assert(std::copysign(1.f, 1.f) == 1); +} + +__device__ void test_erf() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::erf(0) == 0); + assert(std::erf(0.) == 0); + assert(std::erf(0.f) == 0); +} + +__device__ void test_erfc() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::erfc(0) == 1); + assert(std::erfc(0.) == 1); + assert(std::erfc(0.f) == 1); +} + +__device__ void test_exp2() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::exp2(1) == 2); + assert(std::exp2(1.) == 2); + assert(std::exp2(1.f) == 2); +} + +__device__ void test_expm1() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::expm1(0) == 0); + assert(std::expm1(0.) == 0); + assert(std::expm1(0.f) == 0); +} + +__device__ void test_fdim() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fdim(1, 0) == 1); + assert(std::fdim(1., 0) == 1); + assert(std::fdim(1.f, 0) == 1); + + assert(std::fdim(1, 0.) == 1); + assert(std::fdim(1., 0.) == 1); + assert(std::fdim(1.f, 0.) == 1); + + assert(std::fdim(1, 0.f) == 1); + assert(std::fdim(1., 0.f) == 1); + assert(std::fdim(1.f, 0.f) == 1); +} + +__device__ void test_fma() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fma(1, 1, 1) == 2); + assert(std::fma(1., 1, 1) == 2); + assert(std::fma(1.f, 1, 1) == 2); + assert(std::fma(1, 1., 1) == 2); + assert(std::fma(1., 1., 1) == 2); + assert(std::fma(1.f, 1., 1) == 2); + assert(std::fma(1, 1.f, 1) == 2); + assert(std::fma(1., 1.f, 1) == 2); + assert(std::fma(1.f, 1.f, 1) == 2); + + assert(std::fma(1, 1, 1.) == 2); + assert(std::fma(1., 1, 1.) == 2); + assert(std::fma(1.f, 1, 1.) == 2); + assert(std::fma(1, 1., 1.) == 2); + assert(std::fma(1., 1., 1.) == 2); + assert(std::fma(1.f, 1., 1.) == 2); + assert(std::fma(1, 1.f, 1.) == 2); + assert(std::fma(1., 1.f, 1.) == 2); + assert(std::fma(1.f, 1.f, 1.) == 2); + + assert(std::fma(1, 1, 1.f) == 2); + assert(std::fma(1., 1, 1.f) == 2); + assert(std::fma(1.f, 1, 1.f) == 2); + assert(std::fma(1, 1., 1.f) == 2); + assert(std::fma(1., 1., 1.f) == 2); + assert(std::fma(1.f, 1., 1.f) == 2); + assert(std::fma(1, 1.f, 1.f) == 2); + assert(std::fma(1., 1.f, 1.f) == 2); + assert(std::fma(1.f, 1.f, 1.f) == 2); +} + +__device__ void test_fmax() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fmax(1, 0) == 1); + assert(std::fmax(1., 0) == 1); + assert(std::fmax(1.f, 0) == 1); + + assert(std::fmax(1, 0.) == 1); + assert(std::fmax(1., 0.) == 1); + assert(std::fmax(1.f, 0.) == 1); + + assert(std::fmax(1, 0.f) == 1); + assert(std::fmax(1., 0.f) == 1); + assert(std::fmax(1.f, 0.f) == 1); +} + +__device__ void test_fmin() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fmin(1, 0) == 0); + assert(std::fmin(1., 0) == 0); + assert(std::fmin(1.f, 0) == 0); + + assert(std::fmin(1, 0.) == 0); + assert(std::fmin(1., 0.) == 0); + assert(std::fmin(1.f, 0.) == 0); + + assert(std::fmin(1, 0.f) == 0); + assert(std::fmin(1., 0.f) == 0); + assert(std::fmin(1.f, 0.f) == 0); +} + +__device__ void test_hypot() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::hypot(3, 4) == 5); + assert(std::hypot(3, 4.) == 5); + assert(std::hypot(3, 4.f) == 5); + + assert(std::hypot(3., 4) == 5); + assert(std::hypot(3., 4.) == 5); + assert(std::hypot(3., 4.f) == 5); + + assert(std::hypot(3.f, 4) == 5); + assert(std::hypot(3.f, 4.) == 5); + assert(std::hypot(3.f, 4.f) == 5); + +#if TEST_STD_VER > 14 + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::hypot(2,3,6) == 7); + assert(std::hypot(1,4,8) == 9); +#endif +} + +__device__ void test_ilogb() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + // No CUDA ilogbl (takes a long double). + //static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::ilogb(1) == 0); + assert(std::ilogb(1.) == 0); + assert(std::ilogb(1.f) == 0); +} + +__device__ void test_lgamma() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::lgamma(1) == 0); +} + +__device__ void test_llrint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + // No CUDA llrintl (takes a long double). + //static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::llrint(1) == 1LL); + assert(std::llrint(1.) == 1LL); + assert(std::llrint(1.f) == 1LL); +} + +__device__ void test_llround() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + // No CUDA llroundl. + //static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::llround(1) == 1LL); + assert(std::llround(1.) == 1LL); + assert(std::llround(1.f) == 1LL); +} + +__device__ void test_log1p() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::log1p(0) == 0); + assert(std::log1p(0.) == 0); + assert(std::log1p(0.f) == 0); +} + +__device__ void test_log2() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::log2(1) == 0); + assert(std::log2(1.) == 0); + assert(std::log2(1.f) == 0); +} + +__device__ void test_logb() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::logb(1) == 0); + assert(std::logb(1.) == 0); + assert(std::logb(1.f) == 0); +} + +__device__ void test_lrint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + // No CUDA lrintl (takes a long double). + //static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::lrint(1) == 1L); + assert(std::lrint(1.) == 1L); + assert(std::lrint(1.f) == 1L); +} + +__device__ void test_lround() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + // No CUDA lroundl (takes a long double). + //static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::lround(1) == 1L); + assert(std::lround(1.) == 1L); + assert(std::lround(1.f) == 1L); +} + +__device__ void test_nan() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +} + +__device__ void test_nearbyint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::nearbyint(1) == 1); + assert(std::nearbyint(1.) == 1); + assert(std::nearbyint(1.f) == 1); +} + +__device__ void test_nextafter() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + // Invoke all our overloads, even if we can't be bothered to check the + // results. + std::nextafter(0, 1); + std::nextafter(0, 1.); + std::nextafter(0, 1.f); + + std::nextafter(0., 1); + std::nextafter(0., 1.); + std::nextafter(0., 1.f); + + std::nextafter(0.f, 1); + std::nextafter(0.f, 1.); + std::nextafter(0.f, 1.f); +} + +__device__ void test_nexttoward() +{ + static_assert((std::is_same::value), ""); + + // Invoke all our overloads, even if we can't be bothered to check the + // results. + std::nexttoward(0, 1); + std::nexttoward(0, 1.); + std::nexttoward(0, 1.f); + + std::nexttoward(0., 1); + std::nexttoward(0., 1.); + std::nexttoward(0., 1.f); + + std::nexttoward(0.f, 1); + std::nexttoward(0.f, 1.); + std::nexttoward(0.f, 1.f); +} + +__device__ void test_remainder() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::remainder(1.5, 1) == -.5); + assert(std::remainder(1.5, 1.) == -.5); + assert(std::remainder(1.5, 1.f) == -.5); + + assert(std::remainder(1.5f, 1) == -.5); + assert(std::remainder(1.5f, 1.) == -.5); + assert(std::remainder(1.5f, 1.f) == -.5); + + assert(std::remainder(2, 1) == 0); + assert(std::remainder(2, 1.) == 0); + assert(std::remainder(2, 1.f) == 0); +} + +__device__ void test_remquo() +{ + int ip; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::remquo(1, 1, &ip) == 0); + assert(std::remquo(1, 1., &ip) == 0); + assert(std::remquo(1, 1.f, &ip) == 0); + + assert(std::remquo(0.5, 1, &ip) == 0.5); + assert(std::remquo(0.5, 1., &ip) == 0.5); + assert(std::remquo(0.5, 1.f, &ip) == 0.5); + + assert(std::remquo(0.5f, 1, &ip) == 0.5); + assert(std::remquo(0.5f, 1., &ip) == 0.5); + assert(std::remquo(0.5f, 1.f, &ip) == 0.5); +} + +__device__ void test_rint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::rint(1) == 1); + assert(std::rint(1.) == 1); + assert(std::rint(1.f) == 1); +} + +__device__ void test_round() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::round(1) == 1); + assert(std::round(1.) == 1); + assert(std::round(1.f) == 1); +} + +__device__ void test_scalbln() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::scalbln(1, 1) == 2); + assert(std::scalbln(1, 1.) == 2); + assert(std::scalbln(1, 1.f) == 2); + + assert(std::scalbln(1., 1) == 2); + assert(std::scalbln(1., 1.) == 2); + assert(std::scalbln(1., 1.f) == 2); + + assert(std::scalbln(1.f, 1) == 2); + assert(std::scalbln(1.f, 1.) == 2); + assert(std::scalbln(1.f, 1.f) == 2); +} + +__device__ void test_scalbn() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::scalbn(1, 1) == 2); + assert(std::scalbn(1, 1.) == 2); + assert(std::scalbn(1, 1.f) == 2); + + assert(std::scalbn(1., 1) == 2); + assert(std::scalbn(1., 1.) == 2); + assert(std::scalbn(1., 1.f) == 2); + + assert(std::scalbn(1.f, 1) == 2); + assert(std::scalbn(1.f, 1.) == 2); + assert(std::scalbn(1.f, 1.f) == 2); +} + +__device__ void test_tgamma() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::tgamma(1) == 1); + assert(std::tgamma(1.) == 1); + assert(std::tgamma(1.f) == 1); +} + +__device__ void test_trunc() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::trunc(1) == 1); + assert(std::trunc(1.) == 1); + assert(std::trunc(1.f) == 1); +} + +__global__ void tests() +{ + test_abs(); + test_acos(); + test_asin(); + test_atan(); + test_atan2(); + test_ceil(); + test_cos(); + test_cosh(); + test_exp(); + test_fabs(); + test_floor(); + test_fmod(); + test_frexp(); + test_ldexp(); + test_log(); + test_log10(); + test_modf(); + test_pow(); + test_sin(); + test_sinh(); + test_sqrt(); + test_tan(); + test_tanh(); + test_signbit(); + test_fpclassify(); + test_isfinite(); + test_isnormal(); + test_isgreater(); + test_isgreaterequal(); + test_isinf(); + test_isless(); + test_islessequal(); + test_islessgreater(); + test_isnan(); + test_isunordered(); + test_acosh(); + test_asinh(); + test_atanh(); + test_cbrt(); + test_copysign(); + test_erf(); + test_erfc(); + test_exp2(); + test_expm1(); + test_fdim(); + test_fma(); + test_fmax(); + test_fmin(); + test_hypot(); + test_ilogb(); + test_lgamma(); + test_llrint(); + test_llround(); + test_log1p(); + test_log2(); + test_logb(); + test_lrint(); + test_lround(); + test_nan(); + test_nearbyint(); + test_nextafter(); + test_nexttoward(); + test_remainder(); + test_remquo(); + test_rint(); + test_round(); + test_scalbln(); + test_scalbn(); + test_tgamma(); + test_trunc(); +} + +int main() { + tests<<<1,1>>>(); + cudaError_t err = cudaDeviceSynchronize(); + if (err != cudaSuccess) { + printf("CUDA error %d\n", (int)err); + return 1; + } + printf("Success!\n"); + return 0; +} + +#else + +#include + +// No C++11; test is a nop. +int main() { + printf("Success!\n"); + return 0; +} + +#endif // __cplusplus < 201103L Index: test-suite/trunk/External/CUDA/cmath_reference_output =================================================================== --- test-suite/trunk/External/CUDA/cmath_reference_output +++ test-suite/trunk/External/CUDA/cmath_reference_output @@ -0,0 +1 @@ +Success! Index: test-suite/trunk/External/CUDA/math_h.cu =================================================================== --- test-suite/trunk/External/CUDA/math_h.cu +++ test-suite/trunk/External/CUDA/math_h.cu @@ -0,0 +1,1680 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// This file was copied from libc++'s test suite, then modified to test CUDA. +// For the most part, this consists of adding __device__ attributes and +// deleting long double. + +// This test requires C++11 (it's mostly decltype checks). +#if __cplusplus >= 201103L + +#include +#include +#include +#include + +// See PR21083 +// Ambiguous is a user-defined type that defines its own overloads of cmath +// functions. When the std overloads are candidates too (by using or adl), +// they should not interfere. +struct Ambiguous : std::true_type { // ADL + __device__ operator float () { return 0.f; } + __device__ operator double () { return 0.; } +}; +__device__ Ambiguous abs(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous acos(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous asin(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous atan(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous atan2(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous ceil(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous cos(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous cosh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous exp(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fabs(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous floor(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fmod(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous frexp(Ambiguous, int*){ return Ambiguous(); } +__device__ Ambiguous ldexp(Ambiguous, int){ return Ambiguous(); } +__device__ Ambiguous log(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous log10(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous modf(Ambiguous, Ambiguous*){ return Ambiguous(); } +__device__ Ambiguous pow(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous sin(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous sinh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous sqrt(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous tan(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous tanh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous signbit(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fpclassify(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isfinite(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isnormal(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isgreater(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isgreaterequal(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isless(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous islessequal(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous islessgreater(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous isunordered(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous acosh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous asinh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous atanh(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous cbrt(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous copysign(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous erf(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous erfc(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous exp2(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous expm1(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fdim(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous ilogb(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous lgamma(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous llrint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous llround(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous log1p(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous log2(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous logb(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous lrint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous lround(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous nearbyint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous nextafter(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous nexttoward(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous remainder(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous remquo(Ambiguous, Ambiguous, int*){ return Ambiguous(); } +__device__ Ambiguous rint(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous round(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous scalbln(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous scalbn(Ambiguous, Ambiguous){ return Ambiguous(); } +__device__ Ambiguous tgamma(Ambiguous){ return Ambiguous(); } +__device__ Ambiguous trunc(Ambiguous){ return Ambiguous(); } + +__device__ void test_abs() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(abs(-1) == 1); + assert(abs(-1.) == 1); + assert(abs(-1.f) == 1); +} + +__device__ void test_acos() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(acos(1) == 0); + assert(acos(1.) == 0); + assert(acos(1.f) == 0); +} + +__device__ void test_asin() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(asin(0) == 0); + assert(asin(0.) == 0); + assert(asin(0.f) == 0); +} + +__device__ void test_atan() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(atan(0) == 0); + assert(atan(0.) == 0); + assert(atan(0.f) == 0); +} + +__device__ void test_atan2() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(atan2(0, 1) == 0); + assert(atan2(0, 1.) == 0); + assert(atan2(0, 1.f) == 0); + + assert(atan2(0., 1) == 0); + assert(atan2(0., 1.) == 0); + assert(atan2(0., 1.f) == 0); + + assert(atan2(0.f, 1) == 0); + assert(atan2(0.f, 1.) == 0); + assert(atan2(0.f, 1.f) == 0); +} + +__device__ void test_ceil() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(ceil(0) == 0); + assert(ceil(0.) == 0); + assert(ceil(0.f) == 0); +} + +__device__ void test_cos() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(cos(0) == 1); + assert(cos(0.) == 1); + assert(cos(0.f) == 1); +} + +__device__ void test_cosh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(cosh(0) == 1); + assert(cosh(0.) == 1); + assert(cosh(0.f) == 1); +} + +__device__ void test_exp() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(exp(0) == 1); + assert(exp(0.) == 1); + assert(exp(0.f) == 1); +} + +__device__ void test_fabs() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(fabs(-1) == 1); + assert(fabs(-1.) == 1); + assert(fabs(-1.f) == 1); +} + +__device__ void test_floor() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(floor(1) == 1); + assert(floor(1.) == 1); + assert(floor(1.f) == 1); +} + +__device__ void test_fmod() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(fmod(1.5, 1) == .5); + assert(fmod(1.5, 1.) == .5); + assert(fmod(1.5, 1.f) == .5); + + assert(fmod(1.5f, 1) == .5); + assert(fmod(1.5f, 1.) == .5); + assert(fmod(1.5f, 1.f) == .5); + + assert(fmod(2, 1) == 0); + assert(fmod(2, 1.) == 0); + assert(fmod(2, 1.f) == 0); +} + +__device__ void test_frexp() +{ + int ip; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(frexp(0, &ip) == 0); + assert(frexp(0., &ip) == 0); + assert(frexp(0.f, &ip) == 0); +} + +__device__ void test_ldexp() +{ + int ip = 1; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(ldexp(1, ip) == 2); + assert(ldexp(1., ip) == 2); + assert(ldexp(1.f, ip) == 2); +} + +__device__ void test_log() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(log(1) == 0); + assert(log(1.) == 0); + assert(log(1.f) == 0); +} + +__device__ void test_log10() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(log10(1) == 0); + assert(log10(1.) == 0); + assert(log10(1.f) == 0); +} + +__device__ void test_modf() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + double i; + assert(modf(1, &i) == 0); + assert(modf(1., &i) == 0); + assert(modf(1.f, &i) == 0); +} + +__device__ void test_pow() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(pow(1, 1) == 1); + assert(pow(1., 1) == 1); + assert(pow(1.f, 1) == 1); + + assert(pow(1, 1.) == 1); + assert(pow(1., 1.) == 1); + assert(pow(1.f, 1.) == 1); + + assert(pow(1, 1.f) == 1); + assert(pow(1., 1.f) == 1); + assert(pow(1.f, 1.f) == 1); +} + +__device__ void test_sin() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(sin(0) == 0); + assert(sin(0.) == 0); + assert(sin(0.f) == 0); +} + +__device__ void test_sinh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(sinh(0) == 0); + assert(sinh(0.) == 0); + assert(sinh(0.f) == 0); +} + +__device__ void test_sqrt() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(sqrt(4) == 2); + assert(sqrt(4.) == 2); + assert(sqrt(4.f) == 2); +} + +__device__ void test_tan() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(tan(0) == 0); + assert(tan(0.) == 0); + assert(tan(0.f) == 0); +} + +__device__ void test_tanh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(tanh(0) == 0); + assert(tanh(0.) == 0); + assert(tanh(0.f) == 0); +} + +__device__ void test_signbit() +{ +#ifdef signbit +#error signbit defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(signbit(-1) == true); + assert(signbit(-1.) == true); + assert(signbit(-1.f) == true); +} + +__device__ void test_fpclassify() +{ +#ifdef fpclassify +#error fpclassify defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(fpclassify(-1) == FP_NORMAL); + assert(fpclassify(-1.) == FP_NORMAL); + assert(fpclassify(-1.f) == FP_NORMAL); +} + +__device__ void test_isfinite() +{ +#ifdef isfinite +#error isfinite defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(isfinite(-1) == true); + assert(isfinite(-1.) == true); + assert(isfinite(-1.f) == true); +} + +__device__ void test_isnormal() +{ +#ifdef isnormal +#error isnormal defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isnormal(-1) == true); + assert(std::isnormal(-1.) == true); + assert(std::isnormal(-1.f) == true); +} + +__device__ void test_isgreater() +{ +#ifdef isgreater +#error isgreater defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isgreater(-1, 0) == false); + assert(std::isgreater(-1, 0.) == false); + assert(std::isgreater(-1, 0.f) == false); + + assert(std::isgreater(-1., 0) == false); + assert(std::isgreater(-1., 0.) == false); + assert(std::isgreater(-1., 0.f) == false); + + assert(std::isgreater(-1.f, 0) == false); + assert(std::isgreater(-1.f, 0.) == false); + assert(std::isgreater(-1.f, 0.f) == false); +} + +__device__ void test_isgreaterequal() +{ +#ifdef isgreaterequal +#error isgreaterequal defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isgreaterequal(-1, 0) == false); + assert(std::isgreaterequal(-1, 0.) == false); + assert(std::isgreaterequal(-1, 0.f) == false); + + assert(std::isgreaterequal(-1., 0) == false); + assert(std::isgreaterequal(-1., 0.) == false); + assert(std::isgreaterequal(-1., 0.f) == false); + + assert(std::isgreaterequal(-1.f, 0) == false); + assert(std::isgreaterequal(-1.f, 0.) == false); + assert(std::isgreaterequal(-1.f, 0.f) == false); +} + +__device__ void test_isinf() +{ +#ifdef isinf +#error isinf defined +#endif + static_assert((std::is_same::value), ""); + + typedef decltype(isinf((double)0)) DoubleRetType; +#ifndef __linux__ + static_assert((std::is_same::value), ""); +#else + // GLIBC < 2.26 defines 'isinf(double)' with a return type of 'int' in + // all C++ dialects. The test should tolerate this. + // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439 + static_assert((std::is_same::value + || std::is_same::value), ""); +#endif + + static_assert((std::is_same::value), ""); + assert(std::isinf(-1) == false); + assert(std::isinf(-1.) == false); + assert(std::isinf(-1.f) == false); +} + +__device__ void test_isless() +{ +#ifdef isless +#error isless defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isless(-1, 0) == true); + assert(std::isless(-1, 0.) == true); + assert(std::isless(-1, 0.f) == true); + + assert(std::isless(-1., 0) == true); + assert(std::isless(-1., 0.) == true); + assert(std::isless(-1., 0.f) == true); + + assert(std::isless(-1.f, 0) == true); + assert(std::isless(-1.f, 0.) == true); + assert(std::isless(-1.f, 0.f) == true); +} + +__device__ void test_islessequal() +{ +#ifdef islessequal +#error islessequal defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::islessequal(-1, 0) == true); + assert(std::islessequal(-1, 0.) == true); + assert(std::islessequal(-1, 0.f) == true); + + assert(std::islessequal(-1., 0) == true); + assert(std::islessequal(-1., 0.) == true); + assert(std::islessequal(-1., 0.f) == true); + + assert(std::islessequal(-1.f, 0) == true); + assert(std::islessequal(-1.f, 0.) == true); + assert(std::islessequal(-1.f, 0.f) == true); +} + +__device__ void test_islessgreater() +{ +#ifdef islessgreater +#error islessgreater defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::islessgreater(-1, 0) == true); + assert(std::islessgreater(-1, 0.) == true); + assert(std::islessgreater(-1, 0.f) == true); + + assert(std::islessgreater(-1., 0) == true); + assert(std::islessgreater(-1., 0.) == true); + assert(std::islessgreater(-1., 0.f) == true); + + assert(std::islessgreater(-1.f, 0) == true); + assert(std::islessgreater(-1.f, 0.) == true); + assert(std::islessgreater(-1.f, 0.f) == true); +} + +__device__ void test_isnan() +{ +#ifdef isnan +#error isnan defined +#endif + static_assert((std::is_same::value), ""); + + typedef decltype(isnan((double)0)) DoubleRetType; +#ifndef __linux__ + static_assert((std::is_same::value), ""); +#else + // GLIBC < 2.26 defines 'isnan(double)' with a return type of 'int' in + // all C++ dialects. The test should tolerate this. + // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439 + static_assert((std::is_same::value + || std::is_same::value), ""); +#endif + + static_assert((std::is_same::value), ""); + assert(std::isnan(-1) == false); + assert(std::isnan(-1.) == false); + assert(std::isnan(-1.f) == false); +} + +__device__ void test_isunordered() +{ +#ifdef isunordered +#error isunordered defined +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::isunordered(-1, 0) == false); + assert(std::isunordered(-1, 0.) == false); + assert(std::isunordered(-1, 0.f) == false); + + assert(std::isunordered(-1., 0) == false); + assert(std::isunordered(-1., 0.) == false); + assert(std::isunordered(-1., 0.f) == false); + + assert(std::isunordered(-1.f, 0) == false); + assert(std::isunordered(-1.f, 0.) == false); + assert(std::isunordered(-1.f, 0.f) == false); +} + +__device__ void test_acosh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::acosh(1) == 0); + assert(std::acosh(1.) == 0); + assert(std::acosh(1.f) == 0); +} + +__device__ void test_asinh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(asinh(0) == 0); + assert(asinh(0.) == 0); + assert(asinh(0.f) == 0); +} + +__device__ void test_atanh() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(atanh(0) == 0); + assert(atanh(0.) == 0); + assert(atanh(0.f) == 0); +} + +__device__ void test_cbrt() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(cbrt(1) == 1); + assert(cbrt(1.) == 1); + assert(cbrt(1.f) == 1); +} + +__device__ void test_copysign() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + // CUDA's copysign(float, double) currently returns a float, in violation + // of the spec. We can't easily change this, so accept either one. + static_assert( + (std::is_same::value || + std::is_same::value), + ""); + + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::copysign(1, 1) == 1); + assert(std::copysign(1., 1) == 1); + assert(std::copysign(1.f, 1) == 1); + + assert(std::copysign(1, 1.) == 1); + assert(std::copysign(1., 1.) == 1); + assert(std::copysign(1.f, 1.) == 1); + + assert(std::copysign(1, 1.f) == 1); + assert(std::copysign(1., 1.f) == 1); + assert(std::copysign(1.f, 1.f) == 1); +} + +__device__ void test_erf() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(erf(0) == 0); + assert(erf(0.) == 0); + assert(erf(0.f) == 0); +} + +__device__ void test_erfc() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(erfc(0) == 1); + assert(erfc(0.) == 1); + assert(erfc(0.f) == 1); +} + +__device__ void test_exp2() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(exp2(1) == 2); + assert(exp2(1.) == 2); + assert(exp2(1.f) == 2); +} + +__device__ void test_expm1() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(expm1(0) == 0); + assert(expm1(0.) == 0); + assert(expm1(0.f) == 0); +} + +__device__ void test_fdim() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fdim(1, 0) == 1); + assert(std::fdim(1., 0) == 1); + assert(std::fdim(1.f, 0) == 1); + + assert(std::fdim(1, 0.) == 1); + assert(std::fdim(1., 0.) == 1); + assert(std::fdim(1.f, 0.) == 1); + + assert(std::fdim(1, 0.f) == 1); + assert(std::fdim(1., 0.f) == 1); + assert(std::fdim(1.f, 0.f) == 1); +} + +__device__ void test_fma() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fma(1, 1, 1) == 2); + assert(std::fma(1., 1, 1) == 2); + assert(std::fma(1.f, 1, 1) == 2); + assert(std::fma(1, 1., 1) == 2); + assert(std::fma(1., 1., 1) == 2); + assert(std::fma(1.f, 1., 1) == 2); + assert(std::fma(1, 1.f, 1) == 2); + assert(std::fma(1., 1.f, 1) == 2); + assert(std::fma(1.f, 1.f, 1) == 2); + + assert(std::fma(1, 1, 1.) == 2); + assert(std::fma(1., 1, 1.) == 2); + assert(std::fma(1.f, 1, 1.) == 2); + assert(std::fma(1, 1., 1.) == 2); + assert(std::fma(1., 1., 1.) == 2); + assert(std::fma(1.f, 1., 1.) == 2); + assert(std::fma(1, 1.f, 1.) == 2); + assert(std::fma(1., 1.f, 1.) == 2); + assert(std::fma(1.f, 1.f, 1.) == 2); + + assert(std::fma(1, 1, 1.f) == 2); + assert(std::fma(1., 1, 1.f) == 2); + assert(std::fma(1.f, 1, 1.f) == 2); + assert(std::fma(1, 1., 1.f) == 2); + assert(std::fma(1., 1., 1.f) == 2); + assert(std::fma(1.f, 1., 1.f) == 2); + assert(std::fma(1, 1.f, 1.f) == 2); + assert(std::fma(1., 1.f, 1.f) == 2); + assert(std::fma(1.f, 1.f, 1.f) == 2); +} + +__device__ void test_fmax() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fmax(1, 0) == 1); + assert(std::fmax(1., 0) == 1); + assert(std::fmax(1.f, 0) == 1); + + assert(std::fmax(1, 0.) == 1); + assert(std::fmax(1., 0.) == 1); + assert(std::fmax(1.f, 0.) == 1); + + assert(std::fmax(1, 0.f) == 1); + assert(std::fmax(1., 0.f) == 1); + assert(std::fmax(1.f, 0.f) == 1); +} + +__device__ void test_fmin() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::fmin(1, 0) == 0); + assert(std::fmin(1., 0) == 0); + assert(std::fmin(1.f, 0) == 0); + + assert(std::fmin(1, 0.) == 0); + assert(std::fmin(1., 0.) == 0); + assert(std::fmin(1.f, 0.) == 0); + + assert(std::fmin(1, 0.f) == 0); + assert(std::fmin(1., 0.f) == 0); + assert(std::fmin(1.f, 0.f) == 0); +} + +__device__ void test_hypot() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::hypot(3, 4) == 5); + assert(std::hypot(3, 4.) == 5); + assert(std::hypot(3, 4.f) == 5); + + assert(std::hypot(3., 4) == 5); + assert(std::hypot(3., 4.) == 5); + assert(std::hypot(3., 4.f) == 5); + + assert(std::hypot(3.f, 4) == 5); + assert(std::hypot(3.f, 4.) == 5); + assert(std::hypot(3.f, 4.f) == 5); +} + +__device__ void test_ilogb() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(ilogb(1) == 0); + assert(ilogb(1.) == 0); + assert(ilogb(1.f) == 0); +} + +__device__ void test_lgamma() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(lgamma(1) == 0); + assert(lgamma(1.) == 0); + assert(lgamma(1.f) == 0); +} + +__device__ void test_llrint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(llrint(1) == 1LL); + assert(llrint(1.) == 1LL); + assert(llrint(1.f) == 1LL); +} + +__device__ void test_llround() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(llround(1) == 1LL); + assert(llround(1.) == 1LL); + assert(llround(1.f) == 1LL); +} + +__device__ void test_log1p() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(log1p(0) == 0); + assert(log1p(0.) == 0); + assert(log1p(0.f) == 0); +} + +__device__ void test_log2() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(log2(1) == 0); + assert(log2(1.) == 0); + assert(log2(1.f) == 0); +} + +__device__ void test_logb() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(logb(1) == 0); + assert(logb(1.) == 0); + assert(logb(1.f) == 0); +} + +__device__ void test_lrint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(lrint(1) == 1L); + assert(lrint(1.) == 1L); + assert(lrint(1.f) == 1L); +} + +__device__ void test_lround() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(lround(1) == 1L); + assert(lround(1.) == 1L); + assert(lround(1.f) == 1L); +} + +__device__ void test_nan() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +} + +__device__ void test_nearbyint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(nearbyint(1) == 1); + assert(nearbyint(1.) == 1); + assert(nearbyint(1.f) == 1); +} + +__device__ void test_nextafter() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + //assert(nextafter(0,1) == hexfloat(0x1, 0, -1074)); + + // Invoke all our overloads, even if we can't be bothered to check the + // results. + nextafter(0, 1); + nextafter(0, 1.); + nextafter(0, 1.f); + + nextafter(0., 1); + nextafter(0., 1.); + nextafter(0., 1.f); + + nextafter(0.f, 1); + nextafter(0.f, 1.); + nextafter(0.f, 1.f); +} + +__device__ void test_nexttoward() +{ + static_assert((std::is_same::value), ""); + //assert(nexttoward(0, 1) == hexfloat(0x1, 0, -1074)); + + // Invoke all our overloads, even if we can't be bothered to check the + // results. + nexttoward(0, 1); + nexttoward(0, 1.); + nexttoward(0, 1.f); + + nexttoward(0., 1); + nexttoward(0., 1.); + nexttoward(0., 1.f); + + nexttoward(0.f, 1); + nexttoward(0.f, 1.); + nexttoward(0.f, 1.f); +} + +__device__ void test_remainder() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::remainder(1.5, 1) == -.5); + assert(std::remainder(1.5, 1.) == -.5); + assert(std::remainder(1.5, 1.f) == -.5); + + assert(std::remainder(1.5f, 1) == -.5); + assert(std::remainder(1.5f, 1.) == -.5); + assert(std::remainder(1.5f, 1.f) == -.5); + + assert(std::remainder(2, 1) == 0); + assert(std::remainder(2, 1.) == 0); + assert(std::remainder(2, 1.f) == 0); +} + +__device__ void test_remquo() +{ + int ip; + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + + assert(std::remquo(1, 1, &ip) == 0); + assert(std::remquo(1, 1., &ip) == 0); + assert(std::remquo(1, 1.f, &ip) == 0); + + assert(std::remquo(0.5, 1, &ip) == 0.5); + assert(std::remquo(0.5, 1., &ip) == 0.5); + assert(std::remquo(0.5, 1.f, &ip) == 0.5); + + assert(std::remquo(0.5f, 1, &ip) == 0.5); + assert(std::remquo(0.5f, 1., &ip) == 0.5); + assert(std::remquo(0.5f, 1.f, &ip) == 0.5); +} + +__device__ void test_rint() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(rint(1) == 1); + assert(rint(1.) == 1); + assert(rint(1.f) == 1); +} + +__device__ void test_round() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(round(1) == 1); + assert(round(1.) == 1); + assert(round(1.f) == 1); +} + +__device__ void test_scalbln() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::scalbln(1, 1) == 2); + assert(std::scalbln(1, 1.) == 2); + assert(std::scalbln(1, 1.f) == 2); + + assert(std::scalbln(1., 1) == 2); + assert(std::scalbln(1., 1.) == 2); + assert(std::scalbln(1., 1.f) == 2); + + assert(std::scalbln(1.f, 1) == 2); + assert(std::scalbln(1.f, 1.) == 2); + assert(std::scalbln(1.f, 1.f) == 2); +} + +__device__ void test_scalbn() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(std::scalbn(1, 1) == 2); + assert(std::scalbn(1, 1.) == 2); + assert(std::scalbn(1, 1.f) == 2); + + assert(std::scalbn(1., 1) == 2); + assert(std::scalbn(1., 1.) == 2); + assert(std::scalbn(1., 1.f) == 2); + + assert(std::scalbn(1.f, 1) == 2); + assert(std::scalbn(1.f, 1.) == 2); + assert(std::scalbn(1.f, 1.f) == 2); +} + +__device__ void test_tgamma() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(tgamma(1) == 1); + assert(tgamma(1.) == 1); + assert(tgamma(1.f) == 1); +} + +__device__ void test_trunc() +{ + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + assert(trunc(1) == 1); + assert(trunc(1.) == 1); + assert(trunc(1.f) == 1); +} + +__global__ void tests() +{ + test_abs(); + test_acos(); + test_asin(); + test_atan(); + test_atan2(); + test_ceil(); + test_cos(); + test_cosh(); + test_exp(); + test_fabs(); + test_floor(); + test_fmod(); + test_frexp(); + test_ldexp(); + test_log(); + test_log10(); + test_modf(); + test_pow(); + test_sin(); + test_sinh(); + test_sqrt(); + test_tan(); + test_tanh(); + test_signbit(); + test_fpclassify(); + test_isfinite(); + test_isnormal(); + test_isgreater(); + test_isgreaterequal(); + test_isinf(); + test_isless(); + test_islessequal(); + test_islessgreater(); + test_isnan(); + test_isunordered(); + test_acosh(); + test_asinh(); + test_atanh(); + test_cbrt(); + test_copysign(); + test_erf(); + test_erfc(); + test_exp2(); + test_expm1(); + test_fdim(); + test_fma(); + test_fmax(); + test_fmin(); + test_hypot(); + test_ilogb(); + test_lgamma(); + test_llrint(); + test_llround(); + test_log1p(); + test_log2(); + test_logb(); + test_lrint(); + test_lround(); + test_nan(); + test_nearbyint(); + test_nextafter(); + test_nexttoward(); + test_remainder(); + test_remquo(); + test_rint(); + test_round(); + test_scalbln(); + test_scalbn(); + test_tgamma(); + test_trunc(); +} + +int main() { + tests<<<1,1>>>(); + cudaError_t err = cudaDeviceSynchronize(); + if (err != cudaSuccess) { + printf("CUDA error %d\n", (int)err); + return 1; + } + printf("Success!\n"); + return 0; +} + + +#else + +#include + +// No C++11; test is a nop. +int main() { + printf("Success!\n"); + return 0; +} + +#endif // __cplusplus < 201103L Index: test-suite/trunk/External/CUDA/math_h_reference_output =================================================================== --- test-suite/trunk/External/CUDA/math_h_reference_output +++ test-suite/trunk/External/CUDA/math_h_reference_output @@ -0,0 +1 @@ +Success!