// RUN: %libomp-compile-and-run #include #include #include #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; }