| // RUN: %libomp-compile-and-run |
| #include <stdio.h> |
| #include <stdint.h> |
| #include <omp.h> |
| #include "omp_testsuite.h" |
| |
| int alignments[] = {64, 128, 256, 512, 1024, 2048, 4096}; |
| |
| unsigned aligned_by(uint64_t addr) { |
| uint64_t alignment = 1; |
| while((addr & (alignment-1)) == 0) { |
| alignment <<= 1; |
| } |
| return (alignment >> 1); |
| } |
| |
| int test_kmp_aligned_malloc() |
| { |
| int err = 0; |
| #pragma omp parallel shared(err) |
| { |
| int i; |
| int* ptr; |
| uint64_t addr; |
| int tid = omp_get_thread_num(); |
| |
| for(i = 0; i < sizeof(alignments)/sizeof(int); i++) { |
| int alignment = alignments[i]; |
| // allocate 64 bytes with 64-byte alignment |
| // allocate 128 bytes with 128-byte alignment, etc. |
| ptr = (int*)kmp_aligned_malloc(alignment, alignment); |
| addr = (uint64_t)ptr; |
| if(addr & (alignment-1)) { |
| printf("thread %d: addr = %p (aligned to %u bytes) but expected " |
| " alignment = %d\n", tid, ptr, aligned_by(addr), alignment); |
| err = 1; |
| } |
| kmp_free(ptr); |
| } |
| |
| ptr = kmp_aligned_malloc(128, 127); |
| if (ptr != NULL) { |
| printf("thread %d: kmp_aligned_malloc() didn't return NULL when " |
| "alignment was not power of 2\n", tid); |
| err = 1; |
| } |
| } /* end of parallel */ |
| return !err; |
| } |
| |
| int main() |
| { |
| int i; |
| int num_failed=0; |
| |
| for(i = 0; i < REPETITIONS; i++) { |
| if(!test_kmp_aligned_malloc()) { |
| num_failed++; |
| } |
| } |
| return num_failed; |
| } |