1 // RUN: %libomp-compile-and-run 2 // UNSUPPORTED: gnu 3 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <omp.h> 7 #define NTH 8 8 #define AL0 64 9 #define AL1 128 10 11 int 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_alloc(AL0, 1024 * 1024, a); // API's alignment only 27 #pragma omp barrier 28 printf("th %d, ptr %p\n", i, p[i]); 29 if ((size_t)p[i] % AL0) { 30 #pragma omp atomic 31 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_alloc(AL0, 1024 * 1024, a); // allocator's alignment wins 47 #pragma omp barrier 48 printf("th %d, ptr %p\n", i, p[i]); 49 if ((size_t)p[i] % AL1) { 50 #pragma omp atomic 51 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_alloc(AL1, 1024 * 1024, a); // API's alignment wins 66 #pragma omp barrier 67 printf("th %d, ptr %p\n", i, p[i]); 68 if ((size_t)p[i] % AL1) { 69 #pragma omp atomic 70 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