• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %libomp-compile-and-run
2 #include <stdio.h>
3 #include <stdint.h>
4 #include <omp.h>
5 #include "omp_testsuite.h"
6 
7 int alignments[] = {64, 128, 256, 512, 1024, 2048, 4096};
8 
aligned_by(uint64_t addr)9 unsigned aligned_by(uint64_t addr) {
10     uint64_t alignment = 1;
11     while((addr & (alignment-1)) == 0) {
12         alignment <<= 1;
13     }
14     return (alignment >> 1);
15 }
16 
test_kmp_aligned_malloc()17 int test_kmp_aligned_malloc()
18 {
19   int err = 0;
20   #pragma omp parallel shared(err)
21   {
22     int i;
23     int* ptr;
24     uint64_t addr;
25     int tid = omp_get_thread_num();
26 
27     for(i = 0; i < sizeof(alignments)/sizeof(int); i++) {
28       int alignment = alignments[i];
29       // allocate 64 bytes with 64-byte alignment
30       // allocate 128 bytes with 128-byte alignment, etc.
31       ptr = (int*)kmp_aligned_malloc(alignment, alignment);
32       addr = (uint64_t)ptr;
33       if(addr & (alignment-1)) {
34         printf("thread %d: addr = %p (aligned to %u bytes) but expected "
35                " alignment = %d\n", tid, ptr, aligned_by(addr), alignment);
36         err = 1;
37       }
38       kmp_free(ptr);
39     }
40 
41     ptr = kmp_aligned_malloc(128, 127);
42     if (ptr != NULL) {
43       printf("thread %d: kmp_aligned_malloc() didn't return NULL when "
44              "alignment was not power of 2\n", tid);
45       err = 1;
46     }
47   } /* end of parallel */
48   return !err;
49 }
50 
main()51 int main()
52 {
53   int i;
54   int num_failed=0;
55 
56   for(i = 0; i < REPETITIONS; i++) {
57     if(!test_kmp_aligned_malloc()) {
58       num_failed++;
59     }
60   }
61   return num_failed;
62 }
63