You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_dgemm_omp.c 1.3 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #ifdef _OPENMP
  4. int omp_get_num_procs();
  5. int omp_get_max_threads();
  6. void omp_set_num_threads(int);
  7. #endif
  8. #define bint int
  9. void dgemm_(char *transa, char *transb, bint *m, bint *n, bint *k, double *alpha,
  10. const double *a, bint *lda, const double *b, bint *ldb,
  11. double *beta, double *c, bint *ldc);
  12. void test(int id)
  13. {
  14. bint i = 0, m = 1000, n = 800, k = 600, N = m*k + k*n + m*n;
  15. double alpha = 1.0, beta = 0.0;
  16. double *A, *B, *C;
  17. printf("%d\n", id);
  18. A = (double*)malloc(N*sizeof(double));
  19. B = A + m*k;
  20. C = B + k*n;
  21. for (i = 0; i < N; ++i)
  22. A[i] = (double) rand() / RAND_MAX;
  23. dgemm_("N", "N", &m, &n, &k, &alpha, A, &m, B, &k, &beta, C, &m);
  24. dgemm_("T", "N", &m, &n, &k, &alpha, A, &k, B, &k, &beta, C, &m);
  25. dgemm_("N", "T", &m, &n, &k, &alpha, A, &m, B, &n, &beta, C, &m);
  26. dgemm_("T", "T", &m, &n, &k, &alpha, A, &k, B, &n, &beta, C, &m);
  27. free(A);
  28. }
  29. int main()
  30. {
  31. int i = 0;
  32. #ifdef _OPENMP
  33. int num_procs = omp_get_num_procs();
  34. if (num_procs < omp_get_max_threads() * 2)
  35. omp_set_num_threads(num_procs < 4 ? 1 : num_procs/2);
  36. #endif
  37. #pragma omp parallel for
  38. for (i = 0; i < 100; ++i)
  39. test(i);
  40. return 0;
  41. }