// RUN: %libomptarget-compilexx-run-and-check-generic // // UNSUPPORTED: x86_64-pc-linux-gnu // UNSUPPORTED: x86_64-pc-linux-gnu-LTO // UNSUPPORTED: aarch64-unknown-linux-gnu // UNSUPPORTED: aarch64-unknown-linux-gnu-LTO // UNSUPPORTED: s390x-ibm-linux-gnu // UNSUPPORTED: s390x-ibm-linux-gnu-LTO #include #include #include #include #include #include #include template ::value, bool> = true> bool equal(T LHS, T RHS) { return LHS == RHS; } template ::value, bool> = true> bool equal(T LHS, T RHS) { return std::abs(LHS - RHS) < std::numeric_limits::epsilon(); } template void test() { constexpr const int num_blocks = 1; constexpr const int block_size = 256; constexpr const int N = num_blocks * block_size; int *res = new int[N]; #pragma omp target teams ompx_bare num_teams(num_blocks) thread_limit(block_size) \ map(from: res[0:N]) { int tid = ompx_thread_id_x(); T val = ompx::shfl_down_sync(~0U, static_cast(tid), 1); #ifdef __AMDGCN_WAVEFRONT_SIZE int warp_size = __AMDGCN_WAVEFRONT_SIZE; #else int warp_size = 32; #endif if ((tid & (warp_size - 1)) != warp_size - 1) res[tid] = equal(val, static_cast(tid + 1)); else res[tid] = equal(val, static_cast(tid)); } for (int i = 0; i < N; ++i) assert(res[i]); delete[] res; } int main(int argc, char *argv[]) { test(); test(); test(); test(); // CHECK: PASS printf("PASS\n"); return 0; }