66 lines
1.3 KiB
C
66 lines
1.3 KiB
C
/* { dg-do run } */
|
|
/* { dg-options "-O2" } */
|
|
/* { dg-additional-options "-std=c99" { target c } } */
|
|
/* { dg-additional-options "-msse2" { target sse2_runtime } } */
|
|
/* { dg-additional-options "-mavx" { target avx_runtime } } */
|
|
|
|
#include <omp.h>
|
|
#include <stdlib.h>
|
|
|
|
#define N 1024
|
|
long int u[N], m, n, o;
|
|
|
|
__attribute__((noipa)) void
|
|
foo (void)
|
|
{
|
|
int i = -1;
|
|
#pragma omp master taskloop simd reduction (+:m) grainsize (64)
|
|
for (i = 0; i < N; ++i)
|
|
m += u[i];
|
|
if (i != (omp_get_thread_num () ? -1 : N))
|
|
abort ();
|
|
}
|
|
|
|
__attribute__((noipa)) void
|
|
bar (int x)
|
|
{
|
|
int i = -1;
|
|
#pragma omp master taskloop simd in_reduction (+:n) grainsize (64)
|
|
for (i = (x & 1) * (N / 2); i < (x & 1) * (N / 2) + (N / 2); i++)
|
|
n += 2 * u[i];
|
|
if (i != (omp_get_thread_num () ? -1 : (x & 1) * (N / 2) + (N / 2)))
|
|
abort ();
|
|
}
|
|
|
|
__attribute__((noipa)) void
|
|
baz (void)
|
|
{
|
|
int i;
|
|
#pragma omp parallel master taskloop simd reduction (+:o) grainsize (64)
|
|
for (i = 0; i < N; ++i)
|
|
o += u[i];
|
|
if (i != N)
|
|
abort ();
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
int i;
|
|
for (i = 0; i < N; ++i)
|
|
u[i] = i;
|
|
#pragma omp parallel
|
|
{
|
|
foo ();
|
|
#pragma omp taskgroup task_reduction (+:n)
|
|
{
|
|
bar (0);
|
|
bar (1);
|
|
}
|
|
}
|
|
baz ();
|
|
if (m != (long)(N - 1) * (N / 2) || n != (long)(N - 1) * N || o != m)
|
|
abort ();
|
|
return 0;
|
|
}
|