mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-01 11:52:47 +00:00
168 lines
4.2 KiB
C
168 lines
4.2 KiB
C
extern "C" void abort ();
|
|
int arr[64], arr2[64], arr3[64];
|
|
|
|
int *
|
|
foo (int x, int y, long z)
|
|
{
|
|
int v;
|
|
switch (x)
|
|
{
|
|
case 1:
|
|
if (z != 0 || y < 0 || y >= 64)
|
|
abort ();
|
|
#pragma omp atomic capture
|
|
{
|
|
v = arr2[y];
|
|
arr2[y]++;
|
|
}
|
|
if (v != 0) abort ();
|
|
return &arr[y];
|
|
case 2:
|
|
if (y < 0 || y > 60 || (y & 3) || z < 0 || z >= 4)
|
|
abort ();
|
|
#pragma omp atomic
|
|
arr2[y + z] = arr2[y + z] + 4;
|
|
return &arr[y + z];
|
|
case 3:
|
|
if (z < 0 || z > 60 || (z & 3) || y < 0 || y >= 4)
|
|
abort ();
|
|
#pragma omp atomic
|
|
arr2[y + z] = arr2[y + z] + 16;
|
|
return &arr[y + z];
|
|
case 4:
|
|
if (y != 0 || z > 64 || z <= 0)
|
|
abort ();
|
|
#pragma omp atomic
|
|
arr2[z - 1] = arr2[z - 1] + 64;
|
|
return &arr[z - 1];
|
|
case 5:
|
|
if ((y & 3) != 0 || y < 64 || y >= 96
|
|
|| (z & 127) != 0 || z < 512 || z >= 1024)
|
|
abort ();
|
|
y = (y - 64) + (z - 512) / 128;
|
|
#pragma omp atomic
|
|
arr2[y] = arr2[y] + 256;
|
|
return &arr[y];
|
|
case 6:
|
|
if ((y & 3) != 0 || y <= 64 || y > 96
|
|
|| (z & 127) != 1 || z <= 513 || z > 1025)
|
|
abort ();
|
|
y = (y - 68) + (z - 641) / 128;
|
|
#pragma omp atomic
|
|
arr2[y] = arr2[y] + 1024;
|
|
return &arr[y];
|
|
default:
|
|
abort ();
|
|
}
|
|
}
|
|
|
|
volatile int beg, end, step, step2;
|
|
volatile unsigned int begu, endu;
|
|
|
|
template <int N>
|
|
void
|
|
bar ()
|
|
{
|
|
#pragma omp parallel
|
|
#pragma omp master
|
|
{
|
|
int i;
|
|
for (i = 0; i < 64; i++)
|
|
#pragma omp task depend (iterator (j=i:i+1) , out : foo (1, j, 0)[0])
|
|
arr[i] = i;
|
|
#pragma omp task depend (iterator (int k=beg:end:step,long int l=0:4:1) , inout : \
|
|
foo (2, k, l)[0], foo (3, l, k)[0]) private (i)
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 1;
|
|
#pragma omp task depend (iterator (int *p=&arr3[64]:&arr3[0]:-1), inout : \
|
|
foo (4, 0, p - &arr3[0])[0]) depend (in : beg)
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i + 1)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 2;
|
|
#pragma omp task depend (iterator (unsigned n=begu:endu:step2, unsigned int o = 512: 1024U: (unsigned char) 128), inout : \
|
|
foo (5, n + 128, o)[0])
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i + 3)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 4;
|
|
#pragma omp task depend (iterator (int unsigned p=endu:begu:step,unsigned q= 1025U:513U:(signed char) -128), in : \
|
|
foo (6, p + 128, q)[0])
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i + 7)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 8;
|
|
}
|
|
}
|
|
|
|
template <typename A, typename B, typename C, typename D, typename E, typename F>
|
|
void
|
|
baz (A beg, A end, A step, D begu, D endu, A step2)
|
|
{
|
|
#pragma omp parallel
|
|
#pragma omp master
|
|
{
|
|
int i;
|
|
for (i = 0; i < 64; i++)
|
|
#pragma omp task depend (iterator (A j=i:i+1),out : foo (1, j, 0)[0])
|
|
arr[i] = i;
|
|
#pragma omp task depend (iterator (A k=beg:end:step,B l=0:4:1), inout : \
|
|
foo (2, k, l)[0], foo (3, l, k)[0]) private (i)
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 1;
|
|
#pragma omp task depend (iterator (C p=&arr3[64]:&arr3[0]:-1), in : \
|
|
foo (4, 0, p - &arr3[0])[0]) depend (in : beg)
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i + 1)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 2;
|
|
#pragma omp task depend (iterator (D n=begu:endu:step2, D o = 512: 1024U:(E) 128), inout : \
|
|
foo (5, n + 128, o)[0])
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i + 3)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 4;
|
|
#pragma omp task depend (iterator (D p=endu:begu:step,D q= 1025U:513U:(F) -128), in : \
|
|
foo (6, p + 128, q)[0])
|
|
for (i = 0; i < 64; i++)
|
|
if (arr[i] != i + 7)
|
|
abort ();
|
|
else
|
|
arr[i] = arr[i] + 8;
|
|
}
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
int m;
|
|
beg = 60;
|
|
end = -4;
|
|
step = -4;
|
|
step2 = 4;
|
|
begu = -64U;
|
|
endu = -32U;
|
|
bar<0> ();
|
|
for (m = 0; m < 64; m++)
|
|
if (arr[m] != m + 15 || arr2[m] != (m < 32 ? 1365 : 85))
|
|
abort ();
|
|
else
|
|
arr[m] = arr2[m] = 0;
|
|
baz<int, long int, int *, unsigned int, unsigned char, signed char> (beg, end, step, begu, endu, step2);
|
|
for (m = 0; m < 64; m++)
|
|
if (arr[m] != m + 15 || arr2[m] != (m < 32 ? 1365 : 85))
|
|
abort ();
|
|
return 0;
|
|
}
|