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_zgemmt.c 58 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010
  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_ZGEMMT {
  32. double a_test[DATASIZE * DATASIZE * 2];
  33. double b_test[DATASIZE * DATASIZE * 2];
  34. double c_test[DATASIZE * DATASIZE * 2];
  35. double c_verify[DATASIZE * DATASIZE * 2];
  36. double c_gemm[DATASIZE * DATASIZE * 2];
  37. };
  38. #ifdef BUILD_COMPLEX16
  39. static struct DATA_ZGEMMT data_zgemmt;
  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 zgemmt_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(zgemm)(&transa, &transb, &m, &m, &k, alpha, data_zgemmt.a_test, &lda,
  64. data_zgemmt.b_test, &ldb, beta, data_zgemmt.c_gemm, &ldc);
  65. else
  66. cblas_zgemm(order, transa, transb, m, m, k, alpha, data_zgemmt.a_test, lda,
  67. data_zgemmt.b_test, ldb, beta, data_zgemmt.c_gemm, ldc);
  68. ldc *= 2;
  69. if (uplo == 'L' || uplo == CblasLower)
  70. {
  71. for (i = 0; i < m; i++)
  72. for (j = i * 2; j < m * 2; j+=2){
  73. data_zgemmt.c_verify[i * ldc + j] =
  74. data_zgemmt.c_gemm[i * ldc + j];
  75. data_zgemmt.c_verify[i * ldc + j + 1] =
  76. data_zgemmt.c_gemm[i * ldc + j + 1];
  77. }
  78. } else {
  79. for (i = 0; i < m; i++)
  80. for (j = 0; j <= i * 2; j+=2){
  81. data_zgemmt.c_verify[i * ldc + j] =
  82. data_zgemmt.c_gemm[i * ldc + j];
  83. data_zgemmt.c_verify[i * ldc + j + 1] =
  84. data_zgemmt.c_gemm[i * ldc + j + 1];
  85. }
  86. }
  87. }
  88. /**
  89. * Comapare results computed by zgemmt and zgemmt_trusted
  90. *
  91. * param api specifies tested api (C or Fortran)
  92. * param order specifies row or column major order (for Fortran API column major always)
  93. * param uplo specifies whether C’s data is stored in its upper or lower triangle
  94. * param transa specifies op(A), the transposition operation applied to A
  95. * param transb specifies op(B), the transposition operation applied to B
  96. * param m - number of rows of op(A), columns of op(B), and columns and rows of C
  97. * param k - number of columns of op(A) and rows of op(B)
  98. * param alpha - scaling factor for the matrix-matrix product
  99. * param lda - leading dimension of A
  100. * param ldb - leading dimension of B
  101. * param beta - scaling factor for matrix C
  102. * param ldc - leading dimension of C
  103. * return norm of differences
  104. */
  105. static double check_zgemmt(char api, enum CBLAS_ORDER order, char uplo, char transa,
  106. char transb, blasint m, blasint k, double *alpha, blasint lda,
  107. blasint ldb, double *beta, blasint ldc)
  108. {
  109. blasint i;
  110. blasint b_cols;
  111. blasint a_cols;
  112. blasint inc = 1;
  113. blasint size_c = m * ldc * 2;
  114. if(order == CblasColMajor){
  115. if (transa == 'T' || transa == 'C' ||
  116. transa == CblasTrans || transa == CblasConjTrans)
  117. a_cols = m;
  118. else a_cols = k;
  119. if (transb == 'T' || transb == 'C' ||
  120. transb == CblasTrans || transb == CblasConjTrans)
  121. b_cols = k;
  122. else b_cols = m;
  123. } else {
  124. if (transa == 'T' || transa == 'C' ||
  125. transa == CblasTrans || transa == CblasConjTrans)
  126. a_cols = k;
  127. else a_cols = m;
  128. if (transb == 'T' || transb == 'C' ||
  129. transb == CblasTrans || transb == CblasConjTrans)
  130. b_cols = m;
  131. else b_cols = k;
  132. }
  133. drand_generate(data_zgemmt.a_test, a_cols * lda * 2);
  134. drand_generate(data_zgemmt.b_test, b_cols * ldb * 2);
  135. drand_generate(data_zgemmt.c_test, m * ldc * 2);
  136. for (i = 0; i < m * ldc * 2; i++)
  137. data_zgemmt.c_gemm[i] = data_zgemmt.c_verify[i] = data_zgemmt.c_test[i];
  138. zgemmt_trusted(api, order, uplo, transa, transb, m, k, alpha, lda, ldb, beta, ldc);
  139. if (api == 'F')
  140. BLASFUNC(zgemmt)(&uplo, &transa, &transb, &m, &k, alpha, data_zgemmt.a_test,
  141. &lda, data_zgemmt.b_test, &ldb, beta, data_zgemmt.c_test, &ldc);
  142. else
  143. cblas_zgemmt(order, uplo, transa, transb, m, k, alpha, data_zgemmt.a_test, lda,
  144. data_zgemmt.b_test, ldb, beta, data_zgemmt.c_test, ldc);
  145. for (i = 0; i < m * ldc * 2; i++)
  146. data_zgemmt.c_verify[i] -= data_zgemmt.c_test[i];
  147. return BLASFUNC(dnrm2)(&size_c, data_zgemmt.c_verify, &inc) / size_c;
  148. }
  149. /**
  150. * Check if error function was called with expected function name
  151. * and param info
  152. *
  153. * param uplo specifies whether C’s data is stored in its upper or lower triangle
  154. * param transa specifies op(A), the transposition operation applied to A
  155. * param transb specifies op(B), the transposition operation applied to B
  156. * param m - number of rows of op(A), columns of op(B), and columns and rows of C
  157. * param k - number of columns of op(A) and rows of op(B)
  158. * param lda - leading dimension of A
  159. * param ldb - leading dimension of B
  160. * param ldc - leading dimension of C
  161. * param expected_info - expected invalid parameter number in zgemmt
  162. * return TRUE if everything is ok, otherwise FALSE
  163. */
  164. static int check_badargs(char api, enum CBLAS_ORDER order, char uplo, char transa,
  165. char transb, blasint m, blasint k, blasint lda, blasint ldb,
  166. blasint ldc, int expected_info)
  167. {
  168. double alpha[] = {1.0, 1.0};
  169. double beta[] = {0.0, 0.0};
  170. set_xerbla("ZGEMMT ", expected_info);
  171. if (api == 'F')
  172. BLASFUNC(zgemmt)(&uplo, &transa, &transb, &m, &k, alpha, data_zgemmt.a_test,
  173. &lda, data_zgemmt.b_test, &ldb, beta, data_zgemmt.c_test, &ldc);
  174. else
  175. cblas_zgemmt(order, uplo, transa, transb, m, k, alpha, data_zgemmt.a_test, lda,
  176. data_zgemmt.b_test, ldb, beta, data_zgemmt.c_test, ldc);
  177. return check_error();
  178. }
  179. /**
  180. * Fortran API specific test
  181. * Test zgemmt by comparing it against sgemm
  182. * with the following options:
  183. *
  184. * C’s data is stored in its upper triangle part
  185. * A not transposed
  186. * B not transposed
  187. */
  188. CTEST(zgemmt, upper_M_50_K_50_a_notrans_b_notrans)
  189. {
  190. blasint M = 50, K = 50;
  191. blasint lda = 50, ldb = 50, ldc = 50;
  192. char transa = 'N', transb = 'N';
  193. char uplo = 'U';
  194. double alpha[] = {1.5, 0.5};
  195. double beta[] = {2.0, 1.0};
  196. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  197. M, K, alpha, lda, ldb, beta, ldc);
  198. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  199. }
  200. /**
  201. * Fortran API specific test
  202. * Test zgemmt by comparing it against sgemm
  203. * with the following options:
  204. *
  205. * C’s data is stored in its upper triangle part
  206. * A transposed
  207. * B not transposed
  208. */
  209. CTEST(zgemmt, upper_M_50_K_25_a_trans_b_notrans)
  210. {
  211. blasint M = 50, K = 25;
  212. blasint lda = 25, ldb = 25, ldc = 50;
  213. char transa = 'T', transb = 'N';
  214. char uplo = 'U';
  215. double alpha[] = {1.0, 1.0};
  216. double beta[] = {2.0, 1.0};
  217. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  218. M, K, alpha, lda, ldb, beta, ldc);
  219. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  220. }
  221. /**
  222. * Fortran API specific test
  223. * Test zgemmt by comparing it against sgemm
  224. * with the following options:
  225. *
  226. * C’s data is stored in its upper triangle part
  227. * A not transposed
  228. * B transposed
  229. */
  230. CTEST(zgemmt, upper_M_25_K_50_a_notrans_b_trans)
  231. {
  232. blasint M = 25, K = 50;
  233. blasint lda = 25, ldb = 25, ldc = 25;
  234. char transa = 'N', transb = 'T';
  235. char uplo = 'U';
  236. double alpha[] = {1.0, 1.0};
  237. double beta[] = {0.0, 0.0};
  238. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  239. M, K, alpha, lda, ldb, beta, ldc);
  240. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  241. }
  242. /**
  243. * Fortran API specific test
  244. * Test zgemmt by comparing it against sgemm
  245. * with the following options:
  246. *
  247. * C’s data is stored in its upper triangle part
  248. * A transposed
  249. * B transposed
  250. */
  251. CTEST(zgemmt, upper_M_50_K_50_a_trans_b_trans)
  252. {
  253. blasint M = 50, K = 50;
  254. blasint lda = 50, ldb = 50, ldc = 50;
  255. char transa = 'T', transb = 'T';
  256. char uplo = 'U';
  257. double alpha[] = {1.5, 0.5};
  258. double beta[] = {2.0, 1.0};
  259. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  260. M, K, alpha, lda, ldb, beta, ldc);
  261. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  262. }
  263. /**
  264. * Fortran API specific test
  265. * Test zgemmt by comparing it against sgemm
  266. * with the following options:
  267. *
  268. * C’s data is stored in its upper triangle part
  269. * A conjugate not transposed
  270. * B conjugate not transposed
  271. */
  272. CTEST(zgemmt, upper_M_25_K_50_a_conjnotrans_b_conjnotrans)
  273. {
  274. blasint M = 25, K = 50;
  275. blasint lda = 25, ldb = 50, ldc = 25;
  276. char transa = 'R', transb = 'R';
  277. char uplo = 'U';
  278. double alpha[] = {2.0, 1.0};
  279. double beta[] = {1.5, 2.0};
  280. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  281. M, K, alpha, lda, ldb, beta, ldc);
  282. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  283. }
  284. /**
  285. * Fortran API specific test
  286. * Test zgemmt by comparing it against sgemm
  287. * with the following options:
  288. *
  289. * C’s data is stored in its upper triangle part
  290. * A conjugate transposed
  291. * B conjugate not transposed
  292. */
  293. CTEST(zgemmt, upper_M_50_K_50_a_conjtrans_b_conjnotrans)
  294. {
  295. blasint M = 50, K = 50;
  296. blasint lda = 50, ldb = 50, ldc = 50;
  297. char transa = 'C', transb = 'R';
  298. char uplo = 'U';
  299. double alpha[] = {1.0, 1.0};
  300. double beta[] = {1.0, 1.0};
  301. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  302. M, K, alpha, lda, ldb, beta, ldc);
  303. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  304. }
  305. /**
  306. * Fortran API specific test
  307. * Test zgemmt by comparing it against sgemm
  308. * with the following options:
  309. *
  310. * C’s data is stored in its upper triangle part
  311. * A conjugate not transposed
  312. * B conjugate transposed
  313. */
  314. CTEST(zgemmt, upper_M_50_K_50_a_conjnotrans_b_conjtrans)
  315. {
  316. blasint M = 50, K = 50;
  317. blasint lda = 50, ldb = 50, ldc = 50;
  318. char transa = 'R', transb = 'C';
  319. char uplo = 'U';
  320. double alpha[] = {2.0, 1.0};
  321. double beta[] = {1.5, 2.0};
  322. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  323. M, K, alpha, lda, ldb, beta, ldc);
  324. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  325. }
  326. /**
  327. * Fortran API specific test
  328. * Test zgemmt by comparing it against sgemm
  329. * with the following options:
  330. *
  331. * C’s data is stored in its upper triangle part
  332. * A conjugate transposed
  333. * B conjugate transposed
  334. */
  335. CTEST(zgemmt, upper_M_50_K_25_a_conjtrans_b_conjtrans)
  336. {
  337. blasint M = 50, K = 25;
  338. blasint lda = 50, ldb = 50, ldc = 50;
  339. char transa = 'C', transb = 'C';
  340. char uplo = 'U';
  341. double alpha[] = {2.0, 1.0};
  342. double beta[] = {1.5, 2.0};
  343. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  344. M, K, alpha, lda, ldb, beta, ldc);
  345. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  346. }
  347. /**
  348. * Fortran API specific test
  349. * Test zgemmt by comparing it against sgemm
  350. * with the following options:
  351. *
  352. * C’s data is stored in its upper triangle part
  353. * alpha_r = 0.0, alpha_i = 0.0
  354. */
  355. CTEST(zgemmt, upper_alpha_zero)
  356. {
  357. blasint M = 50, K = 50;
  358. blasint lda = 50, ldb = 50, ldc = 50;
  359. char transa = 'N', transb = 'N';
  360. char uplo = 'U';
  361. double alpha[] = {0.0, 0.0};
  362. double beta[] = {2.0, 1.0};
  363. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  364. M, K, alpha, lda, ldb, beta, ldc);
  365. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  366. }
  367. /**
  368. * Fortran API specific test
  369. * Test zgemmt by comparing it against sgemm
  370. * with the following options:
  371. *
  372. * C’s data is stored in its upper triangle part
  373. * beta_r = 1.0, beta_i = 0.0
  374. */
  375. CTEST(zgemmt, upper_beta_one)
  376. {
  377. blasint M = 50, K = 50;
  378. blasint lda = 50, ldb = 50, ldc = 50;
  379. char transa = 'N', transb = 'N';
  380. char uplo = 'U';
  381. double alpha[] = {1.0, 1.0};
  382. double beta[] = {1.0, 0.0};
  383. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  384. M, K, alpha, lda, ldb, beta, ldc);
  385. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  386. }
  387. /**
  388. * Fortran API specific test
  389. * Test zgemmt by comparing it against sgemm
  390. * with the following options:
  391. *
  392. * C’s data is stored in its lower triangle part
  393. * A not transposed
  394. * B not transposed
  395. */
  396. CTEST(zgemmt, lower_M_50_K_50_a_notrans_b_notrans)
  397. {
  398. blasint M = 50, K = 50;
  399. blasint lda = 50, ldb = 50, ldc = 50;
  400. char transa = 'N', transb = 'N';
  401. char uplo = 'L';
  402. double alpha[] = {1.5, 0.5};
  403. double beta[] = {2.0, 1.0};
  404. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  405. M, K, alpha, lda, ldb, beta, ldc);
  406. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  407. }
  408. /**
  409. * Fortran API specific test
  410. * Test zgemmt by comparing it against sgemm
  411. * with the following options:
  412. *
  413. * C’s data is stored in its lower triangle part
  414. * A transposed
  415. * B not transposed
  416. */
  417. CTEST(zgemmt, lower_M_50_K_25_a_trans_b_notrans)
  418. {
  419. blasint M = 50, K = 25;
  420. blasint lda = 25, ldb = 25, ldc = 50;
  421. char transa = 'T', transb = 'N';
  422. char uplo = 'L';
  423. double alpha[] = {1.0, 1.0};
  424. double beta[] = {2.0, 1.0};
  425. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  426. M, K, alpha, lda, ldb, beta, ldc);
  427. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  428. }
  429. /**
  430. * Fortran API specific test
  431. * Test zgemmt by comparing it against sgemm
  432. * with the following options:
  433. *
  434. * C’s data is stored in its lower triangle part
  435. * A not transposed
  436. * B transposed
  437. */
  438. CTEST(zgemmt, lower_M_25_K_50_a_notrans_b_trans)
  439. {
  440. blasint M = 25, K = 50;
  441. blasint lda = 25, ldb = 25, ldc = 25;
  442. char transa = 'N', transb = 'T';
  443. char uplo = 'L';
  444. double alpha[] = {1.0, 1.0};
  445. double beta[] = {0.0, 0.0};
  446. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  447. M, K, alpha, lda, ldb, beta, ldc);
  448. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  449. }
  450. /**
  451. * Fortran API specific test
  452. * Test zgemmt by comparing it against sgemm
  453. * with the following options:
  454. *
  455. * C’s data is stored in its lower triangle part
  456. * A transposed
  457. * B transposed
  458. */
  459. CTEST(zgemmt, lower_M_50_K_50_a_trans_b_trans)
  460. {
  461. blasint M = 50, K = 50;
  462. blasint lda = 50, ldb = 50, ldc = 50;
  463. char transa = 'T', transb = 'T';
  464. char uplo = 'L';
  465. double alpha[] = {1.5, 0.5};
  466. double beta[] = {2.0, 1.0};
  467. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  468. M, K, alpha, lda, ldb, beta, ldc);
  469. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  470. }
  471. /**
  472. * Fortran API specific test
  473. * Test zgemmt by comparing it against sgemm
  474. * with the following options:
  475. *
  476. * C’s data is stored in its lower triangle part
  477. * A conjugate not transposed
  478. * B conjugate not transposed
  479. */
  480. CTEST(zgemmt, lower_M_25_K_50_a_conjnotrans_b_conjnotrans)
  481. {
  482. blasint M = 25, K = 50;
  483. blasint lda = 25, ldb = 50, ldc = 25;
  484. char transa = 'R', transb = 'R';
  485. char uplo = 'L';
  486. double alpha[] = {2.0, 1.0};
  487. double beta[] = {1.5, 2.0};
  488. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  489. M, K, alpha, lda, ldb, beta, ldc);
  490. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  491. }
  492. /**
  493. * Fortran API specific test
  494. * Test zgemmt by comparing it against sgemm
  495. * with the following options:
  496. *
  497. * C’s data is stored in its lower triangle part
  498. * A conjugate transposed
  499. * B conjugate not transposed
  500. */
  501. CTEST(zgemmt, lower_M_50_K_50_a_conjtrans_b_conjnotrans)
  502. {
  503. blasint M = 50, K = 50;
  504. blasint lda = 50, ldb = 50, ldc = 50;
  505. char transa = 'C', transb = 'R';
  506. char uplo = 'L';
  507. double alpha[] = {1.0, 1.0};
  508. double beta[] = {1.0, 1.0};
  509. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  510. M, K, alpha, lda, ldb, beta, ldc);
  511. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  512. }
  513. /**
  514. * Fortran API specific test
  515. * Test zgemmt by comparing it against sgemm
  516. * with the following options:
  517. *
  518. * C’s data is stored in its lower triangle part
  519. * A conjugate not transposed
  520. * B conjugate transposed
  521. */
  522. CTEST(zgemmt, lower_M_50_K_50_a_conjnotrans_b_conjtrans)
  523. {
  524. blasint M = 50, K = 50;
  525. blasint lda = 50, ldb = 50, ldc = 50;
  526. char transa = 'R', transb = 'C';
  527. char uplo = 'L';
  528. double alpha[] = {2.0, 1.0};
  529. double beta[] = {1.5, 2.0};
  530. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  531. M, K, alpha, lda, ldb, beta, ldc);
  532. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  533. }
  534. /**
  535. * Fortran API specific test
  536. * Test zgemmt by comparing it against sgemm
  537. * with the following options:
  538. *
  539. * C’s data is stored in its lower triangle part
  540. * A conjugate transposed
  541. * B conjugate transposed
  542. */
  543. CTEST(zgemmt, lower_M_50_K_25_a_conjtrans_b_conjtrans)
  544. {
  545. blasint M = 50, K = 25;
  546. blasint lda = 50, ldb = 50, ldc = 50;
  547. char transa = 'C', transb = 'C';
  548. char uplo = 'L';
  549. double alpha[] = {2.0, 1.0};
  550. double beta[] = {1.5, 2.0};
  551. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  552. M, K, alpha, lda, ldb, beta, ldc);
  553. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  554. }
  555. /**
  556. * Fortran API specific test
  557. * Test zgemmt by comparing it against sgemm
  558. * with the following options:
  559. *
  560. * C’s data is stored in its lower triangle part
  561. * alpha_r = 0.0, alpha_i = 0.0
  562. */
  563. CTEST(zgemmt, lower_alpha_zero)
  564. {
  565. blasint M = 50, K = 50;
  566. blasint lda = 50, ldb = 50, ldc = 50;
  567. char transa = 'N', transb = 'N';
  568. char uplo = 'L';
  569. double alpha[] = {0.0, 0.0};
  570. double beta[] = {2.0, 1.0};
  571. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  572. M, K, alpha, lda, ldb, beta, ldc);
  573. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  574. }
  575. /**
  576. * Fortran API specific test
  577. * Test zgemmt by comparing it against sgemm
  578. * with the following options:
  579. *
  580. * C’s data is stored in its lower triangle part
  581. * beta_r = 1.0, beta_i = 0.0
  582. */
  583. CTEST(zgemmt, lower_beta_one)
  584. {
  585. blasint M = 50, K = 50;
  586. blasint lda = 50, ldb = 50, ldc = 50;
  587. char transa = 'N', transb = 'N';
  588. char uplo = 'L';
  589. double alpha[] = {1.0, 1.0};
  590. double beta[] = {1.0, 0.0};
  591. double norm = check_zgemmt('F', CblasColMajor, uplo, transa, transb,
  592. M, K, alpha, lda, ldb, beta, ldc);
  593. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  594. }
  595. /**
  596. * C API specific test
  597. * Test zgemmt by comparing it against sgemm
  598. * with the following options:
  599. *
  600. * Column Major
  601. * C’s data is stored in its upper triangle part
  602. * A not transposed
  603. * B not transposed
  604. */
  605. CTEST(zgemmt, c_api_colmajor_upper_M_50_K_50_a_notrans_b_notrans)
  606. {
  607. blasint M = 50, K = 50;
  608. blasint lda = 50, ldb = 50, ldc = 50;
  609. double alpha[] = {1.5, 0.5};
  610. double beta[] = {2.0, 1.0};
  611. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  612. M, K, alpha, lda, ldb, beta, ldc);
  613. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  614. }
  615. /**
  616. * C API specific test
  617. * Test zgemmt by comparing it against sgemm
  618. * with the following options:
  619. *
  620. * Column Major
  621. * C’s data is stored in its upper triangle part
  622. * A transposed
  623. * B not transposed
  624. */
  625. CTEST(zgemmt, c_api_colmajor_upper_M_50_K_25_a_trans_b_notrans)
  626. {
  627. blasint M = 50, K = 25;
  628. blasint lda = 25, ldb = 25, ldc = 50;
  629. double alpha[] = {1.0, 1.0};
  630. double beta[] = {2.0, 1.0};
  631. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans,
  632. M, K, alpha, lda, ldb, beta, ldc);
  633. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  634. }
  635. /**
  636. * C API specific test
  637. * Test zgemmt by comparing it against sgemm
  638. * with the following options:
  639. *
  640. * Column Major
  641. * C’s data is stored in its upper triangle part
  642. * A not transposed
  643. * B transposed
  644. */
  645. CTEST(zgemmt, c_api_colmajor_upper_M_25_K_50_a_notrans_b_trans)
  646. {
  647. blasint M = 25, K = 50;
  648. blasint lda = 25, ldb = 25, ldc = 25;
  649. double alpha[] = {1.0, 1.0};
  650. double beta[] = {0.0, 0.0};
  651. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasTrans,
  652. M, K, alpha, lda, ldb, beta, ldc);
  653. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  654. }
  655. /**
  656. * C API specific test
  657. * Test zgemmt by comparing it against sgemm
  658. * with the following options:
  659. *
  660. * Column Major
  661. * C’s data is stored in its upper triangle part
  662. * A transposed
  663. * B transposed
  664. */
  665. CTEST(zgemmt, c_api_colmajor_upper_M_50_K_50_a_trans_b_trans)
  666. {
  667. blasint M = 50, K = 50;
  668. blasint lda = 50, ldb = 50, ldc = 50;
  669. double alpha[] = {1.5, 0.5};
  670. double beta[] = {2.0, 1.0};
  671. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasTrans, CblasTrans,
  672. M, K, alpha, lda, ldb, beta, ldc);
  673. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  674. }
  675. /**
  676. * C API specific test
  677. * Test zgemmt by comparing it against sgemm
  678. * with the following options:
  679. *
  680. * Column Major
  681. * C’s data is stored in its upper triangle part
  682. * A conjugate not transposed
  683. * B conjugate not transposed
  684. */
  685. CTEST(zgemmt, c_api_colmajor_upper_M_25_K_50_a_conjnotrans_b_conjnotrans)
  686. {
  687. blasint M = 25, K = 50;
  688. blasint lda = 25, ldb = 50, ldc = 25;
  689. double alpha[] = {2.0, 1.0};
  690. double beta[] = {1.5, 2.0};
  691. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasConjNoTrans, CblasConjNoTrans,
  692. M, K, alpha, lda, ldb, beta, ldc);
  693. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  694. }
  695. /**
  696. * C API specific test
  697. * Test zgemmt by comparing it against sgemm
  698. * with the following options:
  699. *
  700. * Column Major
  701. * C’s data is stored in its upper triangle part
  702. * A conjugate transposed
  703. * B conjugate not transposed
  704. */
  705. CTEST(zgemmt, c_api_colmajor_upper_M_50_K_50_a_conjtrans_b_conjnotrans)
  706. {
  707. blasint M = 50, K = 50;
  708. blasint lda = 50, ldb = 50, ldc = 50;
  709. double alpha[] = {1.0, 1.0};
  710. double beta[] = {1.0, 1.0};
  711. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasConjTrans, CblasConjNoTrans,
  712. M, K, alpha, lda, ldb, beta, ldc);
  713. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  714. }
  715. /**
  716. * C API specific test
  717. * Test zgemmt by comparing it against sgemm
  718. * with the following options:
  719. *
  720. * Column Major
  721. * C’s data is stored in its upper triangle part
  722. * A conjugate not transposed
  723. * B conjugate transposed
  724. */
  725. CTEST(zgemmt, c_api_colmajor_upper_M_50_K_50_a_conjnotrans_b_conjtrans)
  726. {
  727. blasint M = 50, K = 50;
  728. blasint lda = 50, ldb = 50, ldc = 50;
  729. double alpha[] = {2.0, 1.0};
  730. double beta[] = {1.5, 2.0};
  731. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasConjNoTrans, CblasConjTrans,
  732. M, K, alpha, lda, ldb, beta, ldc);
  733. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  734. }
  735. /**
  736. * C API specific test
  737. * Test zgemmt by comparing it against sgemm
  738. * with the following options:
  739. *
  740. * Column Major
  741. * C’s data is stored in its upper triangle part
  742. * A conjugate transposed
  743. * B conjugate transposed
  744. */
  745. CTEST(zgemmt, c_api_colmajor_upper_M_50_K_25_a_conjtrans_b_conjtrans)
  746. {
  747. blasint M = 50, K = 25;
  748. blasint lda = 50, ldb = 50, ldc = 50;
  749. double alpha[] = {2.0, 1.0};
  750. double beta[] = {1.5, 2.0};
  751. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasConjTrans, CblasConjTrans,
  752. M, K, alpha, lda, ldb, beta, ldc);
  753. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  754. }
  755. /**
  756. * C API specific test
  757. * Test zgemmt by comparing it against sgemm
  758. * with the following options:
  759. *
  760. * Column Major
  761. * C’s data is stored in its upper triangle part
  762. * alpha_r = 0.0, alpha_i = 0.0
  763. */
  764. CTEST(zgemmt, c_api_colmajor_upper_alpha_zero)
  765. {
  766. blasint M = 50, K = 50;
  767. blasint lda = 50, ldb = 50, ldc = 50;
  768. double alpha[] = {0.0, 0.0};
  769. double beta[] = {2.0, 1.0};
  770. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  771. M, K, alpha, lda, ldb, beta, ldc);
  772. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  773. }
  774. /**
  775. * C API specific test
  776. * Test zgemmt by comparing it against sgemm
  777. * with the following options:
  778. *
  779. * Column Major
  780. * C’s data is stored in its upper triangle part
  781. * beta_r = 1.0, beta_i = 0.0
  782. */
  783. CTEST(zgemmt, c_api_colmajor_upper_beta_one)
  784. {
  785. blasint M = 50, K = 50;
  786. blasint lda = 50, ldb = 50, ldc = 50;
  787. double alpha[] = {1.0, 1.0};
  788. double beta[] = {1.0, 0.0};
  789. double norm = check_zgemmt('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  790. M, K, alpha, lda, ldb, beta, ldc);
  791. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  792. }
  793. /**
  794. * C API specific test
  795. * Test zgemmt by comparing it against sgemm
  796. * with the following options:
  797. *
  798. * Column Major
  799. * C’s data is stored in its lower triangle part
  800. * A not transposed
  801. * B not transposed
  802. */
  803. CTEST(zgemmt, c_api_colmajor_lower_M_50_K_50_a_notrans_b_notrans)
  804. {
  805. blasint M = 50, K = 50;
  806. blasint lda = 50, ldb = 50, ldc = 50;
  807. double alpha[] = {1.5, 0.5};
  808. double beta[] = {2.0, 1.0};
  809. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  810. M, K, alpha, lda, ldb, beta, ldc);
  811. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  812. }
  813. /**
  814. * C API specific test
  815. * Test zgemmt by comparing it against sgemm
  816. * with the following options:
  817. *
  818. * Column Major
  819. * C’s data is stored in its lower triangle part
  820. * A transposed
  821. * B not transposed
  822. */
  823. CTEST(zgemmt, c_api_colmajor_lower_M_50_K_25_a_trans_b_notrans)
  824. {
  825. blasint M = 50, K = 25;
  826. blasint lda = 25, ldb = 25, ldc = 50;
  827. double alpha[] = {1.0, 1.0};
  828. double beta[] = {2.0, 1.0};
  829. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasTrans, CblasNoTrans,
  830. M, K, alpha, lda, ldb, beta, ldc);
  831. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  832. }
  833. /**
  834. * C API specific test
  835. * Test zgemmt by comparing it against sgemm
  836. * with the following options:
  837. *
  838. * Column Major
  839. * C’s data is stored in its lower triangle part
  840. * A not transposed
  841. * B transposed
  842. */
  843. CTEST(zgemmt, c_api_colmajor_lower_M_25_K_50_a_notrans_b_trans)
  844. {
  845. blasint M = 25, K = 50;
  846. blasint lda = 25, ldb = 25, ldc = 25;
  847. double alpha[] = {1.0, 1.0};
  848. double beta[] = {0.0, 0.0};
  849. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasTrans,
  850. M, K, alpha, lda, ldb, beta, ldc);
  851. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  852. }
  853. /**
  854. * C API specific test
  855. * Test zgemmt by comparing it against sgemm
  856. * with the following options:
  857. *
  858. * Column Major
  859. * C’s data is stored in its lower triangle part
  860. * A transposed
  861. * B transposed
  862. */
  863. CTEST(zgemmt, c_api_colmajor_lower_M_50_K_50_a_trans_b_trans)
  864. {
  865. blasint M = 50, K = 50;
  866. blasint lda = 50, ldb = 50, ldc = 50;
  867. double alpha[] = {1.5, 0.5};
  868. double beta[] = {2.0, 1.0};
  869. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasTrans, CblasTrans,
  870. M, K, alpha, lda, ldb, beta, ldc);
  871. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  872. }
  873. /**
  874. * C API specific test
  875. * Test zgemmt by comparing it against sgemm
  876. * with the following options:
  877. *
  878. * Column Major
  879. * C’s data is stored in its lower triangle part
  880. * A conjugate not transposed
  881. * B conjugate not transposed
  882. */
  883. CTEST(zgemmt, c_api_colmajor_lower_M_25_K_50_a_conjnotrans_b_conjnotrans)
  884. {
  885. blasint M = 25, K = 50;
  886. blasint lda = 25, ldb = 50, ldc = 25;
  887. double alpha[] = {2.0, 1.0};
  888. double beta[] = {1.5, 2.0};
  889. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasConjNoTrans, CblasConjNoTrans,
  890. M, K, alpha, lda, ldb, beta, ldc);
  891. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  892. }
  893. /**
  894. * C API specific test
  895. * Test zgemmt by comparing it against sgemm
  896. * with the following options:
  897. *
  898. * Column Major
  899. * C’s data is stored in its lower triangle part
  900. * A conjugate transposed
  901. * B conjugate not transposed
  902. */
  903. CTEST(zgemmt, c_api_colmajor_lower_M_50_K_50_a_conjtrans_b_conjnotrans)
  904. {
  905. blasint M = 50, K = 50;
  906. blasint lda = 50, ldb = 50, ldc = 50;
  907. double alpha[] = {2.0, 1.0};
  908. double beta[] = {1.5, 2.0};
  909. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasConjTrans, CblasConjNoTrans,
  910. M, K, alpha, lda, ldb, beta, ldc);
  911. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  912. }
  913. /**
  914. * C API specific test
  915. * Test zgemmt by comparing it against sgemm
  916. * with the following options:
  917. *
  918. * Column Major
  919. * C’s data is stored in its lower triangle part
  920. * A conjugate not transposed
  921. * B conjugate transposed
  922. */
  923. CTEST(zgemmt, c_api_colmajor_lower_M_50_K_50_a_conjnotrans_b_conjtrans)
  924. {
  925. blasint M = 50, K = 50;
  926. blasint lda = 50, ldb = 50, ldc = 50;
  927. double alpha[] = {2.0, 1.0};
  928. double beta[] = {1.5, 2.0};
  929. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasConjNoTrans, CblasConjTrans,
  930. M, K, alpha, lda, ldb, beta, ldc);
  931. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  932. }
  933. /**
  934. * C API specific test
  935. * Test zgemmt by comparing it against sgemm
  936. * with the following options:
  937. *
  938. * Column Major
  939. * C’s data is stored in its lower triangle part
  940. * A conjugate transposed
  941. * B conjugate transposed
  942. */
  943. CTEST(zgemmt, c_api_colmajor_lower_M_50_K_25_a_conjtrans_b_conjtrans)
  944. {
  945. blasint M = 50, K = 25;
  946. blasint lda = 50, ldb = 50, ldc = 50;
  947. double alpha[] = {2.0, 1.0};
  948. double beta[] = {1.5, 2.0};
  949. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasConjTrans, CblasConjTrans,
  950. M, K, alpha, lda, ldb, beta, ldc);
  951. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  952. }
  953. /**
  954. * C API specific test
  955. * Test zgemmt by comparing it against sgemm
  956. * with the following options:
  957. *
  958. * Column Major
  959. * C’s data is stored in its lower triangle part
  960. * alpha_r = 0.0, alpha_i = 0.0
  961. */
  962. CTEST(zgemmt, c_api_colmajor_lower_alpha_zero)
  963. {
  964. blasint M = 50, K = 50;
  965. blasint lda = 50, ldb = 50, ldc = 50;
  966. double alpha[] = {0.0, 0.0};
  967. double beta[] = {2.0, 1.0};
  968. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  969. M, K, alpha, lda, ldb, beta, ldc);
  970. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  971. }
  972. /**
  973. * C API specific test
  974. * Test zgemmt by comparing it against sgemm
  975. * with the following options:
  976. *
  977. * Column Major
  978. * C’s data is stored in its lower triangle part
  979. * beta_r = 1.0, beta_i = 0.0
  980. */
  981. CTEST(zgemmt, c_api_colmajor_lower_beta_one)
  982. {
  983. blasint M = 50, K = 50;
  984. blasint lda = 50, ldb = 50, ldc = 50;
  985. double alpha[] = {1.0, 1.0};
  986. double beta[] = {1.0, 0.0};
  987. double norm = check_zgemmt('C', CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  988. M, K, alpha, lda, ldb, beta, ldc);
  989. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  990. }
  991. /**
  992. * C API specific test
  993. * Test zgemmt by comparing it against sgemm
  994. * with the following options:
  995. *
  996. * Row Major
  997. * C’s data is stored in its upper triangle part
  998. * A not transposed
  999. * B not transposed
  1000. */
  1001. CTEST(zgemmt, c_api_rowmajor_upper_M_50_K_50_a_notrans_b_notrans)
  1002. {
  1003. blasint M = 50, K = 50;
  1004. blasint lda = 50, ldb = 50, ldc = 50;
  1005. double alpha[] = {1.5, 0.5};
  1006. double beta[] = {2.0, 1.0};
  1007. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1008. M, K, alpha, lda, ldb, beta, ldc);
  1009. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1010. }
  1011. /**
  1012. * C API specific test
  1013. * Test zgemmt by comparing it against sgemm
  1014. * with the following options:
  1015. *
  1016. * Row Major
  1017. * C’s data is stored in its upper triangle part
  1018. * A transposed
  1019. * B not transposed
  1020. */
  1021. CTEST(zgemmt, c_api_rowmajor_upper_M_50_K_25_a_trans_b_notrans)
  1022. {
  1023. blasint M = 50, K = 25;
  1024. blasint lda = 50, ldb = 50, ldc = 50;
  1025. double alpha[] = {1.0, 1.0};
  1026. double beta[] = {2.0, 1.0};
  1027. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans,
  1028. M, K, alpha, lda, ldb, beta, ldc);
  1029. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1030. }
  1031. /**
  1032. * C API specific test
  1033. * Test zgemmt by comparing it against sgemm
  1034. * with the following options:
  1035. *
  1036. * Row Major
  1037. * C’s data is stored in its upper triangle part
  1038. * A not transposed
  1039. * B transposed
  1040. */
  1041. CTEST(zgemmt, c_api_rowmajor_upper_M_25_K_50_a_notrans_b_trans)
  1042. {
  1043. blasint M = 25, K = 50;
  1044. blasint lda = 50, ldb = 50, ldc = 25;
  1045. double alpha[] = {1.0, 1.0};
  1046. double beta[] = {-1.0, -1.0};
  1047. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasTrans,
  1048. M, K, alpha, lda, ldb, beta, ldc);
  1049. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1050. }
  1051. /**
  1052. * C API specific test
  1053. * Test zgemmt by comparing it against sgemm
  1054. * with the following options:
  1055. *
  1056. * Row Major
  1057. * C’s data is stored in its upper triangle part
  1058. * A transposed
  1059. * B transposed
  1060. */
  1061. CTEST(zgemmt, c_api_rowmajor_upper_M_50_K_50_a_trans_b_trans)
  1062. {
  1063. blasint M = 50, K = 50;
  1064. blasint lda = 50, ldb = 50, ldc = 50;
  1065. double alpha[] = {1.5, 0.5};
  1066. double beta[] = {2.0, 1.0};
  1067. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasTrans, CblasTrans,
  1068. M, K, alpha, lda, ldb, beta, ldc);
  1069. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1070. }
  1071. /**
  1072. * C API specific test
  1073. * Test zgemmt by comparing it against sgemm
  1074. * with the following options:
  1075. *
  1076. * Row Major
  1077. * C’s data is stored in its upper triangle part
  1078. * A conjugate not transposed
  1079. * B conjugate not transposed
  1080. */
  1081. CTEST(zgemmt, c_api_rowmajor_upper_M_25_K_50_a_conjnotrans_b_conjnotrans)
  1082. {
  1083. blasint M = 25, K = 50;
  1084. blasint lda = 50, ldb = 25, ldc = 25;
  1085. double alpha[] = {2.0, 1.0};
  1086. double beta[] = {1.5, 2.0};
  1087. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasConjNoTrans, CblasConjNoTrans,
  1088. M, K, alpha, lda, ldb, beta, ldc);
  1089. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1090. }
  1091. /**
  1092. * C API specific test
  1093. * Test zgemmt by comparing it against sgemm
  1094. * with the following options:
  1095. *
  1096. * Row Major
  1097. * C’s data is stored in its upper triangle part
  1098. * A conjugate transposed
  1099. * B conjugate not transposed
  1100. */
  1101. CTEST(zgemmt, c_api_rowmajor_upper_M_50_K_50_a_conjtrans_b_conjnotrans)
  1102. {
  1103. blasint M = 50, K = 50;
  1104. blasint lda = 50, ldb = 50, ldc = 50;
  1105. double alpha[] = {2.0, 1.0};
  1106. double beta[] = {1.5, 2.0};
  1107. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasConjTrans, CblasConjNoTrans,
  1108. M, K, alpha, lda, ldb, beta, ldc);
  1109. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1110. }
  1111. /**
  1112. * C API specific test
  1113. * Test zgemmt by comparing it against sgemm
  1114. * with the following options:
  1115. *
  1116. * Row Major
  1117. * C’s data is stored in its upper triangle part
  1118. * A conjugate not transposed
  1119. * B conjugate transposed
  1120. */
  1121. CTEST(zgemmt, c_api_rowmajor_upper_M_50_K_50_a_conjnotrans_b_conjtrans)
  1122. {
  1123. blasint M = 50, K = 50;
  1124. blasint lda = 50, ldb = 50, ldc = 50;
  1125. double alpha[] = {2.0, 1.0};
  1126. double beta[] = {1.5, 2.0};
  1127. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasConjNoTrans, CblasConjTrans,
  1128. M, K, alpha, lda, ldb, beta, ldc);
  1129. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1130. }
  1131. /**
  1132. * C API specific test
  1133. * Test zgemmt by comparing it against sgemm
  1134. * with the following options:
  1135. *
  1136. * Row Major
  1137. * C’s data is stored in its upper triangle part
  1138. * A conjugate transposed
  1139. * B conjugate transposed
  1140. */
  1141. CTEST(zgemmt, c_api_rowmajor_upper_M_25_K_50_a_conjtrans_b_conjtrans)
  1142. {
  1143. blasint M = 25, K = 50;
  1144. blasint lda = 25, ldb = 50, ldc = 25;
  1145. double alpha[] = {2.0, 1.0};
  1146. double beta[] = {1.5, 2.0};
  1147. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasConjTrans, CblasConjTrans,
  1148. M, K, alpha, lda, ldb, beta, ldc);
  1149. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1150. }
  1151. /**
  1152. * C API specific test
  1153. * Test zgemmt by comparing it against sgemm
  1154. * with the following options:
  1155. *
  1156. * Row Major
  1157. * C’s data is stored in its upper triangle part
  1158. * alpha_r = 0.0, alpha_i = 0.0
  1159. */
  1160. CTEST(zgemmt, c_api_rowmajor_upper_alpha_zero)
  1161. {
  1162. blasint M = 50, K = 50;
  1163. blasint lda = 50, ldb = 50, ldc = 50;
  1164. double alpha[] = {0.0, 0.0};
  1165. double beta[] = {2.0, 1.0};
  1166. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1167. M, K, alpha, lda, ldb, beta, ldc);
  1168. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1169. }
  1170. /**
  1171. * C API specific test
  1172. * Test zgemmt by comparing it against sgemm
  1173. * with the following options:
  1174. *
  1175. * Row Major
  1176. * C’s data is stored in its upper triangle part
  1177. * beta_r = 1.0, beta_i = 0.0
  1178. */
  1179. CTEST(zgemmt, c_api_rowmajor_upper_beta_one)
  1180. {
  1181. blasint M = 50, K = 50;
  1182. blasint lda = 50, ldb = 50, ldc = 50;
  1183. double alpha[] = {1.0, 1.0};
  1184. double beta[] = {1.0, 0.0};
  1185. double norm = check_zgemmt('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1186. M, K, alpha, lda, ldb, beta, ldc);
  1187. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1188. }
  1189. /**
  1190. * C API specific test
  1191. * Test zgemmt by comparing it against sgemm
  1192. * with the following options:
  1193. *
  1194. * Row Major
  1195. * C’s data is stored in its lower triangle part
  1196. * A not transposed
  1197. * B not transposed
  1198. */
  1199. CTEST(zgemmt, c_api_rowmajor_lower_M_50_K_50_a_notrans_b_notrans)
  1200. {
  1201. blasint M = 50, K = 50;
  1202. blasint lda = 50, ldb = 50, ldc = 50;
  1203. double alpha[] = {1.5, 0.5};
  1204. double beta[] = {2.0, 1.0};
  1205. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  1206. M, K, alpha, lda, ldb, beta, ldc);
  1207. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1208. }
  1209. /**
  1210. * C API specific test
  1211. * Test zgemmt by comparing it against sgemm
  1212. * with the following options:
  1213. *
  1214. * Row Major
  1215. * C’s data is stored in its lower triangle part
  1216. * A transposed
  1217. * B not transposed
  1218. */
  1219. CTEST(zgemmt, c_api_rowmajor_lower_M_50_K_25_a_trans_b_notrans)
  1220. {
  1221. blasint M = 50, K = 25;
  1222. blasint lda = 50, ldb = 50, ldc = 50;
  1223. double alpha[] = {1.0, 1.0};
  1224. double beta[] = {2.0, 1.0};
  1225. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasTrans, CblasNoTrans,
  1226. M, K, alpha, lda, ldb, beta, ldc);
  1227. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1228. }
  1229. /**
  1230. * C API specific test
  1231. * Test zgemmt by comparing it against sgemm
  1232. * with the following options:
  1233. *
  1234. * Row Major
  1235. * C’s data is stored in its lower triangle part
  1236. * A not transposed
  1237. * B transposed
  1238. */
  1239. CTEST(zgemmt, c_api_rowmajor_lower_M_25_K_50_a_notrans_b_trans)
  1240. {
  1241. blasint M = 25, K = 50;
  1242. blasint lda = 50, ldb = 50, ldc = 25;
  1243. double alpha[] = {1.0, 1.0};
  1244. double beta[] = {0.0, 0.0};
  1245. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasTrans,
  1246. M, K, alpha, lda, ldb, beta, ldc);
  1247. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1248. }
  1249. /**
  1250. * C API specific test
  1251. * Test zgemmt by comparing it against sgemm
  1252. * with the following options:
  1253. *
  1254. * Row Major
  1255. * C’s data is stored in its lower triangle part
  1256. * A transposed
  1257. * B transposed
  1258. */
  1259. CTEST(zgemmt, c_api_rowmajor_lower_M_50_K_50_a_trans_b_trans)
  1260. {
  1261. blasint M = 50, K = 50;
  1262. blasint lda = 50, ldb = 50, ldc = 50;
  1263. double alpha[] = {1.5, 0.5};
  1264. double beta[] = {2.0, 1.0};
  1265. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasTrans, CblasTrans,
  1266. M, K, alpha, lda, ldb, beta, ldc);
  1267. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1268. }
  1269. /**
  1270. * C API specific test
  1271. * Test zgemmt by comparing it against sgemm
  1272. * with the following options:
  1273. *
  1274. * Row Major
  1275. * C’s data is stored in its lower triangle part
  1276. * A conjugate not transposed
  1277. * B conjugate not transposed
  1278. */
  1279. CTEST(zgemmt, c_api_rowmajor_lower_M_25_K_50_a_conjnotrans_b_conjnotrans)
  1280. {
  1281. blasint M = 25, K = 50;
  1282. blasint lda = 50, ldb = 25, ldc = 25;
  1283. double alpha[] = {2.0, 1.0};
  1284. double beta[] = {1.5, 2.0};
  1285. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasConjNoTrans, CblasConjNoTrans,
  1286. M, K, alpha, lda, ldb, beta, ldc);
  1287. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1288. }
  1289. /**
  1290. * C API specific test
  1291. * Test zgemmt by comparing it against sgemm
  1292. * with the following options:
  1293. *
  1294. * Row Major
  1295. * C’s data is stored in its lower triangle part
  1296. * A conjugate transposed
  1297. * B conjugate not transposed
  1298. */
  1299. CTEST(zgemmt, c_api_rowmajor_lower_M_50_K_50_a_conjtrans_b_conjnotrans)
  1300. {
  1301. blasint M = 50, K = 50;
  1302. blasint lda = 50, ldb = 50, ldc = 50;
  1303. double alpha[] = {2.0, 1.0};
  1304. double beta[] = {1.5, 2.0};
  1305. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasConjTrans, CblasConjNoTrans,
  1306. M, K, alpha, lda, ldb, beta, ldc);
  1307. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1308. }
  1309. /**
  1310. * C API specific test
  1311. * Test zgemmt by comparing it against sgemm
  1312. * with the following options:
  1313. *
  1314. * Row Major
  1315. * C’s data is stored in its lower triangle part
  1316. * A conjugate not transposed
  1317. * B conjugate transposed
  1318. */
  1319. CTEST(zgemmt, c_api_rowmajor_lower_M_50_K_50_a_conjnotrans_b_conjtrans)
  1320. {
  1321. blasint M = 50, K = 50;
  1322. blasint lda = 50, ldb = 50, ldc = 50;
  1323. double alpha[] = {2.0, 1.0};
  1324. double beta[] = {1.5, 2.0};
  1325. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasConjNoTrans, CblasConjTrans,
  1326. M, K, alpha, lda, ldb, beta, ldc);
  1327. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1328. }
  1329. /**
  1330. * C API specific test
  1331. * Test zgemmt by comparing it against sgemm
  1332. * with the following options:
  1333. *
  1334. * Row Major
  1335. * C’s data is stored in its lower triangle part
  1336. * A conjugate transposed
  1337. * B conjugate transposed
  1338. */
  1339. CTEST(zgemmt, c_api_rowmajor_lower_M_50_K_25_a_conjtrans_b_conjtrans)
  1340. {
  1341. blasint M = 50, K = 25;
  1342. blasint lda = 50, ldb = 25, ldc = 50;
  1343. double alpha[] = {2.0, 1.0};
  1344. double beta[] = {1.5, 2.0};
  1345. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasConjTrans, CblasConjTrans,
  1346. M, K, alpha, lda, ldb, beta, ldc);
  1347. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1348. }
  1349. /**
  1350. * C API specific test
  1351. * Test zgemmt by comparing it against sgemm
  1352. * with the following options:
  1353. *
  1354. * Row Major
  1355. * C’s data is stored in its lower triangle part
  1356. * alpha_r = 0.0, alpha_i = 0.0
  1357. */
  1358. CTEST(zgemmt, c_api_rowmajor_lower_alpha_zero)
  1359. {
  1360. blasint M = 50, K = 50;
  1361. blasint lda = 50, ldb = 50, ldc = 50;
  1362. double alpha[] = {0.0, 0.0};
  1363. double beta[] = {2.0, 1.0};
  1364. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  1365. M, K, alpha, lda, ldb, beta, ldc);
  1366. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1367. }
  1368. /**
  1369. * C API specific test
  1370. * Test zgemmt by comparing it against sgemm
  1371. * with the following options:
  1372. *
  1373. * Row Major
  1374. * C’s data is stored in its lower triangle part
  1375. * beta_r = 1.0, beta_i = 0.0
  1376. */
  1377. CTEST(zgemmt, c_api_rowmajor_lower_beta_one)
  1378. {
  1379. blasint M = 50, K = 50;
  1380. blasint lda = 50, ldb = 50, ldc = 50;
  1381. double alpha[] = {1.0, 1.0};
  1382. double beta[] = {1.0, 0.0};
  1383. double norm = check_zgemmt('C', CblasRowMajor, CblasLower, CblasNoTrans, CblasNoTrans,
  1384. M, K, alpha, lda, ldb, beta, ldc);
  1385. ASSERT_DBL_NEAR_TOL(0.0, norm, DOUBLE_EPS);
  1386. }
  1387. /**
  1388. * Fortran API specific test
  1389. * Test error function for an invalid param uplo.
  1390. * Must be upper (U) or lower (L).
  1391. */
  1392. CTEST(zgemmt, xerbla_uplo_invalid)
  1393. {
  1394. blasint M = 50, K = 50;
  1395. blasint lda = 50, ldb = 50, ldc = 50;
  1396. char transa = 'N', transb = 'N';
  1397. char uplo = 'O';
  1398. int expected_info = 1;
  1399. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1400. M, K, lda, ldb, ldc, expected_info);
  1401. ASSERT_EQUAL(TRUE, passed);
  1402. }
  1403. /**
  1404. * Fortran API specific test
  1405. * Test error function for an invalid param transa.
  1406. * Must be trans (T/C) or no-trans (N/R).
  1407. */
  1408. CTEST(zgemmt, xerbla_transa_invalid)
  1409. {
  1410. blasint M = 50, K = 50;
  1411. blasint lda = 50, ldb = 50, ldc = 50;
  1412. char transa = 'O', transb = 'N';
  1413. char uplo = 'U';
  1414. int expected_info = 2;
  1415. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1416. M, K, lda, ldb, ldc, expected_info);
  1417. ASSERT_EQUAL(TRUE, passed);
  1418. }
  1419. /**
  1420. * Fortran API specific test
  1421. * Test error function for an invalid param transb.
  1422. * Must be trans (T/C) or no-trans (N/R).
  1423. */
  1424. CTEST(zgemmt, xerbla_transb_invalid)
  1425. {
  1426. blasint M = 50, K = 50;
  1427. blasint lda = 50, ldb = 50, ldc = 50;
  1428. char transa = 'N', transb = 'O';
  1429. char uplo = 'U';
  1430. int expected_info = 3;
  1431. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1432. M, K, lda, ldb, ldc, expected_info);
  1433. ASSERT_EQUAL(TRUE, passed);
  1434. }
  1435. /**
  1436. * Fortran API specific test
  1437. * Test error function for an invalid param M.
  1438. * Must be positive.
  1439. */
  1440. CTEST(zgemmt, xerbla_m_invalid)
  1441. {
  1442. blasint M = -1, K = 50;
  1443. blasint lda = 50, ldb = 50, ldc = 50;
  1444. char transa = 'N', transb = 'N';
  1445. char uplo = 'U';
  1446. int expected_info = 4;
  1447. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1448. M, K, lda, ldb, ldc, expected_info);
  1449. ASSERT_EQUAL(TRUE, passed);
  1450. }
  1451. /**
  1452. * Fortran API specific test
  1453. * Test error function for an invalid param K.
  1454. * Must be positive.
  1455. */
  1456. CTEST(zgemmt, xerbla_k_invalid)
  1457. {
  1458. blasint M = 50, K = -1;
  1459. blasint lda = 50, ldb = 50, ldc = 50;
  1460. char transa = 'N', transb = 'N';
  1461. char uplo = 'U';
  1462. int expected_info = 5;
  1463. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1464. M, K, lda, ldb, ldc, expected_info);
  1465. ASSERT_EQUAL(TRUE, passed);
  1466. }
  1467. /**
  1468. * Fortran API specific test
  1469. * Test error function for an invalid param lda.
  1470. * Must be must be at least K if matrix A transposed.
  1471. */
  1472. CTEST(zgemmt, xerbla_lda_invalid)
  1473. {
  1474. blasint M = 50, K = 100;
  1475. blasint lda = 50, ldb = 100, ldc = 50;
  1476. char transa = 'T', transb = 'N';
  1477. char uplo = 'U';
  1478. int expected_info = 8;
  1479. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1480. M, K, lda, ldb, ldc, expected_info);
  1481. ASSERT_EQUAL(TRUE, passed);
  1482. }
  1483. /**
  1484. * Fortran API specific test
  1485. * Test error function for an invalid param ldb.
  1486. * Must be must be at least K if matrix B not transposed.
  1487. */
  1488. CTEST(zgemmt, xerbla_ldb_invalid)
  1489. {
  1490. blasint M = 50, K = 100;
  1491. blasint lda = 50, ldb = 50, ldc = 50;
  1492. char transa = 'N', transb = 'N';
  1493. char uplo = 'U';
  1494. int expected_info = 10;
  1495. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1496. M, K, lda, ldb, ldc, expected_info);
  1497. ASSERT_EQUAL(TRUE, passed);
  1498. }
  1499. /**
  1500. * Fortran API specific test
  1501. * Test error function for an invalid param ldc.
  1502. * Must be must be at least M.
  1503. */
  1504. CTEST(zgemmt, xerbla_ldc_invalid)
  1505. {
  1506. blasint M = 100, K = 50;
  1507. blasint lda = 50, ldb = 50, ldc = 50;
  1508. char transa = 'T', transb = 'N';
  1509. char uplo = 'U';
  1510. int expected_info = 13;
  1511. int passed = check_badargs('F', CblasColMajor, uplo, transa, transb,
  1512. M, K, lda, ldb, ldc, expected_info);
  1513. ASSERT_EQUAL(TRUE, passed);
  1514. }
  1515. /**
  1516. * C API specific test.
  1517. * Test error function for an invalid param order.
  1518. * Must be column or row major.
  1519. */
  1520. CTEST(zgemmt, xerbla_c_api_major_invalid)
  1521. {
  1522. blasint M = 50, K = 50;
  1523. blasint lda = 50, ldb = 50, ldc = 50;
  1524. int expected_info = 0;
  1525. int passed = check_badargs('C', 'O', CblasUpper, CblasNoTrans, CblasNoTrans,
  1526. M, K, lda, ldb, ldc, expected_info);
  1527. ASSERT_EQUAL(TRUE, passed);
  1528. }
  1529. /**
  1530. * C API specific test. Column Major
  1531. * Test error function for an invalid param uplo.
  1532. * Must be upper or lower.
  1533. */
  1534. CTEST(zgemmt, xerbla_c_api_colmajor_uplo_invalid)
  1535. {
  1536. blasint M = 50, K = 50;
  1537. blasint lda = 50, ldb = 50, ldc = 50;
  1538. int expected_info = 1;
  1539. int passed = check_badargs('C', CblasColMajor, 'O', CblasNoTrans, CblasNoTrans,
  1540. M, K, lda, ldb, ldc, expected_info);
  1541. ASSERT_EQUAL(TRUE, passed);
  1542. }
  1543. /**
  1544. * C API specific test. Column Major
  1545. * Test error function for an invalid param transa.
  1546. * Must be trans or no-trans.
  1547. */
  1548. CTEST(zgemmt, xerbla_c_api_colmajor_transa_invalid)
  1549. {
  1550. blasint M = 50, K = 50;
  1551. blasint lda = 50, ldb = 50, ldc = 50;
  1552. int expected_info = 2;
  1553. int passed = check_badargs('C', CblasColMajor, CblasUpper, 'O', CblasNoTrans,
  1554. M, K, lda, ldb, ldc, expected_info);
  1555. ASSERT_EQUAL(TRUE, passed);
  1556. }
  1557. /**
  1558. * C API specific test. Column Major
  1559. * Test error function for an invalid param transb.
  1560. * Must be trans or no-trans.
  1561. */
  1562. CTEST(zgemmt, xerbla_c_api_colmajor_transb_invalid)
  1563. {
  1564. blasint M = 50, K = 50;
  1565. blasint lda = 50, ldb = 50, ldc = 50;
  1566. int expected_info = 3;
  1567. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, 'O',
  1568. M, K, lda, ldb, ldc, expected_info);
  1569. ASSERT_EQUAL(TRUE, passed);
  1570. }
  1571. /**
  1572. * C API specific test. Column Major
  1573. * Test error function for an invalid param M.
  1574. * Must be positive.
  1575. */
  1576. CTEST(zgemmt, xerbla_c_api_colmajor_m_invalid)
  1577. {
  1578. blasint M = -1, K = 50;
  1579. blasint lda = 50, ldb = 50, ldc = 50;
  1580. int expected_info = 4;
  1581. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1582. M, K, lda, ldb, ldc, expected_info);
  1583. ASSERT_EQUAL(TRUE, passed);
  1584. }
  1585. /**
  1586. * C API specific test. Column Major
  1587. * Test error function for an invalid param K.
  1588. * Must be positive.
  1589. */
  1590. CTEST(zgemmt, xerbla_c_api_colmajor_k_invalid)
  1591. {
  1592. blasint M = 50, K = -1;
  1593. blasint lda = 50, ldb = 50, ldc = 50;
  1594. int expected_info = 5;
  1595. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1596. M, K, lda, ldb, ldc, expected_info);
  1597. ASSERT_EQUAL(TRUE, passed);
  1598. }
  1599. /**
  1600. * C API specific test. Column Major
  1601. * Test error function for an invalid param lda.
  1602. * Must be must be at least K if matrix A transposed.
  1603. */
  1604. CTEST(zgemmt, xerbla_c_api_colmajor_lda_invalid)
  1605. {
  1606. blasint M = 50, K = 100;
  1607. blasint lda = 50, ldb = 100, ldc = 50;
  1608. int expected_info = 8;
  1609. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans,
  1610. M, K, lda, ldb, ldc, expected_info);
  1611. ASSERT_EQUAL(TRUE, passed);
  1612. }
  1613. /**
  1614. * C API specific test. Column Major
  1615. * Test error function for an invalid param ldb.
  1616. * Must be must be at least K if matrix B not transposed.
  1617. */
  1618. CTEST(zgemmt, xerbla_c_api_colmajor_ldb_invalid)
  1619. {
  1620. blasint M = 50, K = 100;
  1621. blasint lda = 50, ldb = 50, ldc = 50;
  1622. int expected_info = 10;
  1623. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1624. M, K, lda, ldb, ldc, expected_info);
  1625. ASSERT_EQUAL(TRUE, passed);
  1626. }
  1627. /**
  1628. * C API specific test. Column Major
  1629. * Test error function for an invalid param ldc.
  1630. * Must be must be at least M.
  1631. */
  1632. CTEST(zgemmt, xerbla_c_api_colmajor_ldc_invalid)
  1633. {
  1634. blasint M = 100, K = 50;
  1635. blasint lda = 50, ldb = 50, ldc = 50;
  1636. int expected_info = 13;
  1637. int passed = check_badargs('C', CblasColMajor, CblasUpper, CblasTrans, CblasNoTrans,
  1638. M, K, lda, ldb, ldc, expected_info);
  1639. ASSERT_EQUAL(TRUE, passed);
  1640. }
  1641. /**
  1642. * C API specific test. Row Major
  1643. * Test error function for an invalid param uplo.
  1644. * Must be upper or lower.
  1645. */
  1646. CTEST(zgemmt, xerbla_c_api_rowmajor_uplo_invalid)
  1647. {
  1648. blasint M = 50, K = 50;
  1649. blasint lda = 50, ldb = 50, ldc = 50;
  1650. int expected_info = 1;
  1651. int passed = check_badargs('C', CblasRowMajor, 'O', CblasNoTrans, CblasNoTrans,
  1652. M, K, lda, ldb, ldc, expected_info);
  1653. ASSERT_EQUAL(TRUE, passed);
  1654. }
  1655. /**
  1656. * C API specific test. Row Major
  1657. * Test error function for an invalid param transa.
  1658. * Must be trans or no-trans.
  1659. */
  1660. CTEST(zgemmt, xerbla_c_api_rowmajor_transa_invalid)
  1661. {
  1662. blasint M = 50, K = 50;
  1663. blasint lda = 50, ldb = 50, ldc = 50;
  1664. int expected_info = 2;
  1665. int passed = check_badargs('C', CblasRowMajor, CblasUpper, 'O', CblasNoTrans,
  1666. M, K, lda, ldb, ldc, expected_info);
  1667. ASSERT_EQUAL(TRUE, passed);
  1668. }
  1669. /**
  1670. * C API specific test. Row Major
  1671. * Test error function for an invalid param transb.
  1672. * Must be trans or no-trans.
  1673. */
  1674. CTEST(zgemmt, xerbla_c_api_rowmajor_transb_invalid)
  1675. {
  1676. blasint M = 50, K = 50;
  1677. blasint lda = 50, ldb = 50, ldc = 50;
  1678. int expected_info = 3;
  1679. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, 'O',
  1680. M, K, lda, ldb, ldc, expected_info);
  1681. ASSERT_EQUAL(TRUE, passed);
  1682. }
  1683. /**
  1684. * C API specific test. Row Major
  1685. * Test error function for an invalid param M.
  1686. * Must be positive.
  1687. */
  1688. CTEST(zgemmt, xerbla_c_api_rowmajor_m_invalid)
  1689. {
  1690. blasint M = -1, K = 50;
  1691. blasint lda = 50, ldb = 50, ldc = 50;
  1692. int expected_info = 4;
  1693. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1694. M, K, lda, ldb, ldc, expected_info);
  1695. ASSERT_EQUAL(TRUE, passed);
  1696. }
  1697. /**
  1698. * C API specific test. Row Major
  1699. * Test error function for an invalid param K.
  1700. * Must be positive.
  1701. */
  1702. CTEST(zgemmt, xerbla_c_api_rowmajor_k_invalid)
  1703. {
  1704. blasint M = 50, K = -1;
  1705. blasint lda = 50, ldb = 50, ldc = 50;
  1706. int expected_info = 5;
  1707. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1708. M, K, lda, ldb, ldc, expected_info);
  1709. ASSERT_EQUAL(TRUE, passed);
  1710. }
  1711. /**
  1712. * C API specific test. Row Major
  1713. * Test error function for an invalid param lda.
  1714. * Must be must be at least K if matrix A transposed.
  1715. */
  1716. CTEST(zgemmt, xerbla_c_api_rowmajor_lda_invalid)
  1717. {
  1718. blasint M = 50, K = 100;
  1719. blasint lda = 50, ldb = 50, ldc = 50;
  1720. int expected_info = 8;
  1721. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasNoTrans, CblasNoTrans,
  1722. M, K, lda, ldb, ldc, expected_info);
  1723. ASSERT_EQUAL(TRUE, passed);
  1724. }
  1725. /**
  1726. * C API specific test. Row Major
  1727. * Test error function for an invalid param ldb.
  1728. * Must be must be at least K if matrix B transposed.
  1729. */
  1730. CTEST(zgemmt, xerbla_c_api_rowmajor_ldb_invalid)
  1731. {
  1732. blasint M = 50, K = 100;
  1733. blasint lda = 50, ldb = 50, ldc = 50;
  1734. int expected_info = 10;
  1735. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasTrans, CblasTrans,
  1736. M, K, lda, ldb, ldc, expected_info);
  1737. ASSERT_EQUAL(TRUE, passed);
  1738. }
  1739. /**
  1740. * C API specific test. Row Major
  1741. * Test error function for an invalid param ldc.
  1742. * Must be must be at least M.
  1743. */
  1744. CTEST(zgemmt, xerbla_c_api_rowmajor_ldc_invalid)
  1745. {
  1746. blasint M = 100, K = 50;
  1747. blasint lda = 100, ldb = 100, ldc = 50;
  1748. int expected_info = 13;
  1749. int passed = check_badargs('C', CblasRowMajor, CblasUpper, CblasTrans, CblasNoTrans,
  1750. M, K, lda, ldb, ldc, expected_info);
  1751. ASSERT_EQUAL(TRUE, passed);
  1752. }
  1753. #endif