brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · cc823ed Raw
130 lines · cpp
1// RUN: %libomptarget-compilexx-run-and-check-aarch64-unknown-linux-gnu2// RUN: %libomptarget-compilexx-run-and-check-powerpc64-ibm-linux-gnu3// RUN: %libomptarget-compilexx-run-and-check-powerpc64le-ibm-linux-gnu4// RUN: %libomptarget-compilexx-run-and-check-x86_64-unknown-linux-gnu5// RUN: %libomptarget-compilexx-run-and-check-nvptx64-nvidia-cuda6 7#include <assert.h>8#include <omp.h>9#include <stdio.h>10#include <stdlib.h>11 12#define N 213 14class MyObjectA {15public:16  MyObjectA() {17    data1 = 1;18    data2 = 2;19  }20  void show() {21    printf("\t\tObject A Contents:\n");22    printf("\t\t\tdata1 = %d  data2 = %d\n", data1, data2);23  }24  void foo() {25    data1 += 10;26    data2 += 20;27  }28  int data1;29  int data2;30};31 32class MyObjectB {33public:34  MyObjectB() {35    arr = new MyObjectA[N];36    len = N;37  }38  void show() {39    printf("\tObject B Contents:\n");40    for (int i = 0; i < len; i++)41      arr[i].show();42  }43  void foo() {44    for (int i = 0; i < len; i++)45      arr[i].foo();46  }47  MyObjectA *arr;48  int len;49};50#pragma omp declare mapper(MyObjectB obj) map(obj, obj.arr[ : obj.len])51 52class MyObjectC {53public:54  MyObjectC() {55    arr = new MyObjectB[N];56    len = N;57  }58  void show() {59    printf("Object C Contents:\n");60    for (int i = 0; i < len; i++)61      arr[i].show();62  }63  void foo() {64    for (int i = 0; i < len; i++)65      arr[i].foo();66  }67  MyObjectB *arr;68  int len;69};70#pragma omp declare mapper(MyObjectC obj) map(obj, obj.arr[ : obj.len])71 72int main(void) {73  MyObjectC *outer = new MyObjectC[N];74 75  printf("Original data hierarchy:\n");76  for (int i = 0; i < N; i++)77    outer[i].show();78 79  printf("Sending data to device...\n");80#pragma omp target enter data map(to : outer[ : N])81 82  printf("Calling foo()...\n");83#pragma omp target teams distribute parallel for84  for (int i = 0; i < N; i++)85    outer[i].foo();86 87  printf("foo() complete!\n");88 89  printf("Sending data back to host...\n");90#pragma omp target exit data map(from : outer[ : N])91 92  printf("Modified Data Hierarchy:\n");93  for (int i = 0; i < N; i++)94    outer[i].show();95 96  printf("Testing for correctness...\n");97  for (int i = 0; i < N; ++i)98    for (int j = 0; j < N; ++j)99      for (int k = 0; k < N; ++k) {100        printf("outer[%d].arr[%d].arr[%d].data1 = %d.\n", i, j, k,101               outer[i].arr[j].arr[k].data1);102        printf("outer[%d].arr[%d].arr[%d].data2 = %d.\n", i, j, k,103               outer[i].arr[j].arr[k].data2);104        assert(outer[i].arr[j].arr[k].data1 == 11 &&105               outer[i].arr[j].arr[k].data2 == 22);106      }107  // CHECK: outer[0].arr[0].arr[0].data1 = 11.108  // CHECK: outer[0].arr[0].arr[0].data2 = 22.109  // CHECK: outer[0].arr[0].arr[1].data1 = 11.110  // CHECK: outer[0].arr[0].arr[1].data2 = 22.111  // CHECK: outer[0].arr[1].arr[0].data1 = 11.112  // CHECK: outer[0].arr[1].arr[0].data2 = 22.113  // CHECK: outer[0].arr[1].arr[1].data1 = 11.114  // CHECK: outer[0].arr[1].arr[1].data2 = 22.115  // CHECK: outer[1].arr[0].arr[0].data1 = 11.116  // CHECK: outer[1].arr[0].arr[0].data2 = 22.117  // CHECK: outer[1].arr[0].arr[1].data1 = 11.118  // CHECK: outer[1].arr[0].arr[1].data2 = 22.119  // CHECK: outer[1].arr[1].arr[0].data1 = 11.120  // CHECK: outer[1].arr[1].arr[0].data2 = 22.121  // CHECK: outer[1].arr[1].arr[1].data1 = 11.122  // CHECK: outer[1].arr[1].arr[1].data2 = 22.123  assert(outer[1].arr[1].arr[0].data1 == 11 &&124         outer[1].arr[1].arr[0].data2 == 22 &&125         outer[1].arr[1].arr[1].data1 == 11 &&126         outer[1].arr[1].arr[1].data2 == 22);127 128  return 0;129}130