86 lines · c
1// RUN: %libomp-compile-and-run2// UNSUPPORTED: gnu3 4#include <stdio.h>5#include <stdlib.h>6#include <omp.h>7#define NTH 88#define AL0 649#define AL1 12810 11int main()12{13 int err = 0;14 omp_alloctrait_t at[3];15 omp_allocator_handle_t a;16 void *p[NTH];17 at[0].key = omp_atk_pool_size;18 at[0].value = 16*1024*1024;19 at[1].key = omp_atk_fallback;20 at[1].value = omp_atv_null_fb;21 a = omp_init_allocator(omp_large_cap_mem_space, 2, at);22 printf("allocator large created: %p\n", (void *)a);23 #pragma omp parallel num_threads(8)24 {25 int i = omp_get_thread_num();26 p[i] = omp_aligned_calloc(AL0, 1024*128, 8, a); // API's alignment only27 #pragma omp barrier28 printf("th %d, ptr %p\n", i, p[i]);29 if ((size_t)p[i] % AL0) {30 #pragma omp atomic31 err++;32 printf("Error param: th %d, ptr %p is not %d-byte aligned\n",33 i, p[i], AL0);34 }35 omp_free(p[i], a);36 }37 omp_destroy_allocator(a);38 at[2].key = omp_atk_alignment;39 at[2].value = AL1;40 a = omp_init_allocator(omp_large_cap_mem_space, 3, at);41 printf("allocator large aligned %d created: %p\n", AL1, (void *)a);42 if (a != omp_null_allocator)43 #pragma omp parallel num_threads(8)44 {45 int i = omp_get_thread_num();46 p[i] = omp_aligned_calloc(AL0, 1024*128, 8, a); // allocator's alignment wins47 #pragma omp barrier48 printf("th %d, ptr %p\n", i, p[i]);49 if ((size_t)p[i] % AL1) {50 #pragma omp atomic51 err++;52 printf("Error allocator: th %d, ptr %p is not %d-byte aligned\n",53 i, p[i], AL1);54 }55 omp_free(p[i], a);56 }57 omp_destroy_allocator(a);58 at[2].key = omp_atk_alignment;59 at[2].value = AL0;60 a = omp_init_allocator(omp_large_cap_mem_space, 3, at);61 printf("allocator large aligned %d created: %p\n", AL0, (void *)a);62 #pragma omp parallel num_threads(8)63 {64 int i = omp_get_thread_num();65 p[i] = omp_aligned_calloc(AL1, 1024*128, 8, a); // API's alignment wins66 #pragma omp barrier67 printf("th %d, ptr %p\n", i, p[i]);68 if ((size_t)p[i] % AL1) {69 #pragma omp atomic70 err++;71 printf("Error param: th %d, ptr %p is not %d-byte aligned\n",72 i, p[i], AL1);73 }74 omp_free(p[i], a);75 }76 omp_destroy_allocator(a);77 78 if (err == 0) {79 printf("passed\n");80 return 0;81 } else {82 printf("failed\n");83 return 1;84 }85}86