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_sgemmt.c 42 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467
  1. /*****************************************************************************
  2. Copyright (c) 2023, The OpenBLAS Project
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions are
  6. met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in
  11. the documentation and/or other materials provided with the
  12. distribution.
  13. 3. Neither the name of the OpenBLAS project nor the names of
  14. its contributors may be used to endorse or promote products
  15. derived from this software without specific prior written
  16. permission.
  17. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  18. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20. ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  21. LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  23. SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  24. CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  25. OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  26. USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. **********************************************************************************/
  28. #include "utest/openblas_utest.h"
  29. #include "common.h"
  30. #define DATASIZE 100
  31. struct DATA_SGEMMT {
  32. float a_test[DATASIZE * DATASIZE];
  33. float b_test[DATASIZE * DATASIZE];
  34. float c_test[DATASIZE * DATASIZE];
  35. float c_verify[DATASIZE * DATASIZE];
  36. float c_gemm[DATASIZE * DATASIZE];
  37. };
  38. #ifdef BUILD_SINGLE
  39. static struct DATA_SGEMMT data_sgemmt;
  40. /**
  41. * Compute gemmt via gemm since gemmt is gemm but updates only
  42. * the upper or lower triangular part of the result matrix
  43. *
  44. * param api specifies tested api (C or Fortran)
  45. * param order specifies row or column major order (for Fortran API column major always)
  46. * param uplo specifies whether C’s data is stored in its upper or lower triangle
  47. * param transa specifies op(A), the transposition operation applied to A
  48. * param transb specifies op(B), the transposition operation applied to B
  49. * param m - number of rows of op(A), columns of op(B), and columns and rows of C
  50. * param k - number of columns of op(A) and rows of op(B)
  51. * param alpha - scaling factor for the matrix-matrix product
  52. * param lda - leading dimension of A
  53. * param ldb - leading dimension of B
  54. * param beta - scaling factor for matrix C
  55. * param ldc - leading dimension of C
  56. */
  57. static void sgemmt_trusted(char api, enum CBLAS_ORDER order, char uplo, char transa,
  58. char transb, blasint m, blasint k, float alpha, blasint lda,
  59. blasint ldb, float beta, blasint ldc)
  60. {
  61. blasint i, j;
  62. if(api == 'F')
  63. BLASFUNC(sgemm)(&transa, &transb, &m, &m, &k, &alpha, data_sgemmt.a_test, &lda,
  64. data_sgemmt.b_test, &ldb, &beta, data_sgemmt.c_gemm, &ldc);
  65. #ifndef NO_CBLAS
  66. else
  67. cblas_sgemm(order, transa, transb, m, m, k, alpha, data_sgemmt.a_test, lda,
  68. data_sgemmt.b_test, ldb, beta, data_sgemmt.c_gemm, ldc);
  69. if (order == CblasRowMajor) {
  70. if (uplo == 'U' || uplo == CblasUpper)
  71. {
  72. for (i = 0; i < m; i++)
  73. for (j = i; j < m; j++)
  74. data_sgemmt.c_verify[i * ldc + j] =
  75. data_sgemmt.c_gemm[i * ldc + j];
  76. } else {
  77. for (i = 0; i < m; i++)
  78. for (j = 0; j <= i; j++)
  79. data_sgemmt.c_verify[i * ldc + j] =
  80. data_sgemmt.c_gemm[i * ldc + j];
  81. }
  82. } else
  83. #endif
  84. if (uplo == 'L' || uplo == CblasLower)
  85. {
  86. for (i = 0; i < m; i++)
  87. for (j = i; j < m; j++)
  88. data_sgemmt.c_verify[i * ldc + j] =
  89. data_sgemmt.c_gemm[i * ldc + j];
  90. } else {
  91. for (i = 0; i < m; i++)
  92. for (j = 0; j <= i; j++)
  93. data_sgemmt.c_verify[i * ldc + j] =
  94. data_sgemmt.c_gemm[i * ldc + j];
  95. }
  96. }
  97. /**
  98. * Comapare results computed by sgemmt and sgemmt_trusted
  99. *
  100. * param api specifies tested api (C or Fortran)
  101. * param order specifies row or column major order (for Fortran API column major always)
  102. * param uplo specifies whether C’s data is stored in its upper or lower triangle
  103. * param transa specifies op(A), the transposition operation applied to A
  104. * param transb specifies op(B), the transposition operation applied to B
  105. * param m - number of rows of op(A), columns of op(B), and columns and rows of C
  106. * param k - number of columns of op(A) and rows of op(B)
  107. * param alpha - scaling factor for the matrix-matrix product
  108. * param lda - leading dimension of A
  109. * param ldb - leading dimension of B
  110. * param beta - scaling factor for matrix C
  111. * param ldc - leading dimension of C
  112. * return norm of differences
  113. */
  114. static float check_sgemmt(char api, enum CBLAS_ORDER order, char uplo, char transa,
  115. char transb, blasint m, blasint k, float alpha, blasint lda,
  116. blasint ldb, float beta, blasint ldc)
  117. {
  118. blasint i;
  119. blasint b_cols;
  120. blasint a_cols;
  121. blasint inc = 1;
  122. blasint size_c = m * ldc;
  123. if(order == CblasColMajor){
  124. if (transa == 'T' || transa == 'C' ||
  125. transa == CblasTrans || transa == CblasConjTrans)
  126. a_cols = m;
  127. else a_cols = k;
  128. if (transb == 'T' || transb == 'C' ||
  129. transb == CblasTrans || transb == CblasConjTrans)
  130. b_cols = k;
  131. else b_cols = m;
  132. } else {
  133. if (transa == 'T' || transa == 'C' ||
  134. transa == CblasTrans || transa == CblasConjTrans)
  135. a_cols = k;
  136. else a_cols = m;
  137. if (transb == 'T' || transb == 'C' ||
  138. transb == CblasTrans || transb == CblasConjTrans)
  139. b_cols = m;
  140. else b_cols = k;
  141. }
  142. srand_generate(data_sgemmt.a_test, a_cols * lda);
  143. srand_generate(data_sgemmt.b_test, b_cols * ldb);
  144. srand_generate(data_sgemmt.c_test, m * ldc);
  145. for (i = 0; i < m * ldc; i++)
  146. data_sgemmt.c_gemm[i] = data_sgemmt.c_verify[i] = data_sgemmt.c_test[i];
  147. sgemmt_trusted(api, order, uplo, transa, transb, m, k, alpha, lda, ldb, beta, ldc);
  148. if (api == 'F')
  149. BLASFUNC(sgemmt)(&uplo, &transa, &transb, &m, &k, &alpha, data_sgemmt.a_test,
  150. &lda, data_sgemmt.b_test, &ldb, &beta, data_sgemmt.c_test, &ldc);
  151. #ifndef NO_CBLAS
  152. else
  153. cblas_sgemmt(order, uplo, transa, transb, m, k, alpha, data_sgemmt.a_test, lda,
  154. data_sgemmt.b_test, ldb, beta, data_sgemmt.c_test, ldc);
  155. #endif
  156. for (i = 0; i < m * ldc; i++)
  157. data_sgemmt.c_verify[i] -= data_sgemmt.c_test[i];
  158. return BLASFUNC(snrm2)(&size_c, data_sgemmt.c_verify, &inc) / size_c;
  159. }
  160. /**
  161. * Check if error function was called with expected function name
  162. * and param info
  163. *
  164. * param uplo specifies whether C’s data is stored in its upper or lower triangle
  165. * param transa specifies op(A), the transposition operation applied to A
  166. * param transb specifies op(B), the transposition operation applied to B
  167. * param m - number of rows of op(A), columns of op(B), and columns and rows of C
  168. * param k - number of columns of op(A) and rows of op(B)
  169. * param lda - leading dimension of A
  170. * param ldb - leading dimension of B
  171. * param ldc - leading dimension of C
  172. * param expected_info - expected invalid parameter number in sgemmt
  173. * return TRUE if everything is ok, otherwise FALSE
  174. */
  175. static int check_badargs(char api, enum CBLAS_ORDER order, char uplo, char transa,
  176. char transb, blasint m, blasint k, blasint lda, blasint ldb,
  177. blasint ldc, int expected_info)
  178. {
  179. float alpha = 1.0f;
  180. float beta = 0.0f;
  181. set_xerbla("SGEMMT ", expected_info);
  182. if (api == 'F')
  183. BLASFUNC(sgemmt)(&uplo, &transa, &transb, &m, &k, &alpha, data_sgemmt.a_test,
  184. &lda, data_sgemmt.b_test, &ldb, &beta, data_sgemmt.c_test, &ldc);
  185. #ifndef NO_CBLAS
  186. else
  187. cblas_sgemmt(order, uplo, transa, transb, m, k, alpha, data_sgemmt.a_test, lda,
  188. data_sgemmt.b_test, ldb, beta, data_sgemmt.c_test, ldc);
  189. #endif
  190. return check_error();
  191. }
  192. /**
  193. * Fortran API specific test
  194. * Test sgemmt by comparing it against sgemm
  195. * with the following options:
  196. *
  197. * C’s data is stored in its upper triangle part
  198. * A not transposed
  199. * B not transposed
  200. */
  201. CTEST(sgemmt, upper_M_50_K_50_a_notrans_b_notrans)
  202. {
  203. blasint M = 50, K = 50;
  204. blasint lda = 50, ldb = 50, ldc = 50;
  205. char transa = 'N', transb = 'N';
  206. char uplo = 'U';
  207. float alpha = 1.5f;
  208. float beta = 2.0f;
  209. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  210. M, K, alpha, lda, ldb, beta, ldc);
  211. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  212. }
  213. /**
  214. * Fortran API specific test
  215. * Test sgemmt by comparing it against sgemm
  216. * with the following options:
  217. *
  218. * C’s data is stored in its upper triangle part
  219. * A transposed
  220. * B not transposed
  221. */
  222. CTEST(sgemmt, upper_M_100_K_50_a_trans_b_notrans)
  223. {
  224. blasint M = 100, K = 50;
  225. blasint lda = 50, ldb = 50, ldc = 100;
  226. char transa = 'T', transb = 'N';
  227. char uplo = 'U';
  228. float alpha = 1.0f;
  229. float beta = 2.0f;
  230. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  231. M, K, alpha, lda, ldb, beta, ldc);
  232. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  233. }
  234. /**
  235. * Fortran API specific test
  236. * Test sgemmt by comparing it against sgemm
  237. * with the following options:
  238. *
  239. * C’s data is stored in its upper triangle part
  240. * A not transposed
  241. * B transposed
  242. */
  243. CTEST(sgemmt, upper_M_50_K_100_a_notrans_b_trans)
  244. {
  245. blasint M = 50, K = 100;
  246. blasint lda = 50, ldb = 50, ldc = 50;
  247. char transa = 'N', transb = 'T';
  248. char uplo = 'U';
  249. float alpha = 1.0f;
  250. float beta = 0.0f;
  251. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  252. M, K, alpha, lda, ldb, beta, ldc);
  253. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  254. }
  255. /**
  256. * Fortran API specific test
  257. * Test sgemmt by comparing it against sgemm
  258. * with the following options:
  259. *
  260. * C’s data is stored in its upper triangle part
  261. * A transposed
  262. * B transposed
  263. */
  264. CTEST(sgemmt, upper_M_50_K_50_a_trans_b_trans)
  265. {
  266. blasint M = 50, K = 50;
  267. blasint lda = 50, ldb = 50, ldc = 50;
  268. char transa = 'T', transb = 'T';
  269. char uplo = 'U';
  270. float alpha = 1.5f;
  271. float beta = 2.0f;
  272. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  273. M, K, alpha, lda, ldb, beta, ldc);
  274. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  275. }
  276. /**
  277. * Fortran API specific test
  278. * Test sgemmt by comparing it against sgemm
  279. * with the following options:
  280. *
  281. * C’s data is stored in its upper triangle part
  282. * alpha = 0.0
  283. */
  284. CTEST(sgemmt, upper_alpha_zero)
  285. {
  286. blasint M = 50, K = 50;
  287. blasint lda = 50, ldb = 50, ldc = 50;
  288. char transa = 'N', transb = 'N';
  289. char uplo = 'U';
  290. float alpha = 0.0f;
  291. float beta = 2.0f;
  292. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  293. M, K, alpha, lda, ldb, beta, ldc);
  294. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  295. }
  296. /**
  297. * Fortran API specific test
  298. * Test sgemmt by comparing it against sgemm
  299. * with the following options:
  300. *
  301. * C’s data is stored in its upper triangle part
  302. * beta = 1.0
  303. */
  304. CTEST(sgemmt, upper_beta_one)
  305. {
  306. blasint M = 50, K = 50;
  307. blasint lda = 50, ldb = 50, ldc = 50;
  308. char transa = 'N', transb = 'N';
  309. char uplo = 'U';
  310. float alpha = 2.0f;
  311. float beta = 1.0f;
  312. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  313. M, K, alpha, lda, ldb, beta, ldc);
  314. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  315. }
  316. /**
  317. * Fortran API specific test
  318. * Test sgemmt by comparing it against sgemm
  319. * with the following options:
  320. *
  321. * C’s data is stored in its lower triangle part
  322. * A not transposed
  323. * B not transposed
  324. */
  325. CTEST(sgemmt, lower_M_50_K_50_a_notrans_b_notrans)
  326. {
  327. blasint M = 50, K = 50;
  328. blasint lda = 50, ldb = 50, ldc = 50;
  329. char transa = 'N', transb = 'N';
  330. char uplo = 'L';
  331. float alpha = 1.5f;
  332. float beta = 2.0f;
  333. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  334. M, K, alpha, lda, ldb, beta, ldc);
  335. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  336. }
  337. /**
  338. * Fortran API specific test
  339. * Test sgemmt by comparing it against sgemm
  340. * with the following options:
  341. *
  342. * C’s data is stored in its lower triangle part
  343. * A transposed
  344. * B not transposed
  345. */
  346. CTEST(sgemmt, lower_M_100_K_50_a_trans_b_notrans)
  347. {
  348. blasint M = 100, K = 50;
  349. blasint lda = 50, ldb = 50, ldc = 100;
  350. char transa = 'T', transb = 'N';
  351. char uplo = 'L';
  352. float alpha = 1.0f;
  353. float beta = 2.0f;
  354. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  355. M, K, alpha, lda, ldb, beta, ldc);
  356. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  357. }
  358. /**
  359. * Fortran API specific test
  360. * Test sgemmt by comparing it against sgemm
  361. * with the following options:
  362. *
  363. * C’s data is stored in its lower triangle part
  364. * A not transposed
  365. * B transposed
  366. */
  367. CTEST(sgemmt, lower_M_50_K_100_a_notrans_b_trans)
  368. {
  369. blasint M = 50, K = 100;
  370. blasint lda = 50, ldb = 50, ldc = 50;
  371. char transa = 'N', transb = 'T';
  372. char uplo = 'L';
  373. float alpha = 1.0f;
  374. float beta = 0.0f;
  375. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  376. M, K, alpha, lda, ldb, beta, ldc);
  377. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  378. }
  379. /**
  380. * Fortran API specific test
  381. * Test sgemmt by comparing it against sgemm
  382. * with the following options:
  383. *
  384. * C’s data is stored in its lower triangle part
  385. * A transposed
  386. * B transposed
  387. */
  388. CTEST(sgemmt, lower_M_50_K_50_a_trans_b_trans)
  389. {
  390. blasint M = 50, K = 50;
  391. blasint lda = 50, ldb = 50, ldc = 50;
  392. char transa = 'T', transb = 'T';
  393. char uplo = 'L';
  394. float alpha = 1.5f;
  395. float beta = 2.0f;
  396. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  397. M, K, alpha, lda, ldb, beta, ldc);
  398. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  399. }
  400. /**
  401. * Fortran API specific test
  402. * Test sgemmt by comparing it against sgemm
  403. * with the following options:
  404. *
  405. * C’s data is stored in its lower triangle part
  406. * alpha = 0.0
  407. */
  408. CTEST(sgemmt, lower_alpha_zero)
  409. {
  410. blasint M = 50, K = 50;
  411. blasint lda = 50, ldb = 50, ldc = 50;
  412. char transa = 'N', transb = 'N';
  413. char uplo = 'L';
  414. float alpha = 0.0f;
  415. float beta = 2.0f;
  416. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  417. M, K, alpha, lda, ldb, beta, ldc);
  418. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  419. }
  420. /**
  421. * Fortran API specific test
  422. * Test sgemmt by comparing it against sgemm
  423. * with the following options:
  424. *
  425. * C’s data is stored in its lower triangle part
  426. * beta = 1.0
  427. */
  428. CTEST(sgemmt, lower_beta_one)
  429. {
  430. blasint M = 50, K = 50;
  431. blasint lda = 50, ldb = 50, ldc = 50;
  432. char transa = 'N', transb = 'N';
  433. char uplo = 'L';
  434. float alpha = 2.0f;
  435. float beta = 1.0f;
  436. float norm = check_sgemmt('F', CblasColMajor, uplo, transa, transb,
  437. M, K, alpha, lda, ldb, beta, ldc);
  438. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  439. }
  440. #ifndef NO_CBLAS
  441. /**
  442. * C API specific test
  443. * Test sgemmt by comparing it against sgemm
  444. * with the following options:
  445. *
  446. * Column Major
  447. * C’s data is stored in its upper triangle part
  448. * A not transposed
  449. * B not transposed
  450. */
  451. CTEST(sgemmt, c_api_colmajor_upper_M_50_K_50_a_notrans_b_notrans)
  452. {
  453. blasint M = 50, K = 50;
  454. blasint lda = 50, ldb = 50, ldc = 50;
  455. float alpha = 1.5f;
  456. float beta = 2.0f;
  457. float norm = check_sgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  458. M, K, alpha, lda, ldb, beta, ldc);
  459. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  460. }
  461. /**
  462. * C API specific test
  463. * Test sgemmt by comparing it against sgemm
  464. * with the following options:
  465. *
  466. * Column Major
  467. * C’s data is stored in its upper triangle part
  468. * A transposed
  469. * B not transposed
  470. */
  471. CTEST(sgemmt, c_api_colmajor_upper_M_100_K_50_a_trans_b_notrans)
  472. {
  473. blasint M = 100, K = 50;
  474. blasint lda = 50, ldb = 50, ldc = 100;
  475. float alpha = 1.0f;
  476. float beta = 2.0f;
  477. float norm = check_sgemmt('C', CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans,
  478. M, K, alpha, lda, ldb, beta, ldc);
  479. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  480. }
  481. /**
  482. * C API specific test
  483. * Test sgemmt by comparing it against sgemm
  484. * with the following options:
  485. *
  486. * Column Major
  487. * C’s data is stored in its upper triangle part
  488. * A not transposed
  489. * B transposed
  490. */
  491. CTEST(sgemmt, c_api_colmajor_upper_M_50_K_100_a_notrans_b_trans)
  492. {
  493. blasint M = 50, K = 100;
  494. blasint lda = 50, ldb = 50, ldc = 50;
  495. float alpha = 1.0f;
  496. float beta = 0.0f;
  497. float norm = check_sgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans,
  498. M, K, alpha, lda, ldb, beta, ldc);
  499. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  500. }
  501. /**
  502. * C API specific test
  503. * Test sgemmt by comparing it against sgemm
  504. * with the following options:
  505. *
  506. * Column Major
  507. * C’s data is stored in its upper triangle part
  508. * A transposed
  509. * B transposed
  510. */
  511. CTEST(sgemmt, c_api_colmajor_upper_M_50_K_50_a_trans_b_trans)
  512. {
  513. blasint M = 50, K = 50;
  514. blasint lda = 50, ldb = 50, ldc = 50;
  515. float alpha = 1.5f;
  516. float beta = 2.0f;
  517. float norm = check_sgemmt('C', CblasColMajor, CblasUpper, CblasTrans, CblasTrans,
  518. M, K, alpha, lda, ldb, beta, ldc);
  519. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  520. }
  521. /**
  522. * C API specific test
  523. * Test sgemmt by comparing it against sgemm
  524. * with the following options:
  525. *
  526. * Column Major
  527. * C’s data is stored in its upper triangle part
  528. * alpha = 0.0
  529. */
  530. CTEST(sgemmt, c_api_colmajor_upper_alpha_zero)
  531. {
  532. blasint M = 50, K = 50;
  533. blasint lda = 50, ldb = 50, ldc = 50;
  534. float alpha = 0.0f;
  535. float beta = 2.0f;
  536. float norm = check_sgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  537. M, K, alpha, lda, ldb, beta, ldc);
  538. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  539. }
  540. /**
  541. * C API specific test
  542. * Test sgemmt by comparing it against sgemm
  543. * with the following options:
  544. *
  545. * Column Major
  546. * C’s data is stored in its upper triangle part
  547. * beta = 1.0
  548. */
  549. CTEST(sgemmt, c_api_colmajor_upper_beta_one)
  550. {
  551. blasint M = 50, K = 50;
  552. blasint lda = 50, ldb = 50, ldc = 50;
  553. float alpha = 2.0f;
  554. float beta = 1.0f;
  555. float norm = check_sgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  556. M, K, alpha, lda, ldb, beta, ldc);
  557. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  558. }
  559. /**
  560. * C API specific test
  561. * Test sgemmt by comparing it against sgemm
  562. * with the following options:
  563. *
  564. * Column Major
  565. * C’s data is stored in its lower triangle part
  566. * A not transposed
  567. * B not transposed
  568. */
  569. CTEST(sgemmt, c_api_colmajor_lower_M_50_K_50_a_notrans_b_notrans)
  570. {
  571. blasint M = 50, K = 50;
  572. blasint lda = 50, ldb = 50, ldc = 50;
  573. float alpha = 1.5f;
  574. float beta = 2.0f;
  575. float norm = check_sgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  576. M, K, alpha, lda, ldb, beta, ldc);
  577. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  578. }
  579. /**
  580. * C API specific test
  581. * Test sgemmt by comparing it against sgemm
  582. * with the following options:
  583. *
  584. * Column Major
  585. * C’s data is stored in its lower triangle part
  586. * A transposed
  587. * B not transposed
  588. */
  589. CTEST(sgemmt, c_api_colmajor_lower_M_100_K_50_a_trans_b_notrans)
  590. {
  591. blasint M = 100, K = 50;
  592. blasint lda = 50, ldb = 50, ldc = 100;
  593. float alpha = 1.0f;
  594. float beta = 2.0f;
  595. float norm = check_sgemmt('C', CblasColMajor, CblasLower, CblasTrans, CblasNoTrans,
  596. M, K, alpha, lda, ldb, beta, ldc);
  597. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  598. }
  599. /**
  600. * C API specific test
  601. * Test sgemmt by comparing it against sgemm
  602. * with the following options:
  603. *
  604. * Column Major
  605. * C’s data is stored in its lower triangle part
  606. * A not transposed
  607. * B transposed
  608. */
  609. CTEST(sgemmt, c_api_colmajor_lower_M_50_K_100_a_notrans_b_trans)
  610. {
  611. blasint M = 50, K = 100;
  612. blasint lda = 50, ldb = 50, ldc = 50;
  613. float alpha = 1.0f;
  614. float beta = 0.0f;
  615. float norm = check_sgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasTrans,
  616. M, K, alpha, lda, ldb, beta, ldc);
  617. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  618. }
  619. /**
  620. * C API specific test
  621. * Test sgemmt by comparing it against sgemm
  622. * with the following options:
  623. *
  624. * Column Major
  625. * C’s data is stored in its lower triangle part
  626. * A transposed
  627. * B transposed
  628. */
  629. CTEST(sgemmt, c_api_colmajor_lower_M_50_K_50_a_trans_b_trans)
  630. {
  631. blasint M = 50, K = 50;
  632. blasint lda = 50, ldb = 50, ldc = 50;
  633. float alpha = 1.5f;
  634. float beta = 2.0f;
  635. float norm = check_sgemmt('C', CblasColMajor, CblasLower, CblasTrans, CblasTrans,
  636. M, K, alpha, lda, ldb, beta, ldc);
  637. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  638. }
  639. /**
  640. * C API specific test
  641. * Test sgemmt by comparing it against sgemm
  642. * with the following options:
  643. *
  644. * Column Major
  645. * C’s data is stored in its lower triangle part
  646. * alpha = 0.0
  647. */
  648. CTEST(sgemmt, c_api_colmajor_lower_alpha_zero)
  649. {
  650. blasint M = 50, K = 50;
  651. blasint lda = 50, ldb = 50, ldc = 50;
  652. float alpha = 0.0f;
  653. float beta = 2.0f;
  654. float norm = check_sgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  655. M, K, alpha, lda, ldb, beta, ldc);
  656. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  657. }
  658. /**
  659. * C API specific test
  660. * Test sgemmt by comparing it against sgemm
  661. * with the following options:
  662. *
  663. * Column Major
  664. * C’s data is stored in its lower triangle part
  665. * beta = 1.0
  666. */
  667. CTEST(sgemmt, c_api_colmajor_lower_beta_one)
  668. {
  669. blasint M = 50, K = 50;
  670. blasint lda = 50, ldb = 50, ldc = 50;
  671. float alpha = 2.0f;
  672. float beta = 1.0f;
  673. float norm = check_sgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  674. M, K, alpha, lda, ldb, beta, ldc);
  675. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  676. }
  677. /**
  678. * C API specific test
  679. * Test sgemmt by comparing it against sgemm
  680. * with the following options:
  681. *
  682. * Row Major
  683. * C’s data is stored in its upper triangle part
  684. * A not transposed
  685. * B not transposed
  686. */
  687. CTEST(sgemmt, c_api_rowmajor_upper_M_50_K_50_a_notrans_b_notrans)
  688. {
  689. blasint M = 50, K = 50;
  690. blasint lda = 50, ldb = 50, ldc = 50;
  691. float alpha = 1.5f;
  692. float beta = 2.0f;
  693. float norm = check_sgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  694. M, K, alpha, lda, ldb, beta, ldc);
  695. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  696. }
  697. /**
  698. * C API specific test
  699. * Test sgemmt by comparing it against sgemm
  700. * with the following options:
  701. *
  702. * Row Major
  703. * C’s data is stored in its upper triangle part
  704. * A transposed
  705. * B not transposed
  706. */
  707. CTEST(sgemmt, c_api_rowmajor_upper_M_100_K_50_a_trans_b_notrans)
  708. {
  709. blasint M = 100, K = 50;
  710. blasint lda = 100, ldb = 100, ldc = 100;
  711. float alpha = 1.0f;
  712. float beta = 2.0f;
  713. float norm = check_sgemmt('C', CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans,
  714. M, K, alpha, lda, ldb, beta, ldc);
  715. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  716. }
  717. /**
  718. * C API specific test
  719. * Test sgemmt by comparing it against sgemm
  720. * with the following options:
  721. *
  722. * Row Major
  723. * C’s data is stored in its upper triangle part
  724. * A not transposed
  725. * B transposed
  726. */
  727. CTEST(sgemmt, c_api_rowmajor_upper_M_50_K_100_a_notrans_b_trans)
  728. {
  729. blasint M = 50, K = 100;
  730. blasint lda = 100, ldb = 100, ldc = 50;
  731. float alpha = 1.0f;
  732. float beta = 0.0f;
  733. float norm = check_sgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans,
  734. M, K, alpha, lda, ldb, beta, ldc);
  735. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  736. }
  737. /**
  738. * C API specific test
  739. * Test sgemmt by comparing it against sgemm
  740. * with the following options:
  741. *
  742. * Row Major
  743. * C’s data is stored in its upper triangle part
  744. * A transposed
  745. * B transposed
  746. */
  747. CTEST(sgemmt, c_api_rowmajor_upper_M_50_K_50_a_trans_b_trans)
  748. {
  749. blasint M = 50, K = 50;
  750. blasint lda = 50, ldb = 50, ldc = 50;
  751. float alpha = 1.5f;
  752. float beta = 2.0f;
  753. float norm = check_sgemmt('C', CblasRowMajor, CblasUpper, CblasTrans, CblasTrans,
  754. M, K, alpha, lda, ldb, beta, ldc);
  755. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  756. }
  757. /**
  758. * C API specific test
  759. * Test sgemmt by comparing it against sgemm
  760. * with the following options:
  761. *
  762. * Row Major
  763. * C’s data is stored in its upper triangle part
  764. * alpha = 0.0
  765. */
  766. CTEST(sgemmt, c_api_rowmajor_upper_alpha_zero)
  767. {
  768. blasint M = 50, K = 50;
  769. blasint lda = 50, ldb = 50, ldc = 50;
  770. float alpha = 0.0f;
  771. float beta = 2.0f;
  772. float norm = check_sgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  773. M, K, alpha, lda, ldb, beta, ldc);
  774. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  775. }
  776. /**
  777. * C API specific test
  778. * Test sgemmt by comparing it against sgemm
  779. * with the following options:
  780. *
  781. * Row Major
  782. * C’s data is stored in its upper triangle part
  783. * beta = 1.0
  784. */
  785. CTEST(sgemmt, c_api_rowmajor_upper_beta_one)
  786. {
  787. blasint M = 50, K = 50;
  788. blasint lda = 50, ldb = 50, ldc = 50;
  789. float alpha = 2.0f;
  790. float beta = 1.0f;
  791. float norm = check_sgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  792. M, K, alpha, lda, ldb, beta, ldc);
  793. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  794. }
  795. /**
  796. * C API specific test
  797. * Test sgemmt by comparing it against sgemm
  798. * with the following options:
  799. *
  800. * Row Major
  801. * C’s data is stored in its lower triangle part
  802. * A not transposed
  803. * B not transposed
  804. */
  805. CTEST(sgemmt, c_api_rowmajor_lower_M_50_K_50_a_notrans_b_notrans)
  806. {
  807. blasint M = 50, K = 50;
  808. blasint lda = 50, ldb = 50, ldc = 50;
  809. float alpha = 1.5f;
  810. float beta = 2.0f;
  811. float norm = check_sgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  812. M, K, alpha, lda, ldb, beta, ldc);
  813. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  814. }
  815. /**
  816. * C API specific test
  817. * Test sgemmt by comparing it against sgemm
  818. * with the following options:
  819. *
  820. * Row Major
  821. * C’s data is stored in its lower triangle part
  822. * A transposed
  823. * B not transposed
  824. */
  825. CTEST(sgemmt, c_api_rowmajor_lower_M_100_K_50_a_trans_b_notrans)
  826. {
  827. blasint M = 100, K = 50;
  828. blasint lda = 100, ldb = 100, ldc = 100;
  829. float alpha = 1.0f;
  830. float beta = 2.0f;
  831. float norm = check_sgemmt('C', CblasRowMajor, CblasLower, CblasTrans, CblasNoTrans,
  832. M, K, alpha, lda, ldb, beta, ldc);
  833. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  834. }
  835. /**
  836. * C API specific test
  837. * Test sgemmt by comparing it against sgemm
  838. * with the following options:
  839. *
  840. * Row Major
  841. * C’s data is stored in its lower triangle part
  842. * A not transposed
  843. * B transposed
  844. */
  845. CTEST(sgemmt, c_api_rowmajor_lower_M_50_K_100_a_notrans_b_trans)
  846. {
  847. blasint M = 50, K = 100;
  848. blasint lda = 100, ldb = 100, ldc = 50;
  849. float alpha = 1.0f;
  850. float beta = 0.0f;
  851. float norm = check_sgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasTrans,
  852. M, K, alpha, lda, ldb, beta, ldc);
  853. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  854. }
  855. /**
  856. * C API specific test
  857. * Test sgemmt by comparing it against sgemm
  858. * with the following options:
  859. *
  860. * Row Major
  861. * C’s data is stored in its lower triangle part
  862. * A transposed
  863. * B transposed
  864. */
  865. CTEST(sgemmt, c_api_rowmajor_lower_M_50_K_50_a_trans_b_trans)
  866. {
  867. blasint M = 50, K = 50;
  868. blasint lda = 50, ldb = 50, ldc = 50;
  869. float alpha = 1.5f;
  870. float beta = 2.0f;
  871. float norm = check_sgemmt('C', CblasRowMajor, CblasLower, CblasTrans, CblasTrans,
  872. M, K, alpha, lda, ldb, beta, ldc);
  873. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  874. }
  875. /**
  876. * C API specific test
  877. * Test sgemmt by comparing it against sgemm
  878. * with the following options:
  879. *
  880. * Row Major
  881. * C’s data is stored in its lower triangle part
  882. * alpha = 0.0
  883. */
  884. CTEST(sgemmt, c_api_rowmajor_lower_alpha_zero)
  885. {
  886. blasint M = 50, K = 50;
  887. blasint lda = 50, ldb = 50, ldc = 50;
  888. float alpha = 0.0f;
  889. float beta = 2.0f;
  890. float norm = check_sgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  891. M, K, alpha, lda, ldb, beta, ldc);
  892. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  893. }
  894. /**
  895. * C API specific test
  896. * Test sgemmt by comparing it against sgemm
  897. * with the following options:
  898. *
  899. * Row Major
  900. * C’s data is stored in its lower triangle part
  901. * beta = 1.0
  902. */
  903. CTEST(sgemmt, c_api_rowmajor_lower_beta_one)
  904. {
  905. blasint M = 50, K = 50;
  906. blasint lda = 50, ldb = 50, ldc = 50;
  907. float alpha = 2.0f;
  908. float beta = 1.0f;
  909. float norm = check_sgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  910. M, K, alpha, lda, ldb, beta, ldc);
  911. ASSERT_DBL_NEAR_TOL(0.0f, norm, SINGLE_EPS);
  912. }
  913. #endif
  914. /**
  915. * Fortran API specific test
  916. * Test error function for an invalid param uplo.
  917. * Must be upper (U) or lower (L).
  918. */
  919. CTEST(sgemmt, xerbla_uplo_invalid)
  920. {
  921. blasint M = 50, K = 50;
  922. blasint lda = 50, ldb = 50, ldc = 50;
  923. char transa = 'N', transb = 'N';
  924. char uplo = 'O';
  925. int expected_info = 1;
  926. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  927. M, K, lda, ldb, ldc, expected_info);
  928. ASSERT_EQUAL(TRUE, passed);
  929. }
  930. /**
  931. * Fortran API specific test
  932. * Test error function for an invalid param transa.
  933. * Must be trans (T/C) or no-trans (N/R).
  934. */
  935. CTEST(sgemmt, xerbla_transa_invalid)
  936. {
  937. blasint M = 50, K = 50;
  938. blasint lda = 50, ldb = 50, ldc = 50;
  939. char transa = 'O', transb = 'N';
  940. char uplo = 'U';
  941. int expected_info = 2;
  942. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  943. M, K, lda, ldb, ldc, expected_info);
  944. ASSERT_EQUAL(TRUE, passed);
  945. }
  946. /**
  947. * Fortran API specific test
  948. * Test error function for an invalid param transb.
  949. * Must be trans (T/C) or no-trans (N/R).
  950. */
  951. CTEST(sgemmt, xerbla_transb_invalid)
  952. {
  953. blasint M = 50, K = 50;
  954. blasint lda = 50, ldb = 50, ldc = 50;
  955. char transa = 'N', transb = 'O';
  956. char uplo = 'U';
  957. int expected_info = 3;
  958. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  959. M, K, lda, ldb, ldc, expected_info);
  960. ASSERT_EQUAL(TRUE, passed);
  961. }
  962. /**
  963. * Fortran API specific test
  964. * Test error function for an invalid param M.
  965. * Must be positive.
  966. */
  967. CTEST(sgemmt, xerbla_m_invalid)
  968. {
  969. blasint M = -1, K = 50;
  970. blasint lda = 50, ldb = 50, ldc = 50;
  971. char transa = 'N', transb = 'N';
  972. char uplo = 'U';
  973. int expected_info = 4;
  974. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  975. M, K, lda, ldb, ldc, expected_info);
  976. ASSERT_EQUAL(TRUE, passed);
  977. }
  978. /**
  979. * Fortran API specific test
  980. * Test error function for an invalid param K.
  981. * Must be positive.
  982. */
  983. CTEST(sgemmt, xerbla_k_invalid)
  984. {
  985. blasint M = 50, K = -1;
  986. blasint lda = 50, ldb = 50, ldc = 50;
  987. char transa = 'N', transb = 'N';
  988. char uplo = 'U';
  989. int expected_info = 5;
  990. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  991. M, K, lda, ldb, ldc, expected_info);
  992. ASSERT_EQUAL(TRUE, passed);
  993. }
  994. /**
  995. * Fortran API specific test
  996. * Test error function for an invalid param lda.
  997. * Must be must be at least K if matrix A transposed.
  998. */
  999. CTEST(sgemmt, xerbla_lda_invalid)
  1000. {
  1001. blasint M = 50, K = 100;
  1002. blasint lda = 50, ldb = 100, ldc = 50;
  1003. char transa = 'T', transb = 'N';
  1004. char uplo = 'U';
  1005. int expected_info = 8;
  1006. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1007. M, K, lda, ldb, ldc, expected_info);
  1008. ASSERT_EQUAL(TRUE, passed);
  1009. }
  1010. /**
  1011. * Fortran API specific test
  1012. * Test error function for an invalid param ldb.
  1013. * Must be must be at least K if matrix B not transposed.
  1014. */
  1015. CTEST(sgemmt, xerbla_ldb_invalid)
  1016. {
  1017. blasint M = 50, K = 100;
  1018. blasint lda = 50, ldb = 50, ldc = 50;
  1019. char transa = 'N', transb = 'N';
  1020. char uplo = 'U';
  1021. int expected_info = 10;
  1022. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1023. M, K, lda, ldb, ldc, expected_info);
  1024. ASSERT_EQUAL(TRUE, passed);
  1025. }
  1026. /**
  1027. * Fortran API specific test
  1028. * Test error function for an invalid param ldc.
  1029. * Must be must be at least M.
  1030. */
  1031. CTEST(sgemmt, xerbla_ldc_invalid)
  1032. {
  1033. blasint M = 100, K = 50;
  1034. blasint lda = 50, ldb = 50, ldc = 50;
  1035. char transa = 'T', transb = 'N';
  1036. char uplo = 'U';
  1037. int expected_info = 13;
  1038. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1039. M, K, lda, ldb, ldc, expected_info);
  1040. ASSERT_EQUAL(TRUE, passed);
  1041. }
  1042. #ifndef NO_CBLAS
  1043. /**
  1044. * C API specific test.
  1045. * Test error function for an invalid param order.
  1046. * Must be column or row major.
  1047. */
  1048. CTEST(sgemmt, xerbla_c_api_major_invalid)
  1049. {
  1050. blasint M = 50, K = 50;
  1051. blasint lda = 50, ldb = 50, ldc = 50;
  1052. int expected_info = 0;
  1053. int passed = check_badargs('C', 'O', CblasUpper, CblasNoTrans, CblasNoTrans,
  1054. M, K, lda, ldb, ldc, expected_info);
  1055. ASSERT_EQUAL(TRUE, passed);
  1056. }
  1057. /**
  1058. * C API specific test. Column Major
  1059. * Test error function for an invalid param uplo.
  1060. * Must be upper or lower.
  1061. */
  1062. CTEST(sgemmt, xerbla_c_api_colmajor_uplo_invalid)
  1063. {
  1064. blasint M = 50, K = 50;
  1065. blasint lda = 50, ldb = 50, ldc = 50;
  1066. int expected_info = 1;
  1067. int passed = check_badargs('C', CblasColMajor, 'O', CblasNoTrans, CblasNoTrans,
  1068. M, K, lda, ldb, ldc, expected_info);
  1069. ASSERT_EQUAL(TRUE, passed);
  1070. }
  1071. /**
  1072. * C API specific test. Column Major
  1073. * Test error function for an invalid param transa.
  1074. * Must be trans or no-trans.
  1075. */
  1076. CTEST(sgemmt, xerbla_c_api_colmajor_transa_invalid)
  1077. {
  1078. blasint M = 50, K = 50;
  1079. blasint lda = 50, ldb = 50, ldc = 50;
  1080. int expected_info = 2;
  1081. int passed = check_badargs('C', CblasColMajor, CblasUpper, 'O', CblasNoTrans,
  1082. M, K, lda, ldb, ldc, expected_info);
  1083. ASSERT_EQUAL(TRUE, passed);
  1084. }
  1085. /**
  1086. * C API specific test. Column Major
  1087. * Test error function for an invalid param transb.
  1088. * Must be trans or no-trans.
  1089. */
  1090. CTEST(sgemmt, xerbla_c_api_colmajor_transb_invalid)
  1091. {
  1092. blasint M = 50, K = 50;
  1093. blasint lda = 50, ldb = 50, ldc = 50;
  1094. int expected_info = 3;
  1095. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, 'O',
  1096. M, K, lda, ldb, ldc, expected_info);
  1097. ASSERT_EQUAL(TRUE, passed);
  1098. }
  1099. /**
  1100. * C API specific test. Column Major
  1101. * Test error function for an invalid param M.
  1102. * Must be positive.
  1103. */
  1104. CTEST(sgemmt, xerbla_c_api_colmajor_m_invalid)
  1105. {
  1106. blasint M = -1, K = 50;
  1107. blasint lda = 50, ldb = 50, ldc = 50;
  1108. int expected_info = 4;
  1109. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1110. M, K, lda, ldb, ldc, expected_info);
  1111. ASSERT_EQUAL(TRUE, passed);
  1112. }
  1113. /**
  1114. * C API specific test. Column Major
  1115. * Test error function for an invalid param K.
  1116. * Must be positive.
  1117. */
  1118. CTEST(sgemmt, xerbla_c_api_colmajor_k_invalid)
  1119. {
  1120. blasint M = 50, K = -1;
  1121. blasint lda = 50, ldb = 50, ldc = 50;
  1122. int expected_info = 5;
  1123. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1124. M, K, lda, ldb, ldc, expected_info);
  1125. ASSERT_EQUAL(TRUE, passed);
  1126. }
  1127. /**
  1128. * C API specific test. Column Major
  1129. * Test error function for an invalid param lda.
  1130. * Must be must be at least K if matrix A transposed.
  1131. */
  1132. CTEST(sgemmt, xerbla_c_api_colmajor_lda_invalid)
  1133. {
  1134. blasint M = 50, K = 100;
  1135. blasint lda = 50, ldb = 100, ldc = 50;
  1136. int expected_info = 8;
  1137. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans,
  1138. M, K, lda, ldb, ldc, expected_info);
  1139. ASSERT_EQUAL(TRUE, passed);
  1140. }
  1141. /**
  1142. * C API specific test. Column Major
  1143. * Test error function for an invalid param ldb.
  1144. * Must be must be at least K if matrix B not transposed.
  1145. */
  1146. CTEST(sgemmt, xerbla_c_api_colmajor_ldb_invalid)
  1147. {
  1148. blasint M = 50, K = 100;
  1149. blasint lda = 50, ldb = 50, ldc = 50;
  1150. int expected_info = 10;
  1151. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1152. M, K, lda, ldb, ldc, expected_info);
  1153. ASSERT_EQUAL(TRUE, passed);
  1154. }
  1155. /**
  1156. * C API specific test. Column Major
  1157. * Test error function for an invalid param ldc.
  1158. * Must be must be at least M.
  1159. */
  1160. CTEST(sgemmt, xerbla_c_api_colmajor_ldc_invalid)
  1161. {
  1162. blasint M = 100, K = 50;
  1163. blasint lda = 50, ldb = 50, ldc = 50;
  1164. int expected_info = 13;
  1165. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans,
  1166. M, K, lda, ldb, ldc, expected_info);
  1167. ASSERT_EQUAL(TRUE, passed);
  1168. }
  1169. /**
  1170. * C API specific test. Row Major
  1171. * Test error function for an invalid param uplo.
  1172. * Must be upper or lower.
  1173. */
  1174. CTEST(sgemmt, xerbla_c_api_rowmajor_uplo_invalid)
  1175. {
  1176. blasint M = 50, K = 50;
  1177. blasint lda = 50, ldb = 50, ldc = 50;
  1178. int expected_info = 1;
  1179. int passed = check_badargs('C', CblasRowMajor, 'O', CblasNoTrans, CblasNoTrans,
  1180. M, K, lda, ldb, ldc, expected_info);
  1181. ASSERT_EQUAL(TRUE, passed);
  1182. }
  1183. /**
  1184. * C API specific test. Row Major
  1185. * Test error function for an invalid param transa.
  1186. * Must be trans or no-trans.
  1187. */
  1188. CTEST(sgemmt, xerbla_c_api_rowmajor_transa_invalid)
  1189. {
  1190. blasint M = 50, K = 50;
  1191. blasint lda = 50, ldb = 50, ldc = 50;
  1192. int expected_info = 2;
  1193. int passed = check_badargs('C', CblasRowMajor, CblasUpper, 'O', CblasNoTrans,
  1194. M, K, lda, ldb, ldc, expected_info);
  1195. ASSERT_EQUAL(TRUE, passed);
  1196. }
  1197. /**
  1198. * C API specific test. Row Major
  1199. * Test error function for an invalid param transb.
  1200. * Must be trans or no-trans.
  1201. */
  1202. CTEST(sgemmt, xerbla_c_api_rowmajor_transb_invalid)
  1203. {
  1204. blasint M = 50, K = 50;
  1205. blasint lda = 50, ldb = 50, ldc = 50;
  1206. int expected_info = 3;
  1207. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, 'O',
  1208. M, K, lda, ldb, ldc, expected_info);
  1209. ASSERT_EQUAL(TRUE, passed);
  1210. }
  1211. /**
  1212. * C API specific test. Row Major
  1213. * Test error function for an invalid param M.
  1214. * Must be positive.
  1215. */
  1216. CTEST(sgemmt, xerbla_c_api_rowmajor_m_invalid)
  1217. {
  1218. blasint M = -1, K = 50;
  1219. blasint lda = 50, ldb = 50, ldc = 50;
  1220. int expected_info = 4;
  1221. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1222. M, K, lda, ldb, ldc, expected_info);
  1223. ASSERT_EQUAL(TRUE, passed);
  1224. }
  1225. /**
  1226. * C API specific test. Row Major
  1227. * Test error function for an invalid param K.
  1228. * Must be positive.
  1229. */
  1230. CTEST(sgemmt, xerbla_c_api_rowmajor_k_invalid)
  1231. {
  1232. blasint M = 50, K = -1;
  1233. blasint lda = 50, ldb = 50, ldc = 50;
  1234. int expected_info = 5;
  1235. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1236. M, K, lda, ldb, ldc, expected_info);
  1237. ASSERT_EQUAL(TRUE, passed);
  1238. }
  1239. /**
  1240. * C API specific test. Row Major
  1241. * Test error function for an invalid param lda.
  1242. * Must be must be at least K if matrix A transposed.
  1243. */
  1244. CTEST(sgemmt, xerbla_c_api_rowmajor_lda_invalid)
  1245. {
  1246. blasint M = 50, K = 100;
  1247. blasint lda = 50, ldb = 50, ldc = 50;
  1248. int expected_info = 8;
  1249. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1250. M, K, lda, ldb, ldc, expected_info);
  1251. ASSERT_EQUAL(TRUE, passed);
  1252. }
  1253. /**
  1254. * C API specific test. Row Major
  1255. * Test error function for an invalid param ldb.
  1256. * Must be must be at least K if matrix B transposed.
  1257. */
  1258. CTEST(sgemmt, xerbla_c_api_rowmajor_ldb_invalid)
  1259. {
  1260. blasint M = 50, K = 100;
  1261. blasint lda = 50, ldb = 50, ldc = 50;
  1262. int expected_info = 10;
  1263. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasTrans, CblasTrans,
  1264. M, K, lda, ldb, ldc, expected_info);
  1265. ASSERT_EQUAL(TRUE, passed);
  1266. }
  1267. /**
  1268. * C API specific test. Row Major
  1269. * Test error function for an invalid param ldc.
  1270. * Must be must be at least M.
  1271. */
  1272. CTEST(sgemmt, xerbla_c_api_rowmajor_ldc_invalid)
  1273. {
  1274. blasint M = 100, K = 50;
  1275. blasint lda = 100, ldb = 100, ldc = 50;
  1276. int expected_info = 13;
  1277. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans,
  1278. M, K, lda, ldb, ldc, expected_info);
  1279. ASSERT_EQUAL(TRUE, passed);
  1280. }
  1281. #endif
  1282. #endif