63 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
// 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;
 | 
						|
}
 |