From 9762464718183fe3d73e42c83801596111a0df77 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 9 Oct 2024 18:06:39 +0200 Subject: [PATCH 1/2] Fix CBLAS interface filling in the wrong triangle for Row-Major --- interface/gemmt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/gemmt.c b/interface/gemmt.c index cae00877ed..01747af41b 100644 --- a/interface/gemmt.c +++ b/interface/gemmt.c @@ -319,8 +319,8 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, lda = LDB; ldb = LDA; - if (Uplo == CblasUpper) uplo = 0; - if (Uplo == CblasLower) uplo = 1; + if (Uplo == CblasUpper) uplo = 1; + if (Uplo == CblasLower) uplo = 0; if (TransB == CblasNoTrans) transa = 0; From 550bc77832282e4f03c5cfc1b7e7bbb089bc6c26 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Thu, 10 Oct 2024 20:39:29 +0200 Subject: [PATCH 2/2] Fix expectation values for CblasRowMajor order --- utest/test_extensions/test_cgemmt.c | 22 ++++++++++++++++++++++ utest/test_extensions/test_dgemmt.c | 15 +++++++++++++++ utest/test_extensions/test_sgemmt.c | 15 +++++++++++++++ utest/test_extensions/test_zgemmt.c | 23 ++++++++++++++++++++++- 4 files changed, 74 insertions(+), 1 deletion(-) diff --git a/utest/test_extensions/test_cgemmt.c b/utest/test_extensions/test_cgemmt.c index dfeb06ff6e..92590b1e8b 100644 --- a/utest/test_extensions/test_cgemmt.c +++ b/utest/test_extensions/test_cgemmt.c @@ -81,6 +81,28 @@ static void cgemmt_trusted(char api, enum CBLAS_ORDER order, char uplo, char tra ldc *= 2; +#ifndef NO_CBLAS + if (order == CblasRowMajor) { + if (uplo == 'U' || uplo == CblasUpper) + { + for (i = 0; i < m; i++) + for (j = i * 2; j < m * 2; j+=2){ + data_cgemmt.c_verify[i * ldc + j] = + data_cgemmt.c_gemm[i * ldc + j]; + data_cgemmt.c_verify[i * ldc + j + 1] = + data_cgemmt.c_gemm[i * ldc + j + 1]; + } + } else { + for (i = 0; i < m; i++) + for (j = 0; j <= i * 2; j+=2){ + data_cgemmt.c_verify[i * ldc + j] = + data_cgemmt.c_gemm[i * ldc + j]; + data_cgemmt.c_verify[i * ldc + j + 1] = + data_cgemmt.c_gemm[i * ldc + j + 1]; + } + } + } else +#endif if (uplo == 'L' || uplo == CblasLower) { for (i = 0; i < m; i++) diff --git a/utest/test_extensions/test_dgemmt.c b/utest/test_extensions/test_dgemmt.c index fd8f5f6661..9ce8859cca 100644 --- a/utest/test_extensions/test_dgemmt.c +++ b/utest/test_extensions/test_dgemmt.c @@ -77,6 +77,21 @@ static void dgemmt_trusted(char api, enum CBLAS_ORDER order, char uplo, char tra else cblas_dgemm(order, transa, transb, m, m, k, alpha, data_dgemmt.a_test, lda, data_dgemmt.b_test, ldb, beta, data_dgemmt.c_gemm, ldc); + + if (order == CblasRowMajor) { + if (uplo == 'U' || uplo == CblasUpper) + { + for (i = 0; i < m; i++) + for (j = i; j < m; j++) + data_dgemmt.c_verify[i * ldc + j] = + data_dgemmt.c_gemm[i * ldc + j]; + } else { + for (i = 0; i < m; i++) + for (j = 0; j <= i; j++) + data_dgemmt.c_verify[i * ldc + j] = + data_dgemmt.c_gemm[i * ldc + j]; + } + }else #endif if (uplo == 'L' || uplo == CblasLower) diff --git a/utest/test_extensions/test_sgemmt.c b/utest/test_extensions/test_sgemmt.c index 177ce0d73b..f61fcf5fca 100644 --- a/utest/test_extensions/test_sgemmt.c +++ b/utest/test_extensions/test_sgemmt.c @@ -77,6 +77,21 @@ static void sgemmt_trusted(char api, enum CBLAS_ORDER order, char uplo, char tra else cblas_sgemm(order, transa, transb, m, m, k, alpha, data_sgemmt.a_test, lda, data_sgemmt.b_test, ldb, beta, data_sgemmt.c_gemm, ldc); + if (order == CblasRowMajor) { + if (uplo == 'U' || uplo == CblasUpper) + { + for (i = 0; i < m; i++) + for (j = i; j < m; j++) + data_sgemmt.c_verify[i * ldc + j] = + data_sgemmt.c_gemm[i * ldc + j]; + } else { + for (i = 0; i < m; i++) + for (j = 0; j <= i; j++) + data_sgemmt.c_verify[i * ldc + j] = + data_sgemmt.c_gemm[i * ldc + j]; + } + + } else #endif if (uplo == 'L' || uplo == CblasLower) diff --git a/utest/test_extensions/test_zgemmt.c b/utest/test_extensions/test_zgemmt.c index 34b8b61867..dcd70e9e36 100644 --- a/utest/test_extensions/test_zgemmt.c +++ b/utest/test_extensions/test_zgemmt.c @@ -80,7 +80,28 @@ static void zgemmt_trusted(char api, enum CBLAS_ORDER order, char uplo, char tra #endif ldc *= 2; - +#ifndef NO_CBLAS + if (order == CblasRowMajor) { + if (uplo == 'U' || uplo == CblasUpper) + { + for (i = 0; i < m; i++) + for (j = i * 2; j < m * 2; j+=2){ + data_zgemmt.c_verify[i * ldc + j] = + data_zgemmt.c_gemm[i * ldc + j]; + data_zgemmt.c_verify[i * ldc + j + 1] = + data_zgemmt.c_gemm[i * ldc + j + 1]; + } + } else { + for (i = 0; i < m; i++) + for (j = 0; j <= i * 2; j+=2){ + data_zgemmt.c_verify[i * ldc + j] = + data_zgemmt.c_gemm[i * ldc + j]; + data_zgemmt.c_verify[i * ldc + j + 1] = + data_zgemmt.c_gemm[i * ldc + j + 1]; + } + } + }else +#endif if (uplo == 'L' || uplo == CblasLower) { for (i = 0; i < m; i++)