aboutsummaryrefslogtreecommitdiff
path: root/rc3/runtime/test/api/omp_alloc.c
blob: 2002adbec5741d1884e166f54cb107804cff8f83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// RUN: %libomp-compile-and-run

// REQUIRES: openmp-5.0

#include <stdio.h>
#include <stdint.h>
#include <omp.h>
#include "omp_testsuite.h"

#define ARRAY_SIZE 10000

int test_omp_alloc() {
  int err;
  int i, j;
  int *shared_array;
  const omp_allocator_t *allocator;
  const omp_allocator_t *test_allocator;
  // Currently, only default memory allocator is implemented
  const omp_allocator_t *allocators[] = {
      omp_default_mem_alloc,
  };

  err = 0;
  for (i = 0; i < sizeof(allocators) / sizeof(allocators[0]); ++i) {
    allocator = allocators[i];
    printf("Using %p allocator\n", test_allocator);
    omp_set_default_allocator(allocator);
    test_allocator = omp_get_default_allocator();
    if (test_allocator != allocator) {
      printf("error: omp_set|get_default_allocator() not working\n");
      return 0;
    }
    shared_array = (int *)omp_alloc(sizeof(int) * ARRAY_SIZE, test_allocator);
    if (shared_array == NULL) {
      printf("error: shared_array is NULL\n");
      return 0;
    }
    for (j = 0; j < ARRAY_SIZE; ++j) {
      shared_array[j] = j;
    }
    #pragma omp parallel shared(shared_array)
    {
      int i;
      int tid = omp_get_thread_num();
      int *private_array =
          (int *)omp_alloc(sizeof(int) * ARRAY_SIZE, omp_default_mem_alloc);
      if (private_array == NULL) {
        printf("error: thread %d private_array is NULL\n", tid);
        #pragma omp atomic
        err++;
      }
      for (i = 0; i < ARRAY_SIZE; ++i) {
        private_array[i] = shared_array[i] + tid;
      }
      for (i = 0; i < ARRAY_SIZE; ++i) {
        if (private_array[i] != i + tid) {
          printf("error: thread %d element %d is %d instead of %d\n", tid, i,
                 private_array[i], i + tid);
          #pragma omp atomic
          err++;
        }
      }
      omp_free(private_array, omp_default_mem_alloc);
    } /* end of parallel */
    omp_free(shared_array, test_allocator);
  }

  return !err;
}

int main() {
  int i;
  int num_failed = 0;

  for (i = 0; i < REPETITIONS; i++) {
    if (!test_omp_alloc()) {
      num_failed++;
    }
  }
  return num_failed;
}