Joachim Jenke fe7f620ed6 [OpenMP][Tests][NFC] Mark unsupported libomp tests for GCC
This patch properly marks the support level for libomp test when testing with
GCC.

Some new OpenMP features were only introduced with GCC 11.
Tests using the target construct are incompatibe with GCC.

Tests pass now with GCC 10, 11, 12
2023-05-23 10:33:09 +02:00

59 lines
1.4 KiB
C

// This test is adapted from test_parallel_for_allocate.c in SOLLVE V&V.
// https://github.com/SOLLVE/sollve_vv/blob/master/tests/5.0/parallel_for/test_parallel_for_allocate.c
// RUN: %libomp-compile-and-run
// Support for allocate was added in GCC 11
// UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7, gcc-8, gcc-9, gcc-10
#include <omp.h>
#include <assert.h>
#include <stdlib.h>
#define N 128
int main(int argc, char *argv[]) {
int errors = 0;
int *x;
int result[N][N];
int successful_alloc = 0;
omp_memspace_handle_t x_memspace = omp_default_mem_space;
omp_alloctrait_t x_traits[1] = {omp_atk_alignment, 64};
omp_allocator_handle_t x_alloc = omp_init_allocator(x_memspace, 1, x_traits);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
result[i][j] = -1;
}
}
#pragma omp parallel for allocate(x_alloc: x) private(x) shared(result)
for (int i = 0; i < N; i++) {
x = (int *)malloc(N * sizeof(int));
if (x != NULL) {
#pragma omp simd simdlen(16) aligned(x : 64)
for (int j = 0; j < N; j++) {
x[j] = j * i;
}
for (int j = 0; j < N; j++) {
result[i][j] = x[j];
}
free(x);
successful_alloc++;
}
}
errors += successful_alloc < 1;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
errors += result[i][j] != i * j;
}
}
omp_destroy_allocator(x_alloc);
return errors;
}