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_dgemmt.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_DGEMMT {
  32. double a_test[DATASIZE * DATASIZE];
  33. double b_test[DATASIZE * DATASIZE];
  34. double c_test[DATASIZE * DATASIZE];
  35. double c_verify[DATASIZE * DATASIZE];
  36. double c_gemm[DATASIZE * DATASIZE];
  37. };
  38. #ifdef BUILD_DOUBLE
  39. static struct DATA_DGEMMT data_dgemmt;
  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 dgemmt_trusted(char api, enum CBLAS_ORDER order, char uplo, char transa,
  58. char transb, blasint m, blasint k, double alpha, blasint lda,
  59. blasint ldb, double beta, blasint ldc)
  60. {
  61. blasint i, j;
  62. if(api == 'F')
  63. BLASFUNC(dgemm)(&transa, &transb, &m, &m, &k, &alpha, data_dgemmt.a_test, &lda,
  64. data_dgemmt.b_test, &ldb, &beta, data_dgemmt.c_gemm, &ldc);
  65. #ifndef NO_CBLAS
  66. else
  67. cblas_dgemm(order, transa, transb, m, m, k, alpha, data_dgemmt.a_test, lda,
  68. data_dgemmt.b_test, ldb, beta, data_dgemmt.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_dgemmt.c_verify[i * ldc + j] =
  75. data_dgemmt.c_gemm[i * ldc + j];
  76. } else {
  77. for (i = 0; i < m; i++)
  78. for (j = 0; j <= i; j++)
  79. data_dgemmt.c_verify[i * ldc + j] =
  80. data_dgemmt.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_dgemmt.c_verify[i * ldc + j] =
  89. data_dgemmt.c_gemm[i * ldc + j];
  90. } else {
  91. for (i = 0; i < m; i++)
  92. for (j = 0; j <= i; j++)
  93. data_dgemmt.c_verify[i * ldc + j] =
  94. data_dgemmt.c_gemm[i * ldc + j];
  95. }
  96. }
  97. /**
  98. * Comapare results computed by dgemmt and dgemmt_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 double check_dgemmt(char api, enum CBLAS_ORDER order, char uplo, char transa,
  115. char transb, blasint m, blasint k, double alpha, blasint lda,
  116. blasint ldb, double 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. drand_generate(data_dgemmt.a_test, a_cols * lda);
  143. drand_generate(data_dgemmt.b_test, b_cols * ldb);
  144. drand_generate(data_dgemmt.c_test, m * ldc);
  145. for (i = 0; i < m * ldc; i++)
  146. data_dgemmt.c_gemm[i] = data_dgemmt.c_verify[i] = data_dgemmt.c_test[i];
  147. dgemmt_trusted(api, order, uplo, transa, transb, m, k, alpha, lda, ldb, beta, ldc);
  148. if (api == 'F')
  149. BLASFUNC(dgemmt)(&uplo, &transa, &transb, &m, &k, &alpha, data_dgemmt.a_test,
  150. &lda, data_dgemmt.b_test, &ldb, &beta, data_dgemmt.c_test, &ldc);
  151. #ifndef NO_CBLAS
  152. else
  153. cblas_dgemmt(order, uplo, transa, transb, m, k, alpha, data_dgemmt.a_test, lda,
  154. data_dgemmt.b_test, ldb, beta, data_dgemmt.c_test, ldc);
  155. #endif
  156. for (i = 0; i < m * ldc; i++)
  157. data_dgemmt.c_verify[i] -= data_dgemmt.c_test[i];
  158. return BLASFUNC(dnrm2)(&size_c, data_dgemmt.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 dgemmt
  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. double alpha = 1.0;
  180. double beta = 0.0;
  181. set_xerbla("DGEMMT ", expected_info);
  182. if (api == 'F')
  183. BLASFUNC(dgemmt)(&uplo, &transa, &transb, &m, &k, &alpha, data_dgemmt.a_test,
  184. &lda, data_dgemmt.b_test, &ldb, &beta, data_dgemmt.c_test, &ldc);
  185. #ifndef NO_CBLAS
  186. else
  187. cblas_dgemmt(order, uplo, transa, transb, m, k, alpha, data_dgemmt.a_test, lda,
  188. data_dgemmt.b_test, ldb, beta, data_dgemmt.c_test, ldc);
  189. #endif
  190. return check_error();
  191. }
  192. /**
  193. * Fortran API specific test
  194. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  208. double beta = 2.0;
  209. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  210. M, K, alpha, lda, ldb, beta, ldc);
  211. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  212. }
  213. /**
  214. * Fortran API specific test
  215. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  229. double beta = 2.0;
  230. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  231. M, K, alpha, lda, ldb, beta, ldc);
  232. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  233. }
  234. /**
  235. * Fortran API specific test
  236. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  250. double beta = 0.0;
  251. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  252. M, K, alpha, lda, ldb, beta, ldc);
  253. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  254. }
  255. /**
  256. * Fortran API specific test
  257. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  271. double beta = 2.0;
  272. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  273. M, K, alpha, lda, ldb, beta, ldc);
  274. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  275. }
  276. /**
  277. * Fortran API specific test
  278. * Test dgemmt by comparing it against dgemm
  279. * with the following options:
  280. *
  281. * C’s data is stored in its upper triangle part
  282. * alpha = 0.0
  283. */
  284. CTEST(dgemmt, 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. double alpha = 0.0;
  291. double beta = 2.0;
  292. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  293. M, K, alpha, lda, ldb, beta, ldc);
  294. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  295. }
  296. /**
  297. * Fortran API specific test
  298. * Test dgemmt by comparing it against dgemm
  299. * with the following options:
  300. *
  301. * C’s data is stored in its upper triangle part
  302. * beta = 1.0
  303. */
  304. CTEST(dgemmt, 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. double alpha = 2.0;
  311. double beta = 1.0;
  312. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  313. M, K, alpha, lda, ldb, beta, ldc);
  314. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  315. }
  316. /**
  317. * Fortran API specific test
  318. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  332. double beta = 2.0;
  333. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  334. M, K, alpha, lda, ldb, beta, ldc);
  335. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  336. }
  337. /**
  338. * Fortran API specific test
  339. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  353. double beta = 2.0;
  354. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  355. M, K, alpha, lda, ldb, beta, ldc);
  356. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  357. }
  358. /**
  359. * Fortran API specific test
  360. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  374. double beta = 0.0;
  375. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  376. M, K, alpha, lda, ldb, beta, ldc);
  377. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  378. }
  379. /**
  380. * Fortran API specific test
  381. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  395. double beta = 2.0;
  396. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  397. M, K, alpha, lda, ldb, beta, ldc);
  398. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  399. }
  400. /**
  401. * Fortran API specific test
  402. * Test dgemmt by comparing it against dgemm
  403. * with the following options:
  404. *
  405. * C’s data is stored in its lower triangle part
  406. * alpha = 0.0
  407. */
  408. CTEST(dgemmt, 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. double alpha = 0.0;
  415. double beta = 2.0;
  416. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  417. M, K, alpha, lda, ldb, beta, ldc);
  418. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  419. }
  420. /**
  421. * Fortran API specific test
  422. * Test dgemmt by comparing it against dgemm
  423. * with the following options:
  424. *
  425. * C’s data is stored in its lower triangle part
  426. * beta = 1.0
  427. */
  428. CTEST(dgemmt, 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. double alpha = 2.0;
  435. double beta = 1.0;
  436. double norm = check_dgemmt('F', CblasColMajor, uplo, transa, transb,
  437. M, K, alpha, lda, ldb, beta, ldc);
  438. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  439. }
  440. #ifndef NO_CBLAS
  441. /**
  442. * C API specific test
  443. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  456. double beta = 2.0;
  457. double norm = check_dgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  458. M, K, alpha, lda, ldb, beta, ldc);
  459. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  460. }
  461. /**
  462. * C API specific test
  463. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  476. double beta = 2.0;
  477. double norm = check_dgemmt('C', CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans,
  478. M, K, alpha, lda, ldb, beta, ldc);
  479. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  480. }
  481. /**
  482. * C API specific test
  483. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  496. double beta = 0.0;
  497. double norm = check_dgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans,
  498. M, K, alpha, lda, ldb, beta, ldc);
  499. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  500. }
  501. /**
  502. * C API specific test
  503. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  516. double beta = 2.0;
  517. double norm = check_dgemmt('C', CblasColMajor, CblasUpper, CblasTrans, CblasTrans,
  518. M, K, alpha, lda, ldb, beta, ldc);
  519. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  520. }
  521. /**
  522. * C API specific test
  523. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_colmajor_upper_alpha_zero)
  531. {
  532. blasint M = 50, K = 50;
  533. blasint lda = 50, ldb = 50, ldc = 50;
  534. double alpha = 0.0;
  535. double beta = 2.0;
  536. double norm = check_dgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  537. M, K, alpha, lda, ldb, beta, ldc);
  538. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  539. }
  540. /**
  541. * C API specific test
  542. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_colmajor_upper_beta_one)
  550. {
  551. blasint M = 50, K = 50;
  552. blasint lda = 50, ldb = 50, ldc = 50;
  553. double alpha = 2.0;
  554. double beta = 1.0;
  555. double norm = check_dgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  556. M, K, alpha, lda, ldb, beta, ldc);
  557. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  558. }
  559. /**
  560. * C API specific test
  561. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  574. double beta = 2.0;
  575. double norm = check_dgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  576. M, K, alpha, lda, ldb, beta, ldc);
  577. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  578. }
  579. /**
  580. * C API specific test
  581. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  594. double beta = 2.0;
  595. double norm = check_dgemmt('C', CblasColMajor, CblasLower, CblasTrans, CblasNoTrans,
  596. M, K, alpha, lda, ldb, beta, ldc);
  597. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  598. }
  599. /**
  600. * C API specific test
  601. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  614. double beta = 0.0;
  615. double norm = check_dgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasTrans,
  616. M, K, alpha, lda, ldb, beta, ldc);
  617. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  618. }
  619. /**
  620. * C API specific test
  621. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  634. double beta = 2.0;
  635. double norm = check_dgemmt('C', CblasColMajor, CblasLower, CblasTrans, CblasTrans,
  636. M, K, alpha, lda, ldb, beta, ldc);
  637. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  638. }
  639. /**
  640. * C API specific test
  641. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_colmajor_lower_alpha_zero)
  649. {
  650. blasint M = 50, K = 50;
  651. blasint lda = 50, ldb = 50, ldc = 50;
  652. double alpha = 0.0;
  653. double beta = 2.0;
  654. double norm = check_dgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  655. M, K, alpha, lda, ldb, beta, ldc);
  656. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  657. }
  658. /**
  659. * C API specific test
  660. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_colmajor_lower_beta_one)
  668. {
  669. blasint M = 50, K = 50;
  670. blasint lda = 50, ldb = 50, ldc = 50;
  671. double alpha = 2.0;
  672. double beta = 1.0;
  673. double norm = check_dgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  674. M, K, alpha, lda, ldb, beta, ldc);
  675. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  676. }
  677. /**
  678. * C API specific test
  679. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  692. double beta = 2.0;
  693. double norm = check_dgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  694. M, K, alpha, lda, ldb, beta, ldc);
  695. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  696. }
  697. /**
  698. * C API specific test
  699. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  712. double beta = 2.0;
  713. double norm = check_dgemmt('C', CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans,
  714. M, K, alpha, lda, ldb, beta, ldc);
  715. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  716. }
  717. /**
  718. * C API specific test
  719. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  732. double beta = 0.0;
  733. double norm = check_dgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans,
  734. M, K, alpha, lda, ldb, beta, ldc);
  735. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  736. }
  737. /**
  738. * C API specific test
  739. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  752. double beta = 2.0;
  753. double norm = check_dgemmt('C', CblasRowMajor, CblasUpper, CblasTrans, CblasTrans,
  754. M, K, alpha, lda, ldb, beta, ldc);
  755. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  756. }
  757. /**
  758. * C API specific test
  759. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_rowmajor_upper_alpha_zero)
  767. {
  768. blasint M = 50, K = 50;
  769. blasint lda = 50, ldb = 50, ldc = 50;
  770. double alpha = 0.0;
  771. double beta = 2.0;
  772. double norm = check_dgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  773. M, K, alpha, lda, ldb, beta, ldc);
  774. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  775. }
  776. /**
  777. * C API specific test
  778. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_rowmajor_upper_beta_one)
  786. {
  787. blasint M = 50, K = 50;
  788. blasint lda = 50, ldb = 50, ldc = 50;
  789. double alpha = 2.0;
  790. double beta = 1.0;
  791. double norm = check_dgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  792. M, K, alpha, lda, ldb, beta, ldc);
  793. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  794. }
  795. /**
  796. * C API specific test
  797. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  810. double beta = 2.0;
  811. double norm = check_dgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  812. M, K, alpha, lda, ldb, beta, ldc);
  813. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  814. }
  815. /**
  816. * C API specific test
  817. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  830. double beta = 2.0;
  831. double norm = check_dgemmt('C', CblasRowMajor, CblasLower, CblasTrans, CblasNoTrans,
  832. M, K, alpha, lda, ldb, beta, ldc);
  833. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  834. }
  835. /**
  836. * C API specific test
  837. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.0;
  850. double beta = 0.0;
  851. double norm = check_dgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasTrans,
  852. M, K, alpha, lda, ldb, beta, ldc);
  853. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  854. }
  855. /**
  856. * C API specific test
  857. * Test dgemmt by comparing it against dgemm
  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(dgemmt, 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. double alpha = 1.5;
  870. double beta = 2.0;
  871. double norm = check_dgemmt('C', CblasRowMajor, CblasLower, CblasTrans, CblasTrans,
  872. M, K, alpha, lda, ldb, beta, ldc);
  873. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  874. }
  875. /**
  876. * C API specific test
  877. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_rowmajor_lower_alpha_zero)
  885. {
  886. blasint M = 50, K = 50;
  887. blasint lda = 50, ldb = 50, ldc = 50;
  888. double alpha = 0.0;
  889. double beta = 2.0;
  890. double norm = check_dgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  891. M, K, alpha, lda, ldb, beta, ldc);
  892. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  893. }
  894. /**
  895. * C API specific test
  896. * Test dgemmt by comparing it against dgemm
  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(dgemmt, c_api_rowmajor_lower_beta_one)
  904. {
  905. blasint M = 50, K = 50;
  906. blasint lda = 50, ldb = 50, ldc = 50;
  907. double alpha = 2.0;
  908. double beta = 1.0;
  909. double norm = check_dgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  910. M, K, alpha, lda, ldb, beta, ldc);
  911. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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(dgemmt, 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