55 lines · c
1// This test checks that "update from" clause in OpenMP is supported when the2// elements are updated in a non-contiguous manner. This test checks that3// #pragma omp target update from(data[0:4:2]) correctly updates only every4// other element (stride 2) from the device to the host5 6// RUN: %libomptarget-compile-run-and-check-generic7#include <omp.h>8#include <stdio.h>9 10int main() {11 int len = 8;12 double data[len];13#pragma omp target map(tofrom : len, data[0 : len])14 {15 for (int i = 0; i < len; i++) {16 data[i] = i;17 }18 }19 // Initial values20 printf("original host array values:\n");21 for (int i = 0; i < len; i++)22 printf("%f\n", data[i]);23 printf("\n");24 25#pragma omp target data map(to : len, data[0 : len])26 {27// Modify arrays on device28#pragma omp target29 for (int i = 0; i < len; i++) {30 data[i] += i;31 }32 33#pragma omp target update from(data[0 : 4 : 2])34 }35 // CHECK: 0.00000036 // CHECK: 1.00000037 // CHECK: 4.00000038 // CHECK: 3.00000039 // CHECK: 8.00000040 // CHECK: 5.00000041 // CHECK: 12.00000042 // CHECK: 7.00000043 // CHECK-NOT: 2.00000044 // CHECK-NOT: 6.00000045 // CHECK-NOT: 10.00000046 // CHECK-NOT: 14.00000047 48 printf("from target array results:\n");49 for (int i = 0; i < len; i++)50 printf("%f\n", data[i]);51 printf("\n");52 53 return 0;54}55