mirror of
https://github.com/amd/blis.git
synced 2026-05-26 07:25:28 +00:00
Gtestuite: ZGEMM API testing
Functionality testing for below apis are carried out with various input ranges and values
Interface would invoke listed API's in the below sequence if the condition is satisified
List of API's - Condition
SCALM : alpha = 0
GEMV : m = 1 or n = 1
Small ST : ((m0*k0) <= 16384) || ((n0*k0) <= 16384)))
SUP AVX2 : (m || n || k) <= 128
SUP AVX512 : (m || k) <= 128 || n <= 110
Native : Default path, If above API's doesn't support
the given input values
AMD-Internal: [CPUPL-4426]
Change-Id: I40cd30a11592e4e553e09f0d81153abf0bf0b002
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
An object-based framework for developing high-performance BLAS-like
|
||||
libraries.
|
||||
|
||||
Copyright (C) 2023, Advanced Micro Devices, Inc. All rights reserved.
|
||||
Copyright (C) 2023-2024, Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
@@ -33,22 +33,23 @@
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include "test_gemm.h"
|
||||
#include "test_gemm.h"
|
||||
|
||||
class ZGemmAccTest :
|
||||
public ::testing::TestWithParam<std::tuple<char,
|
||||
char,
|
||||
char,
|
||||
gtint_t,
|
||||
gtint_t,
|
||||
gtint_t,
|
||||
dcomplex,
|
||||
dcomplex,
|
||||
gtint_t,
|
||||
gtint_t,
|
||||
gtint_t>> {};
|
||||
class ZGEMMAPI :
|
||||
public ::testing::TestWithParam<std::tuple<char, // storage format
|
||||
char, // transa
|
||||
char, // transb
|
||||
gtint_t, // m
|
||||
gtint_t, // n
|
||||
gtint_t, // k
|
||||
dcomplex, //alpha
|
||||
dcomplex, //beta
|
||||
gtint_t, // inc to the lda
|
||||
gtint_t, // inc to the ldb
|
||||
gtint_t // inc to the ldc
|
||||
>> {};
|
||||
|
||||
TEST_P(ZGemmAccTest, Unit_Tester)
|
||||
TEST_P(ZGEMMAPI, FunctionalTest)
|
||||
{
|
||||
using T = dcomplex;
|
||||
//----------------------------------------------------------
|
||||
@@ -87,7 +88,7 @@ TEST_P(ZGemmAccTest, Unit_Tester)
|
||||
test_gemm<T>( storage, transa, transb, m, n, k, lda_inc, ldb_inc, ldc_inc, alpha, beta, thresh );
|
||||
}
|
||||
|
||||
class ZGemmAccPrint {
|
||||
class ZGEMMPrint {
|
||||
public:
|
||||
std::string operator()(
|
||||
testing::TestParamInfo<std::tuple<char, char, char, gtint_t, gtint_t, gtint_t, dcomplex, dcomplex, gtint_t, gtint_t, gtint_t>> str) const {
|
||||
@@ -103,77 +104,283 @@ public:
|
||||
gtint_t ldb_inc = std::get<9>(str.param);
|
||||
gtint_t ldc_inc = std::get<10>(str.param);
|
||||
#ifdef TEST_BLAS
|
||||
std::string str_name = "zgemm_";
|
||||
std::string str_name = "blas_";
|
||||
#elif TEST_CBLAS
|
||||
std::string str_name = "cblas_zgemm";
|
||||
std::string str_name = "cblas_";
|
||||
#else //#elif TEST_BLIS_TYPED
|
||||
std::string str_name = "bli_zgemm";
|
||||
std::string str_name = "bli_";
|
||||
#endif
|
||||
str_name = str_name + "_" + sfm+sfm+sfm;
|
||||
str_name = str_name + "_" + tsa + tsb;
|
||||
str_name = str_name + "_" + std::to_string(m);
|
||||
str_name = str_name + "_" + std::to_string(n);
|
||||
str_name = str_name + "_" + std::to_string(k);
|
||||
str_name = str_name + "_a" + testinghelpers::get_value_string(alpha);;
|
||||
str_name = str_name + "_b" + testinghelpers::get_value_string(beta);;
|
||||
str_name = str_name + "_" + std::to_string(lda_inc);
|
||||
str_name = str_name + "_" + std::to_string(ldb_inc);
|
||||
str_name = str_name + "_" + std::to_string(ldc_inc);
|
||||
str_name = str_name + "storageC_" + sfm;
|
||||
str_name = str_name + "_transA_" + tsa + "_transB_" + tsb;
|
||||
str_name = str_name + "_m_" + std::to_string(m);
|
||||
str_name = str_name + "_n_" + std::to_string(n);
|
||||
str_name = str_name + "_k_" + std::to_string(k);
|
||||
std::string alpha_str = (alpha.real < 0) ? ("m" + std::to_string(int(std::abs(alpha.real)))) : std::to_string(int(alpha.real));
|
||||
alpha_str = alpha_str + ((alpha.imag < 0) ? ("m" + std::to_string(int(std::abs(alpha.imag)))) : "i" + std::to_string(int(alpha.imag)));
|
||||
std::string beta_str = (beta.real < 0) ? ("m" + std::to_string(int(std::abs(beta.real)))) : std::to_string(int(beta.real));
|
||||
beta_str = beta_str + ((beta.imag < 0) ? ("m" + std::to_string(int(std::abs(beta.imag)))) : "i" + std::to_string(int(beta.imag)));
|
||||
str_name = str_name + "_alpha_" + alpha_str;
|
||||
str_name = str_name + "_beta_" + beta_str;
|
||||
gtint_t lda = testinghelpers::get_leading_dimension( sfm, tsa, m, k, lda_inc );
|
||||
gtint_t ldb = testinghelpers::get_leading_dimension( sfm, tsb, k, n, ldb_inc );
|
||||
gtint_t ldc = testinghelpers::get_leading_dimension( sfm, 'n', m, n, ldc_inc );
|
||||
str_name = str_name + "_lda_" + std::to_string(lda);
|
||||
str_name = str_name + "_ldb_" + std::to_string(ldb);
|
||||
str_name = str_name + "_ldc_" + std::to_string(ldc);
|
||||
return str_name;
|
||||
}
|
||||
};
|
||||
|
||||
/********************************************************************/
|
||||
/* Blas interface testing as per the code sequence */
|
||||
/* Below API's will be invoked if input condition is satisified */
|
||||
/* List of API's - Input conditions */
|
||||
/* SCALM : alpha = 0 */
|
||||
/* GEMV : m = 1 or n = 1 */
|
||||
/* K1 : k = 1 & tranaA = 'n' & transB = 'n; */
|
||||
/* Small ST : ((m0*k0) <= 16384) || ((n0*k0) <= 16384))) */
|
||||
/* SUP AVX2 : (m & n & k) <= 128 */
|
||||
/* SUP AVX512 : (m & k) <= 128 & n <= 110 */
|
||||
/* Native : Default path, */
|
||||
/* : when none of the above API's are invoked */
|
||||
/********************************************************************/
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
SCALM,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n','c','t'), // transa
|
||||
::testing::Values('n','c','t'), // transb
|
||||
::testing::Values(gtint_t(10)), // m
|
||||
::testing::Values(gtint_t(10)), // n
|
||||
::testing::Values(gtint_t(10)), // k
|
||||
::testing::Values(dcomplex{0.0, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{3.1, 15.9},
|
||||
dcomplex{0.0, 0.0}), //beta
|
||||
::testing::Values(gtint_t(0), gtint_t(130)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(120)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(150)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
GEMV_M1_N1,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n', 'c', 't'), // transa
|
||||
::testing::Values('n', 'c', 't'), // transb
|
||||
::testing::Values(gtint_t(1)), // m
|
||||
::testing::Values(gtint_t(1)), // n
|
||||
::testing::Range(gtint_t(100), gtint_t(200), gtint_t(100)), // k
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{2.1, -1.9},
|
||||
dcomplex{0.0, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{2.1, -1.9},
|
||||
dcomplex{0.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(230)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(220)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(250)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
GEMV_M1,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n', 'c', 't'), // transa
|
||||
::testing::Values('n', 'c', 't'), // transb
|
||||
::testing::Values(gtint_t(1)), // m
|
||||
::testing::Range(gtint_t(2), gtint_t(200), gtint_t(40)), // n
|
||||
::testing::Range(gtint_t(100), gtint_t(200), gtint_t(100)), // k
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{2.1, -1.9},
|
||||
dcomplex{0.0, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{2.1, -1.9},
|
||||
dcomplex{0.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(230)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(220)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(250)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
GEMV_N1,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n', 'c', 't'), // transa
|
||||
::testing::Values('n', 'c', 't'), // transb
|
||||
::testing::Range(gtint_t(1), gtint_t(100), gtint_t(20)), // m
|
||||
::testing::Values(gtint_t(1)), // n
|
||||
::testing::Range(gtint_t(100), gtint_t(200), gtint_t(100)), // k
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{3.1, -1.5},
|
||||
dcomplex{0.0, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{2.3, -2.9},
|
||||
dcomplex{0.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(300)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(200)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(500)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
// Unit testing for bli_zgemm_4x4_avx2_k1_nn kernel
|
||||
/* From the BLAS layer(post parameter checking), the inputs will be redirected to this kernel
|
||||
if m != 1, n !=1 and k == 1 */
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
bli_zgemm_4x4_avx2_k1_nn,
|
||||
ZGemmAccTest,
|
||||
K_1,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n'), // transa
|
||||
::testing::Values('n'), // transb
|
||||
::testing::Range(gtint_t(2), gtint_t(8), 1), // m
|
||||
::testing::Range(gtint_t(2), gtint_t(8), 1), // n
|
||||
::testing::Values(gtint_t(1)), // k
|
||||
), // storage format
|
||||
::testing::Values('n'), // transa
|
||||
::testing::Values('n'), // transb
|
||||
::testing::Range(gtint_t(2), gtint_t(8), 1), // m
|
||||
::testing::Range(gtint_t(2), gtint_t(8), 1), // n
|
||||
::testing::Values(gtint_t(1)), // k
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{2.1, -1.9},
|
||||
dcomplex{0.0, 0.0}), // alpha
|
||||
dcomplex{0.0, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{0.0, 1.0}, dcomplex{2.1, -1.9},
|
||||
dcomplex{0.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(3)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(2)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(5)) // increment to the leading dim of c
|
||||
dcomplex{0.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(390)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(290)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(590)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGemmAccPrint()
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
// Black box testing.
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
Blackbox,
|
||||
ZGemmAccTest,
|
||||
SMALL_Matrix_ST,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n','c','t'), // transa
|
||||
::testing::Values('n','c','t'), // transb
|
||||
::testing::Range(gtint_t(10), gtint_t(31), 10), // m
|
||||
::testing::Range(gtint_t(10), gtint_t(31), 10), // n
|
||||
::testing::Range(gtint_t(10), gtint_t(31), 10), // k
|
||||
::testing::Values(dcomplex{2.0,-1.0}), // alpha
|
||||
::testing::Values(dcomplex{1.0,2.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(3)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(2)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(5)) // increment to the leading dim of c
|
||||
), // storage format
|
||||
::testing::Values('n', 'c', 't'), // transa
|
||||
::testing::Values('n', 'c', 't'), // transb
|
||||
::testing::Values(gtint_t(2), gtint_t(3), gtint_t(7), gtint_t(8)), // m
|
||||
::testing::Values(gtint_t(2), gtint_t(3), gtint_t(7), gtint_t(8)), // n
|
||||
::testing::Values(gtint_t(2), gtint_t(4), gtint_t(10)), // k
|
||||
::testing::Values(dcomplex{0.0, 0.0}, dcomplex{1.0, 0}, dcomplex{0, 1.0}, dcomplex{-1.0, -2.0}), // alpha
|
||||
::testing::Values(dcomplex{0.0, 0.0}, dcomplex{1.0, 0}, dcomplex{0, 1.0}, dcomplex{1.0, 2.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(1)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(2)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(3)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGemmAccPrint()
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
Skinny_Matrix_Trans_N,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n'), // transa
|
||||
::testing::Values('n'), // transb
|
||||
::testing::Range(gtint_t(100), gtint_t(105), gtint_t(1)), // m
|
||||
::testing::Range(gtint_t(80), gtint_t(85), gtint_t(1)), // n
|
||||
::testing::Range(gtint_t(1000), gtint_t(1010), gtint_t(1)), // k
|
||||
::testing::Values(dcomplex{-1.0, -2.0}, dcomplex{0.0, -30.0},
|
||||
dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{5.0, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{12.0, 2.3}, dcomplex{0.0, 1.3},
|
||||
dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{5.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(540)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(940)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(240)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
SKinny_Matrix_Trans_T,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('t'), // transa
|
||||
::testing::Values('t'), // transb
|
||||
::testing::Range(gtint_t(105), gtint_t(110), gtint_t(1)), // m
|
||||
::testing::Range(gtint_t(190), gtint_t(195), gtint_t(1)), // n
|
||||
::testing::Range(gtint_t(500), gtint_t(510), gtint_t(1)), // k
|
||||
::testing::Values(dcomplex{-1.8, -21.0}, dcomplex{0.0, -33.0},
|
||||
dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{5.3, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{1.8, 9.3}, dcomplex{0.0, 3.3},
|
||||
dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{2.91, 0.0}, dcomplex{0.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(0)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
Large_Matrix_Trans_N_C_T,
|
||||
ZGEMMAPI,
|
||||
::testing::Combine(
|
||||
::testing::Values('c'
|
||||
#ifndef TEST_BLAS
|
||||
,'r'
|
||||
#endif
|
||||
), // storage format
|
||||
::testing::Values('n', 'c', 't'), // transa
|
||||
::testing::Values('n', 'c', 't'), // transb
|
||||
::testing::Values(gtint_t(200)), // m
|
||||
::testing::Values(gtint_t(180)), // n
|
||||
::testing::Values(gtint_t(170)), // k
|
||||
::testing::Values(dcomplex{1.5, 3.5}, dcomplex{0.0, -10.0},
|
||||
dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{2.0, 0.0}), // alpha
|
||||
::testing::Values(dcomplex{2.0, 4.1}, dcomplex{0.0, 3.4},
|
||||
dcomplex{1.0, 0.0}, dcomplex{-1.0, 0.0},
|
||||
dcomplex{3.3, 0.0}, dcomplex{0.0, 0.0}), // beta
|
||||
::testing::Values(gtint_t(0), gtint_t(300)), // increment to the leading dim of a
|
||||
::testing::Values(gtint_t(0), gtint_t(200)), // increment to the leading dim of b
|
||||
::testing::Values(gtint_t(0), gtint_t(500)) // increment to the leading dim of c
|
||||
),
|
||||
::ZGEMMPrint()
|
||||
);
|
||||
Reference in New Issue
Block a user