brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.4 KiB · 5302fec Raw
63 lines · c
1// RUN: %libomp-compile-and-run2#include <stdio.h>3#include <stdint.h>4#include <omp.h>5#include "omp_testsuite.h"6 7int alignments[] = {64, 128, 256, 512, 1024, 2048, 4096};8 9unsigned 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 17int 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 alignment30      // 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 51int 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