forked from OSchip/llvm-project
61 lines
1.4 KiB
C
61 lines
1.4 KiB
C
// RUN: %libomp-compile-and-run
|
|
// XFAIL: gcc-4, gcc-5, clang-3.7, clang-3.8, icc-15, icc-16
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "omp_testsuite.h"
|
|
|
|
#ifndef N
|
|
#define N 750
|
|
#endif
|
|
|
|
int test_doacross() {
|
|
int i, j;
|
|
// Allocate and zero out the matrix
|
|
int *m = (int *)malloc(sizeof(int) * N * N);
|
|
for (i = 0; i < N; ++i) {
|
|
for (j = 0; j < N; ++j) {
|
|
m[i * N + j] = 0;
|
|
}
|
|
}
|
|
// Have first row and column be 0, 1, 2, 3, etc.
|
|
for (i = 0; i < N; ++i)
|
|
m[i * N] = i;
|
|
for (j = 0; j < N; ++j)
|
|
m[j] = j;
|
|
// Perform wavefront which results in matrix:
|
|
// 0 1 2 3 4
|
|
// 1 2 3 4 5
|
|
// 2 3 4 5 6
|
|
// 3 4 5 6 7
|
|
// 4 5 6 7 8
|
|
#pragma omp parallel shared(m)
|
|
{
|
|
int row, col;
|
|
#pragma omp for ordered(2)
|
|
for (row = 1; row < N; ++row) {
|
|
for (col = 1; col < N; ++col) {
|
|
#pragma omp ordered depend(sink : row - 1, col) depend(sink : row, col - 1)
|
|
m[row * N + col] = m[(row - 1) * N + col] + m[row * N + (col - 1)] -
|
|
m[(row - 1) * N + (col - 1)];
|
|
#pragma omp ordered depend(source)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check the bottom right element to see if iteration dependencies were held
|
|
int retval = (m[(N - 1) * N + N - 1] == 2 * (N - 1));
|
|
free(m);
|
|
return retval;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
int i;
|
|
int num_failed = 0;
|
|
for (i = 0; i < REPETITIONS; i++) {
|
|
if (!test_doacross()) {
|
|
num_failed++;
|
|
}
|
|
}
|
|
return num_failed;
|
|
}
|