Skip to content

Commit df5711b

Browse files
committed
Added_non-contiguous_update_cpptest
1 parent 0f032f1 commit df5711b

File tree

3 files changed

+196
-0
lines changed

3 files changed

+196
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// RUN: %libomptarget-compilexx-run-and-check-generic
2+
// This test checks that #pragma omp target update from(data1[0:3:4],
3+
// data2[0:2:5]) correctly updates disjoint strided sections of multiple arrays
4+
// from the device to the host.
5+
6+
#include <iomanip>
7+
#include <iostream>
8+
#include <omp.h>
9+
10+
using namespace std;
11+
12+
int main() {
13+
int len = 12;
14+
double data1[len], data2[len];
15+
16+
// Initial values
17+
#pragma omp target map(tofrom : data1[0 : len], data2[0 : len])
18+
{
19+
for (int i = 0; i < len; i++) {
20+
data1[i] = i;
21+
data2[i] = i * 10;
22+
}
23+
}
24+
25+
cout << "original host array values:" << endl;
26+
cout << "data1: ";
27+
for (int i = 0; i < len; i++)
28+
cout << fixed << setprecision(1) << data1[i] << " ";
29+
cout << endl << "data2: ";
30+
for (int i = 0; i < len; i++)
31+
cout << fixed << setprecision(1) << data2[i] << " ";
32+
cout << endl << endl;
33+
34+
#pragma omp target data map(to : data1[0 : len], data2[0 : len])
35+
{
36+
// Modify arrays on device
37+
#pragma omp target
38+
{
39+
for (int i = 0; i < len; i++)
40+
data1[i] += i;
41+
for (int i = 0; i < len; i++)
42+
data2[i] += 100;
43+
}
44+
45+
// data1[0:3:4] // indices 0,4,8
46+
// data2[0:2:5] // indices 0,5
47+
#pragma omp target update from(data1[0 : 3 : 4], data2[0 : 2 : 5])
48+
}
49+
50+
cout << "device array values after update from:" << endl;
51+
cout << "data1: ";
52+
for (int i = 0; i < len; i++)
53+
cout << fixed << setprecision(1) << data1[i] << " ";
54+
cout << endl << "data2: ";
55+
for (int i = 0; i < len; i++)
56+
cout << fixed << setprecision(1) << data2[i] << " ";
57+
cout << endl << endl;
58+
59+
// CHECK: data1: 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0
60+
// CHECK: data2: 0.0 10.0 20.0 30.0 40.0 50.0 60.0 70.0 80.0 90.0 100.0 110.0
61+
62+
// CHECK: data1: 0.0 1.0 2.0 3.0 8.0 5.0 6.0 7.0 16.0 9.0 10.0 11.0
63+
// CHECK: data2: 100.0 10.0 20.0 30.0 40.0 150.0 60.0 70.0 80.0 90.0 100.0
64+
// 110.0
65+
66+
return 0;
67+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// RUN: %libomptarget-compilexx-run-and-check-generic
2+
// This test checks that #pragma omp target update from(data[0:4:3]) correctly
3+
// updates every third element (stride 3) from the device to the host, partially
4+
// across the array
5+
6+
#include <iomanip>
7+
#include <iostream>
8+
#include <omp.h>
9+
10+
using namespace std;
11+
12+
int main() {
13+
int len = 11;
14+
double data[len];
15+
16+
#pragma omp target map(tofrom : data[0 : len])
17+
{
18+
for (int i = 0; i < len; i++)
19+
data[i] = i;
20+
}
21+
22+
// Initial values
23+
cout << "original host array values:" << endl;
24+
for (int i = 0; i < len; i++)
25+
cout << fixed << setprecision(6) << data[i] << endl;
26+
cout << endl;
27+
28+
#pragma omp target data map(to : data[0 : len])
29+
{
30+
// Modify arrays on device
31+
#pragma omp target
32+
for (int i = 0; i < len; i++)
33+
data[i] += i;
34+
35+
#pragma omp target update from(data[0 : 4 : 3]) // indices 0,3,6,9
36+
}
37+
38+
cout << "device array values after update from:" << endl;
39+
for (int i = 0; i < len; i++)
40+
cout << fixed << setprecision(6) << data[i] << endl;
41+
cout << endl;
42+
43+
// CHECK: 0.000000
44+
// CHECK: 1.000000
45+
// CHECK: 2.000000
46+
// CHECK: 3.000000
47+
// CHECK: 4.000000
48+
// CHECK: 5.000000
49+
// CHECK: 6.000000
50+
// CHECK: 7.000000
51+
// CHECK: 8.000000
52+
// CHECK: 9.000000
53+
// CHECK: 10.000000
54+
55+
// CHECK: 0.000000
56+
// CHECK: 1.000000
57+
// CHECK: 2.000000
58+
// CHECK: 6.000000
59+
// CHECK: 4.000000
60+
// CHECK: 5.000000
61+
// CHECK: 12.000000
62+
// CHECK: 7.000000
63+
// CHECK: 8.000000
64+
// CHECK: 18.000000
65+
// CHECK: 10.000000
66+
67+
return 0;
68+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// RUN: %libomptarget-compilexx-run-and-check-generic
2+
// This test checks that "update from" clause in OpenMP is supported when the
3+
// elements are updated in a non-contiguous manner. This test checks that
4+
// #pragma omp target update from(data[0:4:2]) correctly updates only every
5+
// other element (stride 2) from the device to the host
6+
7+
#include <iomanip>
8+
#include <iostream>
9+
#include <omp.h>
10+
11+
using namespace std;
12+
13+
int main() {
14+
int len = 8;
15+
double data[len];
16+
17+
#pragma omp target map(tofrom : len, data[0 : len])
18+
{
19+
for (int i = 0; i < len; i++) {
20+
data[i] = i;
21+
}
22+
}
23+
24+
// Initial values
25+
cout << "original host array values:" << endl;
26+
for (int i = 0; i < len; i++) {
27+
cout << fixed << setprecision(6) << data[i] << endl;
28+
}
29+
cout << endl;
30+
31+
#pragma omp target data map(to : len, data[0 : len])
32+
{
33+
// Modify arrays on device
34+
#pragma omp target
35+
for (int i = 0; i < len; i++) {
36+
data[i] += i;
37+
}
38+
39+
#pragma omp target update from(data[0 : 4 : 2])
40+
}
41+
42+
// CHECK: 0.000000
43+
// CHECK: 1.000000
44+
// CHECK: 4.000000
45+
// CHECK: 3.000000
46+
// CHECK: 8.000000
47+
// CHECK: 5.000000
48+
// CHECK: 12.000000
49+
// CHECK: 7.000000
50+
// CHECK-NOT: 2.000000
51+
// CHECK-NOT: 6.000000
52+
// CHECK-NOT: 10.000000
53+
// CHECK-NOT: 14.000000
54+
cout << "from target array results:" << endl;
55+
for (int i = 0; i < len; i++) {
56+
cout << fixed << setprecision(6) << data[i] << endl;
57+
}
58+
cout << endl;
59+
60+
return 0;
61+
}

0 commit comments

Comments
 (0)