82 lines
2.1 KiB
C
82 lines
2.1 KiB
C
// 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;
|
|
}
|