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 59 kB

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