You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_sgemmt.c 41 kB

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