From e607d8de14079e98884035d19301dc88ec46319d Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Tue, 17 Nov 2020 14:43:26 +0100 Subject: [PATCH] Add C version of testcase from issue 602 --- cpp_thread_test/test_dgemm_omp.c | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/cpp_thread_test/test_dgemm_omp.c b/cpp_thread_test/test_dgemm_omp.c index 8b1378917..2396e2502 100644 --- a/cpp_thread_test/test_dgemm_omp.c +++ b/cpp_thread_test/test_dgemm_omp.c @@ -1 +1,56 @@ +#include +#include + +#ifdef _OPENMP + int omp_get_num_procs(); + int omp_get_max_threads(); + void omp_set_num_threads(int); +#endif + + +#define bint int + +void dgemm_(char *transa, char *transb, bint *m, bint *n, bint *k, double *alpha, + const double *a, bint *lda, const double *b, bint *ldb, + double *beta, double *c, bint *ldc); + +void test(int id) +{ + bint i = 0, m = 1000, n = 800, k = 600, N = m*k + k*n + m*n; + double alpha = 1.0, beta = 0.0; + double *A, *B, *C; + + printf("%d\n", id); + + A = (double*)malloc(N*sizeof(double)); + B = A + m*k; + C = B + k*n; + + for (i = 0; i < N; ++i) + A[i] = (double) rand() / RAND_MAX; + + dgemm_("N", "N", &m, &n, &k, &alpha, A, &m, B, &k, &beta, C, &m); + dgemm_("T", "N", &m, &n, &k, &alpha, A, &k, B, &k, &beta, C, &m); + dgemm_("N", "T", &m, &n, &k, &alpha, A, &m, B, &n, &beta, C, &m); + dgemm_("T", "T", &m, &n, &k, &alpha, A, &k, B, &n, &beta, C, &m); + + free(A); +} + +int main() +{ + int i = 0; + +#ifdef _OPENMP + int num_procs = omp_get_num_procs(); + if (num_procs < omp_get_max_threads() * 2) + omp_set_num_threads(num_procs < 4 ? 1 : num_procs/2); +#endif + + #pragma omp parallel for + for (i = 0; i < 100; ++i) + test(i); + + return 0; +}