xref: /llvm-project/openmp/runtime/test/api/omp_aligned_alloc.c (revision f5c0c9179f555b2406fcc1a5921d60fd1e534425)
1*f5c0c917SAndreyChurbanov // RUN: %libomp-compile-and-run
2*f5c0c917SAndreyChurbanov // UNSUPPORTED: gnu
3*f5c0c917SAndreyChurbanov 
4*f5c0c917SAndreyChurbanov #include <stdio.h>
5*f5c0c917SAndreyChurbanov #include <stdlib.h>
6*f5c0c917SAndreyChurbanov #include <omp.h>
7*f5c0c917SAndreyChurbanov #define NTH 8
8*f5c0c917SAndreyChurbanov #define AL0 64
9*f5c0c917SAndreyChurbanov #define AL1 128
10*f5c0c917SAndreyChurbanov 
main()11*f5c0c917SAndreyChurbanov int main()
12*f5c0c917SAndreyChurbanov {
13*f5c0c917SAndreyChurbanov   int err = 0;
14*f5c0c917SAndreyChurbanov   omp_alloctrait_t at[3];
15*f5c0c917SAndreyChurbanov   omp_allocator_handle_t a;
16*f5c0c917SAndreyChurbanov   void *p[NTH];
17*f5c0c917SAndreyChurbanov   at[0].key = omp_atk_pool_size;
18*f5c0c917SAndreyChurbanov   at[0].value = 16*1024*1024;
19*f5c0c917SAndreyChurbanov   at[1].key = omp_atk_fallback;
20*f5c0c917SAndreyChurbanov   at[1].value = omp_atv_null_fb;
21*f5c0c917SAndreyChurbanov   a = omp_init_allocator(omp_large_cap_mem_space, 2, at);
22*f5c0c917SAndreyChurbanov   printf("allocator large created: %p\n", (void *)a);
23*f5c0c917SAndreyChurbanov   #pragma omp parallel num_threads(8)
24*f5c0c917SAndreyChurbanov   {
25*f5c0c917SAndreyChurbanov     int i = omp_get_thread_num();
26*f5c0c917SAndreyChurbanov     p[i] = omp_aligned_alloc(AL0, 1024 * 1024, a); // API's alignment only
27*f5c0c917SAndreyChurbanov     #pragma omp barrier
28*f5c0c917SAndreyChurbanov     printf("th %d, ptr %p\n", i, p[i]);
29*f5c0c917SAndreyChurbanov     if ((size_t)p[i] % AL0) {
30*f5c0c917SAndreyChurbanov       #pragma omp atomic
31*f5c0c917SAndreyChurbanov         err++;
32*f5c0c917SAndreyChurbanov       printf("Error param: th %d, ptr %p is not %d-byte aligned\n",
33*f5c0c917SAndreyChurbanov              i, p[i], AL0);
34*f5c0c917SAndreyChurbanov     }
35*f5c0c917SAndreyChurbanov     omp_free(p[i], a);
36*f5c0c917SAndreyChurbanov   }
37*f5c0c917SAndreyChurbanov   omp_destroy_allocator(a);
38*f5c0c917SAndreyChurbanov   at[2].key = omp_atk_alignment;
39*f5c0c917SAndreyChurbanov   at[2].value = AL1;
40*f5c0c917SAndreyChurbanov   a = omp_init_allocator(omp_large_cap_mem_space, 3, at);
41*f5c0c917SAndreyChurbanov   printf("allocator large aligned %d created: %p\n", AL1, (void *)a);
42*f5c0c917SAndreyChurbanov   if (a != omp_null_allocator)
43*f5c0c917SAndreyChurbanov   #pragma omp parallel num_threads(8)
44*f5c0c917SAndreyChurbanov   {
45*f5c0c917SAndreyChurbanov     int i = omp_get_thread_num();
46*f5c0c917SAndreyChurbanov     p[i] = omp_aligned_alloc(AL0, 1024 * 1024, a); // allocator's alignment wins
47*f5c0c917SAndreyChurbanov     #pragma omp barrier
48*f5c0c917SAndreyChurbanov     printf("th %d, ptr %p\n", i, p[i]);
49*f5c0c917SAndreyChurbanov     if ((size_t)p[i] % AL1) {
50*f5c0c917SAndreyChurbanov       #pragma omp atomic
51*f5c0c917SAndreyChurbanov         err++;
52*f5c0c917SAndreyChurbanov       printf("Error allocator: th %d, ptr %p is not %d-byte aligned\n",
53*f5c0c917SAndreyChurbanov              i, p[i], AL1);
54*f5c0c917SAndreyChurbanov     }
55*f5c0c917SAndreyChurbanov     omp_free(p[i], a);
56*f5c0c917SAndreyChurbanov   }
57*f5c0c917SAndreyChurbanov   omp_destroy_allocator(a);
58*f5c0c917SAndreyChurbanov   at[2].key = omp_atk_alignment;
59*f5c0c917SAndreyChurbanov   at[2].value = AL0;
60*f5c0c917SAndreyChurbanov   a = omp_init_allocator(omp_large_cap_mem_space, 3, at);
61*f5c0c917SAndreyChurbanov   printf("allocator large aligned %d created: %p\n", AL0, (void *)a);
62*f5c0c917SAndreyChurbanov   #pragma omp parallel num_threads(8)
63*f5c0c917SAndreyChurbanov   {
64*f5c0c917SAndreyChurbanov     int i = omp_get_thread_num();
65*f5c0c917SAndreyChurbanov     p[i] = omp_aligned_alloc(AL1, 1024 * 1024, a); // API's alignment wins
66*f5c0c917SAndreyChurbanov     #pragma omp barrier
67*f5c0c917SAndreyChurbanov     printf("th %d, ptr %p\n", i, p[i]);
68*f5c0c917SAndreyChurbanov     if ((size_t)p[i] % AL1) {
69*f5c0c917SAndreyChurbanov       #pragma omp atomic
70*f5c0c917SAndreyChurbanov         err++;
71*f5c0c917SAndreyChurbanov       printf("Error param: th %d, ptr %p is not %d-byte aligned\n",
72*f5c0c917SAndreyChurbanov              i, p[i], AL1);
73*f5c0c917SAndreyChurbanov     }
74*f5c0c917SAndreyChurbanov     omp_free(p[i], a);
75*f5c0c917SAndreyChurbanov   }
76*f5c0c917SAndreyChurbanov   omp_destroy_allocator(a);
77*f5c0c917SAndreyChurbanov 
78*f5c0c917SAndreyChurbanov   if (err == 0) {
79*f5c0c917SAndreyChurbanov     printf("passed\n");
80*f5c0c917SAndreyChurbanov     return 0;
81*f5c0c917SAndreyChurbanov   } else {
82*f5c0c917SAndreyChurbanov     printf("failed\n");
83*f5c0c917SAndreyChurbanov     return 1;
84*f5c0c917SAndreyChurbanov   }
85*f5c0c917SAndreyChurbanov }
86