// RUN: %libomptarget-compilexx-generic && %libomptarget-run-generic // RUN: %libomptarget-compilexx-generic -O3 && %libomptarget-run-generic // RUN: %libomptarget-compilexx-generic -O3 -ffast-math && \ // RUN: %libomptarget-run-generic // FIXME: This fails to link due to missing math symbols. We should provide the // needed math functions in the GPU `libm` and require the GPU C library. // UNSUPPORTED: amdgcn-amd-amdhsa // UNSUPPORTED: nvptx64-nvidia-cuda-LTO #include #include #include template void test_map() { std::complex a(0.2, 1), a_check; #pragma omp target map(from : a_check) { a_check = a; } assert(std::abs(a - a_check) < 1e-6); } template void test_plus(AT a, BT b) { std::complex c, c_host; c_host = a + b; #pragma omp target map(from : c) { c = a + b; } assert(std::abs(c - c_host) < 1e-6); } template void test_minus(AT a, BT b) { std::complex c, c_host; c_host = a - b; #pragma omp target map(from : c) { c = a - b; } assert(std::abs(c - c_host) < 1e-6); } template void test_mul(AT a, BT b) { std::complex c, c_host; c_host = a * b; #pragma omp target map(from : c) { c = a * b; } assert(std::abs(c - c_host) < 1e-6); } template void test_div(AT a, BT b) { std::complex c, c_host; c_host = a / b; #pragma omp target map(from : c) { c = a / b; } assert(std::abs(c - c_host) < 1e-6); } template void test_complex() { test_map(); test_plus(std::complex(0, 1), std::complex(0.5, 0.3)); test_plus(std::complex(0, 1), T(0.5)); test_plus(T(0.5), std::complex(0, 1)); test_minus(std::complex(0, 1), std::complex(0.5, 0.3)); test_minus(std::complex(0, 1), T(0.5)); test_minus(T(0.5), std::complex(0, 1)); test_mul(std::complex(0, 1), std::complex(0.5, 0.3)); test_mul(std::complex(0, 1), T(0.5)); test_mul(T(0.5), std::complex(0, 1)); test_div(std::complex(0, 1), std::complex(0.5, 0.3)); test_div(std::complex(0, 1), T(0.5)); test_div(T(0.5), std::complex(0, 1)); } int main() { std::cout << "Testing float" << std::endl; test_complex(); std::cout << "Testing double" << std::endl; test_complex(); return 0; }