mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-13 18:34:45 +00:00
91 lines
1.7 KiB
C
91 lines
1.7 KiB
C
|
extern
|
||
|
#ifdef __cplusplus
|
||
|
"C"
|
||
|
#endif
|
||
|
void abort (void);
|
||
|
|
||
|
void
|
||
|
fn1 (double *x, double *y, int z)
|
||
|
{
|
||
|
int i;
|
||
|
for (i = 0; i < z; i++)
|
||
|
{
|
||
|
x[i] = i & 31;
|
||
|
y[i] = (i & 63) - 30;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#pragma omp declare target
|
||
|
int tgtv = 6;
|
||
|
int
|
||
|
tgt (void)
|
||
|
{
|
||
|
#pragma omp atomic update
|
||
|
tgtv++;
|
||
|
return 0;
|
||
|
}
|
||
|
#pragma omp end declare target
|
||
|
|
||
|
double
|
||
|
fn2 (int x, int y, int z)
|
||
|
{
|
||
|
double b[1024], c[1024], s = 0;
|
||
|
int i, j;
|
||
|
fn1 (b, c, x);
|
||
|
#pragma omp target data map(to: b)
|
||
|
{
|
||
|
#pragma omp target map(tofrom: c)
|
||
|
#pragma omp teams num_teams(y) thread_limit(z) reduction(+:s) firstprivate(x)
|
||
|
#pragma omp distribute dist_schedule(static, 4) collapse(1)
|
||
|
for (j=0; j < x; j += y)
|
||
|
#pragma omp parallel for reduction(+:s)
|
||
|
for (i = j; i < j + y; i++)
|
||
|
tgt (), s += b[i] * c[i];
|
||
|
#pragma omp target update from(b, tgtv)
|
||
|
}
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
double
|
||
|
fn3 (int x)
|
||
|
{
|
||
|
double b[1024], c[1024], s = 0;
|
||
|
int i;
|
||
|
fn1 (b, c, x);
|
||
|
#pragma omp target map(to: b, c)
|
||
|
#pragma omp parallel for reduction(+:s)
|
||
|
for (i = 0; i < x; i++)
|
||
|
tgt (), s += b[i] * c[i];
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
double
|
||
|
fn4 (int x, double *p)
|
||
|
{
|
||
|
double b[1024], c[1024], d[1024], s = 0;
|
||
|
int i;
|
||
|
fn1 (b, c, x);
|
||
|
fn1 (d + x, p + x, x);
|
||
|
#pragma omp target map(to: b, c[0:x], d[x:x]) map(to:p[x:64 + (x & 31)])
|
||
|
#pragma omp parallel for reduction(+:s)
|
||
|
for (i = 0; i < x; i++)
|
||
|
s += b[i] * c[i] + d[x + i] + p[x + i];
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main ()
|
||
|
{
|
||
|
double a = fn2 (128, 4, 6);
|
||
|
int b = tgtv;
|
||
|
double c = fn3 (61);
|
||
|
#pragma omp target update from(tgtv)
|
||
|
int d = tgtv;
|
||
|
double e[1024];
|
||
|
double f = fn4 (64, e);
|
||
|
if (a != 13888.0 || b != 6 + 128 || c != 4062.0 || d != 6 + 128 + 61
|
||
|
|| f != 8032.0)
|
||
|
abort ();
|
||
|
return 0;
|
||
|
}
|