Previously an opt-in flag `-fopenmp-new-driver` was used to enable the new offloading driver. After passing tests for a few months it should be sufficiently mature to flip the switch and make it the default. The new offloading driver is now enabled if there is OpenMP and OpenMP offloading present and the new `-fno-openmp-new-driver` is not present. The new offloading driver has three main benefits over the old method: - Static library support - Device-side LTO - Unified clang driver stages Depends on D122683 Differential Revision: https://reviews.llvm.org/D122831
54 lines
1.1 KiB
C++
54 lines
1.1 KiB
C++
// RUN: %libomptarget-compilexx-run-and-check-generic
|
|
|
|
// Error on the gpu that crashes the host
|
|
// UNSUPPORTED: amdgcn-amd-amdhsa
|
|
// UNSUPPORTED: amdgcn-amd-amdhsa-oldDriver
|
|
|
|
#include <iostream>
|
|
|
|
template <typename LOOP_BODY>
|
|
inline void forall(int Begin, int End, LOOP_BODY LoopBody) {
|
|
#pragma omp target parallel for schedule(static)
|
|
for (int I = Begin; I < End; ++I) {
|
|
LoopBody(I);
|
|
}
|
|
}
|
|
|
|
#define N (1000)
|
|
|
|
//
|
|
// Demonstration of the RAJA abstraction using lambdas
|
|
// Requires data mapping onto the target section
|
|
//
|
|
int main() {
|
|
double A[N], B[N], C[N];
|
|
|
|
for (int I = 0; I < N; I++) {
|
|
A[I] = I + 1;
|
|
B[I] = -I;
|
|
C[I] = -9;
|
|
}
|
|
|
|
#pragma omp target data map(tofrom : C [0:N]) map(to : A [0:N], B [0:N])
|
|
{
|
|
forall(0, N, [&](int I) { C[I] += A[I] + B[I]; });
|
|
}
|
|
|
|
int Fail = 0;
|
|
for (int I = 0; I < N; I++) {
|
|
if (C[I] != -8) {
|
|
std::cout << "Failed at " << I << " with val " << C[I] << std::endl;
|
|
Fail = 1;
|
|
}
|
|
}
|
|
|
|
// CHECK: Succeeded
|
|
if (Fail) {
|
|
std::cout << "Failed" << std::endl;
|
|
} else {
|
|
std::cout << "Succeeded" << std::endl;
|
|
}
|
|
|
|
return 0;
|
|
}
|