1// RUN: %libomptarget-compile-run-and-check-generic
2// RUN: %libomptarget-compileopt-run-and-check-generic
3
4#include <omp.h>
5#include <stdio.h>
6#include <stdlib.h>
7
8int main() {
9 long unsigned **DP = 0;
10 int N = 32;
11 int Threads = 64;
12 int Teams = 10;
13
14#pragma omp target map(from : DP)
15 DP = (long unsigned **)malloc(size: sizeof(long unsigned *) * Threads * Teams);
16
17#pragma omp target teams distribute parallel for num_teams(Teams) \
18 thread_limit(Threads)
19 for (int i = 0; i < Threads * Teams; ++i)
20 DP[i] = (long unsigned *)malloc(size: sizeof(long unsigned) * N);
21
22#pragma omp target teams distribute parallel for num_teams(Teams) \
23 thread_limit(Threads)
24 for (int i = 0; i < Threads * Teams; ++i) {
25 for (int j = 0; j < N; ++j) {
26 DP[i][j] = i + j;
27 }
28 }
29
30 long unsigned s = 0;
31#pragma omp target teams distribute parallel for num_teams(Teams) \
32 thread_limit(Threads) reduction(+ : s)
33 for (int i = 0; i < Threads * Teams; ++i) {
34 for (int j = 0; j < N; ++j) {
35 s += DP[i][j];
36 }
37 }
38
39 // CHECK: Sum: 6860800
40 printf(format: "Sum: %li\n", s);
41 return 0;
42}
43

source code of offload/test/offloading/malloc_parallel.c