Skip to content

Commit

Permalink
Add passing test for issue 64797.
Browse files Browse the repository at this point in the history
  • Loading branch information
doru1004 committed Aug 28, 2023
1 parent 6688701 commit 41bb5ef
Showing 1 changed file with 75 additions and 0 deletions.
75 changes: 75 additions & 0 deletions openmp/libomptarget/test/offloading/back2back_distribute.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// RUN: %libomptarget-compile-generic -O3 && %libomptarget-run-generic | %fcheck-generic

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_N 25000

void reset_input(double *a, double *a_h, double *b, double *c) {
for(int i = 0 ; i < MAX_N ; i++) {
a[i] = a_h[i] = i;
b[i] = i*2;
c[i] = i-3;
}
}

int main(int argc, char *argv[]) {
double * a = (double *) malloc(MAX_N * sizeof(double));
double * a_h = (double *) malloc(MAX_N * sizeof(double));
double * d = (double *) malloc(MAX_N * sizeof(double));
double * d_h = (double *) malloc(MAX_N * sizeof(double));
double * b = (double *) malloc(MAX_N * sizeof(double));
double * c = (double *) malloc(MAX_N * sizeof(double));

#pragma omp target enter data map(to:a[:MAX_N],b[:MAX_N],c[:MAX_N],d[:MAX_N])

for (int n = 32 ; n < MAX_N ; n+=5000) {
reset_input(a, a_h, b, c);

#pragma omp target update to(a[:n],b[:n],c[:n],d[:n])
int t = 0;
for (int tms = 1 ; tms <= 256 ; tms *= 2) { // 8 times
for (int ths = 32 ; ths <= 1024 ; ths *= 2) { // 6 times
t++;
#pragma omp target
#pragma omp teams num_teams(tms) thread_limit(ths)
{
#pragma omp distribute parallel for
for (int i = 0; i < n; ++i) {
a[i] += b[i] + c[i];
}
#pragma omp distribute parallel for
for (int i = 0; i < n; ++i) {
d[i] -= b[i] + c[i];
}
}
} // loop over 'ths'
} // loop over 'tms'

// check results for each 'n'
for (int times = 0 ; times < t ; times++) {
for (int i = 0; i < n; ++i) {
a_h[i] += b[i] + c[i];
}
for (int i = 0; i < n; ++i)
d_h[i] -= b[i] + c[i];
}
#pragma omp target update from(a[:n],d[:n])

for (int i = 0; i < n; ++i) {
if (a_h[i] != a[i]) {
printf("A Error at n = %d, i = %d: host = %f, device = %f\n", n, i, a_h[i], a[i]);
return 1;
}
if (d_h[i] != d[i]) {
printf("D Error at n = %d, i = %d: host = %lf, device = %lf\n", n, i, d_h[i], d[i]);
return 1;
}
}
} // loop over 'n'

// CHECK: Succeeded
printf("Succeeded\n");
return 0;
}

2 comments on commit 41bb5ef

@RaviNarayanaswamy
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@doru1004 In the above test d, a_h and d_h are not initialized so depending on where the program is loaded it may have zero or random values and test will fail. Can you initialize these.

@doru1004
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@doru1004 In the above test d, a_h and d_h are not initialized so depending on where the program is loaded it may have zero or random values and test will fail. Can you initialize these.

Hi Ravi, good catch. I just opened a PR for the fix: #74799

Please sign in to comment.