59 lines · c
1// This test is adapted from test_parallel_for_allocate.c in SOLLVE V&V.2// https://github.com/SOLLVE/sollve_vv/blob/master/tests/5.0/parallel_for/test_parallel_for_allocate.c3// RUN: %libomp-compile-and-run4 5// Support for allocate was added in GCC 116// UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7, gcc-8, gcc-9, gcc-107 8#include <omp.h>9 10#include <assert.h>11#include <stdlib.h>12 13#define N 12814 15int main(int argc, char *argv[]) {16 int errors = 0;17 int *x;18 int result[N][N];19 int successful_alloc = 0;20 21 omp_memspace_handle_t x_memspace = omp_default_mem_space;22 omp_alloctrait_t x_traits[1] = {omp_atk_alignment, 64};23 omp_allocator_handle_t x_alloc = omp_init_allocator(x_memspace, 1, x_traits);24 25 for (int i = 0; i < N; i++) {26 for (int j = 0; j < N; j++) {27 result[i][j] = -1;28 }29 }30 31#pragma omp parallel for allocate(x_alloc: x) private(x) shared(result)32 for (int i = 0; i < N; i++) {33 x = (int *)malloc(N * sizeof(int));34 if (x != NULL) {35#pragma omp simd simdlen(16) aligned(x : 64)36 for (int j = 0; j < N; j++) {37 x[j] = j * i;38 }39 for (int j = 0; j < N; j++) {40 result[i][j] = x[j];41 }42 free(x);43 successful_alloc++;44 }45 }46 47 errors += successful_alloc < 1;48 49 for (int i = 0; i < N; i++) {50 for (int j = 0; j < N; j++) {51 errors += result[i][j] != i * j;52 }53 }54 55 omp_destroy_allocator(x_alloc);56 57 return errors;58}59