mirror of
https://github.com/autc04/Retro68.git
synced 2024-09-10 03:54:48 +00:00
74 lines
1.2 KiB
C
74 lines
1.2 KiB
C
#include <omp.h>
|
|
|
|
__attribute__((noinline, noclone)) void
|
|
foo (int &b)
|
|
{
|
|
#pragma omp parallel
|
|
#pragma omp single
|
|
{
|
|
bool f = false;
|
|
#pragma omp taskloop firstprivate (b, f)
|
|
for (int i = 0; i < 30; i++)
|
|
{
|
|
int q = omp_get_thread_num ();
|
|
if (!f)
|
|
{
|
|
if (b != 2)
|
|
__builtin_abort ();
|
|
}
|
|
else if (b != 8 * q)
|
|
__builtin_abort ();
|
|
b = 8 * q;
|
|
f = true;
|
|
}
|
|
}
|
|
int n;
|
|
#pragma omp parallel
|
|
#pragma omp single
|
|
{
|
|
bool f = false;
|
|
#pragma omp taskloop firstprivate (f) lastprivate (b, n)
|
|
for (int i = 0; i < 30; i++)
|
|
{
|
|
int q = omp_get_thread_num ();
|
|
if (f && b != 8 * q)
|
|
__builtin_abort ();
|
|
b = 8 * q;
|
|
n = q;
|
|
f = true;
|
|
}
|
|
}
|
|
if (b != 8 * n)
|
|
__builtin_abort ();
|
|
b = 9;
|
|
#pragma omp parallel
|
|
#pragma omp single
|
|
{
|
|
bool f = false;
|
|
#pragma omp taskloop firstprivate (b, f) lastprivate (b, n)
|
|
for (int i = 0; i < 30; i++)
|
|
{
|
|
int q = omp_get_thread_num ();
|
|
if (!f)
|
|
{
|
|
if (b != 9)
|
|
__builtin_abort ();
|
|
}
|
|
else if (b != 11 * q)
|
|
__builtin_abort ();
|
|
b = 11 * q;
|
|
n = q;
|
|
f = true;
|
|
}
|
|
}
|
|
if (b != 11 * n)
|
|
__builtin_abort ();
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
int b = 2;
|
|
foo (b);
|
|
}
|