90 lines · cpp
1// RUN: %libomptarget-compilexx-generic && %libomptarget-run-generic2// RUN: %libomptarget-compilexx-generic -O3 && %libomptarget-run-generic3// RUN: %libomptarget-compilexx-generic -O3 -ffast-math && \4// RUN: %libomptarget-run-generic5 6// FIXME: This fails to link due to missing math symbols. We should provide the7// needed math functions in the GPU `libm` and require the GPU C library.8// UNSUPPORTED: amdgcn-amd-amdhsa9// UNSUPPORTED: nvptx64-nvidia-cuda-LTO10 11#include <cassert>12#include <complex>13#include <iostream>14 15template <typename T> void test_map() {16 std::complex<T> a(0.2, 1), a_check;17#pragma omp target map(from : a_check)18 { a_check = a; }19 20 assert(std::abs(a - a_check) < 1e-6);21}22 23template <typename RT, typename AT, typename BT> void test_plus(AT a, BT b) {24 std::complex<RT> c, c_host;25 26 c_host = a + b;27#pragma omp target map(from : c)28 { c = a + b; }29 30 assert(std::abs(c - c_host) < 1e-6);31}32 33template <typename RT, typename AT, typename BT> void test_minus(AT a, BT b) {34 std::complex<RT> c, c_host;35 36 c_host = a - b;37#pragma omp target map(from : c)38 { c = a - b; }39 40 assert(std::abs(c - c_host) < 1e-6);41}42 43template <typename RT, typename AT, typename BT> void test_mul(AT a, BT b) {44 std::complex<RT> c, c_host;45 46 c_host = a * b;47#pragma omp target map(from : c)48 { c = a * b; }49 50 assert(std::abs(c - c_host) < 1e-6);51}52 53template <typename RT, typename AT, typename BT> void test_div(AT a, BT b) {54 std::complex<RT> c, c_host;55 56 c_host = a / b;57#pragma omp target map(from : c)58 { c = a / b; }59 60 assert(std::abs(c - c_host) < 1e-6);61}62 63template <typename T> void test_complex() {64 test_map<T>();65 66 test_plus<T>(std::complex<T>(0, 1), std::complex<T>(0.5, 0.3));67 test_plus<T>(std::complex<T>(0, 1), T(0.5));68 test_plus<T>(T(0.5), std::complex<T>(0, 1));69 70 test_minus<T>(std::complex<T>(0, 1), std::complex<T>(0.5, 0.3));71 test_minus<T>(std::complex<T>(0, 1), T(0.5));72 test_minus<T>(T(0.5), std::complex<T>(0, 1));73 74 test_mul<T>(std::complex<T>(0, 1), std::complex<T>(0.5, 0.3));75 test_mul<T>(std::complex<T>(0, 1), T(0.5));76 test_mul<T>(T(0.5), std::complex<T>(0, 1));77 78 test_div<T>(std::complex<T>(0, 1), std::complex<T>(0.5, 0.3));79 test_div<T>(std::complex<T>(0, 1), T(0.5));80 test_div<T>(T(0.5), std::complex<T>(0, 1));81}82 83int main() {84 std::cout << "Testing float" << std::endl;85 test_complex<float>();86 std::cout << "Testing double" << std::endl;87 test_complex<double>();88 return 0;89}90