llvm-project/openmp/libomptarget/test/offloading/taskloop_offload_nowait.cpp
Joseph Huber d5d836635c [Libomptarget] Add test config for compiling in LTO-mode
We are planning on making LTO the default compilation mode for
offloading. In order to make sure it works we should run these tests on
the test suite. AMDGPU already uses the LTO compilation path for its
linking, but in LTO mode it also links the static library late.

Performing LTO requires the static library to be built, if we make the
change this will be a hard requirement and the old bitcode library will
go away. This means users will need to use either a two-step build or a
runtimes build for libomptarget.

Reviewed By: JonChesterfield

Differential Revision: https://reviews.llvm.org/D127512
2022-06-14 10:16:03 -04:00

45 lines
1.1 KiB
C++

// RUN: %libomptarget-compilexx-and-run-generic
// UNSUPPORTED: x86_64-pc-linux-gnu
// UNSUPPORTED: x86_64-pc-linux-gnu-oldDriver
// UNSUPPORTED: x86_64-pc-linux-gnu-LTO
#include <cmath>
#include <cstdlib>
#include <iostream>
bool almost_equal(float x, float gold, float tol) {
if (std::signbit(x) != std::signbit(gold))
x = std::abs(gold) - std::abs(x);
return std::abs(gold) * (1 - tol) <= std::abs(x) &&
std::abs(x) <= std::abs(gold) * (1 + tol);
}
int main(int argc, char *argv[]) {
constexpr const int N0{2};
constexpr const int N1{182};
constexpr const float expected_value{N0 * N1};
float counter_N0{};
#pragma omp target data map(tofrom : counter_N0)
{
#pragma omp taskloop shared(counter_N0)
for (int i0 = 0; i0 < N0; i0++) {
#pragma omp target teams distribute parallel for map(tofrom : counter_N0) nowait
for (int i1 = 0; i1 < N1; i1++) {
#pragma omp atomic update
counter_N0 = counter_N0 + 1.;
}
}
}
if (!almost_equal(counter_N0, expected_value, 0.1)) {
std::cerr << "Expected: " << expected_value << " Got: " << counter_N0
<< '\n';
return -1;
}
return 0;
}