simd-5.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* { dg-do run } */
  2. /* { dg-additional-options "-msse2" { target sse2_runtime } } */
  3. /* { dg-additional-options "-mavx" { target avx_runtime } } */
  4. #define N 128
  5. #define M 16
  6. #define EPS 0.0000000000000001
  7. #define SAFELEN 16
  8. #include <stdlib.h>
  9. void init(double a[N][N], double b[N][N], int n)
  10. {
  11. int i, j, s = -1;
  12. for (i = 0; i < n; i++)
  13. {
  14. for (j = 0; j < n; j++)
  15. {
  16. a[i][j] = i * j * s;
  17. b[i][j] = i + j + s;
  18. s = -s;
  19. }
  20. }
  21. }
  22. void work( double a[N][N], double b[N][N], double c[N][N], int n )
  23. {
  24. int i, j;
  25. double tmp;
  26. #pragma omp for simd collapse(2) private(tmp)
  27. for (i = 0; i < n; i++)
  28. {
  29. for (j = 0; j < n; j++)
  30. {
  31. tmp = a[i][j] + b[i][j];
  32. c[i][j] = tmp;
  33. }
  34. }
  35. }
  36. void work_ref( double a[N][N], double b[N][N], double c[N][N], int n )
  37. {
  38. int i, j;
  39. double tmp;
  40. for (i = 0; i < n; i++)
  41. {
  42. for (j = 0; j < n; j++)
  43. {
  44. tmp = a[i][j] + b[i][j];
  45. c[i][j] = tmp;
  46. }
  47. }
  48. }
  49. void check (double a[N][N], double b[N][N])
  50. {
  51. int i, j;
  52. for (i = 0; i < N; i++)
  53. for (j = 0; j < N; j++)
  54. if (a[i][j] - b[i][j] > EPS || b[i][j] - a[i][j] > EPS)
  55. abort ();
  56. }
  57. int main ()
  58. {
  59. double a[N][N], b[N][N], c[N][N], c_ref[N][N];
  60. init(a, b, N);
  61. work(a, b, c, N);
  62. work_ref(a, b, c_ref, N);
  63. check(c, c_ref);
  64. return 0;
  65. }