64 lines · c
1// This test checks that #pragma omp target update from(data[0:4:3]) correctly2// updates every third element (stride 3) from the device to the host, partially3// across the array4 5// RUN: %libomptarget-compile-run-and-check-generic6#include <omp.h>7#include <stdio.h>8 9int main() {10 int len = 11;11 double data[len];12 13#pragma omp target map(tofrom : 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 : 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#pragma omp target update from(data[0 : 4 : 3]) // indices 0,3,6,933 }34 35 printf("device array values after update from:\n");36 for (int i = 0; i < len; i++)37 printf("%f\n", data[i]);38 printf("\n");39 40 // CHECK: 0.00000041 // CHECK: 1.00000042 // CHECK: 2.00000043 // CHECK: 3.00000044 // CHECK: 4.00000045 // CHECK: 5.00000046 // CHECK: 6.00000047 // CHECK: 7.00000048 // CHECK: 8.00000049 // CHECK: 9.00000050 // CHECK: 10.00000051 52 // CHECK: 0.00000053 // CHECK: 1.00000054 // CHECK: 2.00000055 // CHECK: 6.00000056 // CHECK: 4.00000057 // CHECK: 5.00000058 // CHECK: 12.00000059 // CHECK: 7.00000060 // CHECK: 8.00000061 // CHECK: 18.00000062 // CHECK: 10.00000063}64