Viewing file: simd-5.c (1.33 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do run } */ /* { dg-additional-options "-msse2" { target sse2_runtime } } */ /* { dg-additional-options "-mavx" { target avx_runtime } } */
#define N 128 #define M 16 #define EPS 0.0000000000000001 #define SAFELEN 16
#include <stdlib.h>
void init(double a[N][N], double b[N][N], int n) { int i, j, s = -1; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { a[i][j] = i * j * s; b[i][j] = i + j + s; s = -s; } } }
void work( double a[N][N], double b[N][N], double c[N][N], int n ) { int i, j; double tmp; #pragma omp for simd collapse(2) private(tmp) for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { tmp = a[i][j] + b[i][j]; c[i][j] = tmp; } } }
void work_ref( double a[N][N], double b[N][N], double c[N][N], int n ) { int i, j; double tmp; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { tmp = a[i][j] + b[i][j]; c[i][j] = tmp; } } }
void check (double a[N][N], double b[N][N]) { int i, j; for (i = 0; i < N; i++) for (j = 0; j < N; j++) if (a[i][j] - b[i][j] > EPS || b[i][j] - a[i][j] > EPS) abort (); }
int main () { double a[N][N], b[N][N], c[N][N], c_ref[N][N];
init(a, b, N);
work(a, b, c, N); work_ref(a, b, c_ref, N);
check(c, c_ref);
return 0; }
|