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_gemv.c 14 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. #include "openblas_utest.h"
  2. #include <cblas.h>
  3. #ifndef NAN
  4. #define NAN 0.0/0.0
  5. #endif
  6. #ifndef INFINITY
  7. #define INFINITY 1.0/0.0
  8. #endif
  9. #ifdef BUILD_SINGLE
  10. CTEST(sgemv, 0_nan_inf)
  11. {
  12. int i;
  13. blasint N = 17;
  14. blasint incX = 1;
  15. blasint incY = 1;
  16. float alpha = 0.0;
  17. float beta = 0.0;
  18. char trans = 'N';
  19. float A[17 * 17];
  20. float X[17];
  21. float Y[17];
  22. memset(A, 0, sizeof(A));
  23. memset(X, 0, sizeof(X));
  24. for (i = 0; i < (N - 1); i += 2)
  25. {
  26. Y[i] = NAN;
  27. Y[i + 1] = INFINITY;
  28. }
  29. Y[N - 1] = NAN;
  30. BLASFUNC(sgemv)(&trans, &N, &N, &alpha, A, &N, X, &incX, &beta, Y, &incY);
  31. for (i = 0; i < N; i ++)
  32. ASSERT_TRUE(Y[i] == 0.0);
  33. }
  34. CTEST(sgemv, 0_nan_inf_incy_2)
  35. {
  36. int i;
  37. blasint N = 17;
  38. blasint Ny = 33;
  39. blasint incX = 1;
  40. blasint incY = 2;
  41. float alpha = 0.0;
  42. float beta = 0.0;
  43. char trans = 'N';
  44. float A[17 * 17];
  45. float X[17];
  46. float Y[33];
  47. float *ay = Y;
  48. memset(A, 0, sizeof(A));
  49. memset(X, 0, sizeof(X));
  50. memset(Y, 0, sizeof(Y));
  51. for (i = 0; i < (N - 1); i += 2)
  52. {
  53. ay[0] = NAN;
  54. ay += 2;
  55. ay[0] = INFINITY;
  56. ay += 2;
  57. }
  58. Y[Ny - 1] = NAN;
  59. BLASFUNC(sgemv)(&trans, &N, &N, &alpha, A, &N, X, &incX, &beta, Y, &incY);
  60. for (i = 0; i < Ny; i ++)
  61. ASSERT_TRUE(Y[i] == 0.0);
  62. }
  63. #endif
  64. #ifdef BUILD_DOUBLE
  65. CTEST(dgemv, 0_nan_inf)
  66. {
  67. int i;
  68. blasint N = 17;
  69. blasint incX = 1;
  70. blasint incY = 1;
  71. double alpha = 0.0;
  72. double beta = 0.0;
  73. char trans = 'N';
  74. double A[17 * 17];
  75. double X[17];
  76. double Y[17];
  77. memset(A, 0, sizeof(A));
  78. memset(X, 0, sizeof(X));
  79. for (i = 0; i < (N - 1); i += 2)
  80. {
  81. Y[i] = NAN;
  82. Y[i + 1] = INFINITY;
  83. }
  84. Y[N - 1] = NAN;
  85. BLASFUNC(dgemv)(&trans, &N, &N, &alpha, A, &N, X, &incX, &beta, Y, &incY);
  86. for (i = 0; i < N; i ++)
  87. ASSERT_TRUE(Y[i] == 0.0);
  88. }
  89. CTEST(dgemv, 0_nan_inf_incy_2)
  90. {
  91. int i;
  92. blasint N = 17;
  93. blasint Ny = 33;
  94. blasint incX = 1;
  95. blasint incY = 2;
  96. double alpha = 0.0;
  97. double beta = 0.0;
  98. char trans = 'N';
  99. double A[17 * 17];
  100. double X[17];
  101. double Y[33];
  102. double *ay = Y;
  103. memset(A, 0, sizeof(A));
  104. memset(X, 0, sizeof(X));
  105. memset(Y, 0, sizeof(Y));
  106. for (i = 0; i < (N - 1); i += 2)
  107. {
  108. ay[0] = NAN;
  109. ay += 2;
  110. ay[0] = INFINITY;
  111. ay += 2;
  112. }
  113. Y[Ny - 1] = NAN;
  114. BLASFUNC(dgemv)(&trans, &N, &N, &alpha, A, &N, X, &incX, &beta, Y, &incY);
  115. for (i = 0; i < Ny; i ++)
  116. ASSERT_TRUE(Y[i] == 0.0);
  117. }
  118. #endif
  119. #ifdef BUILD_COMPLEX
  120. CTEST(cgemv, 0_nan_inf)
  121. {
  122. int i;
  123. blasint N = 17;
  124. blasint incX = 1;
  125. blasint incY = 1;
  126. float alpha[2] = {0.0, 0.0};
  127. float beta[2] = {0.0, 0.0};
  128. char trans = 'N';
  129. float A[17 * 17 * 4];
  130. float X[17 * 2];
  131. float Y[17 * 2];
  132. memset(A, 0, sizeof(A));
  133. memset(X, 0, sizeof(X));
  134. for (i = 0; i < (2 * N - 2); i += 4)
  135. {
  136. Y[i] = NAN;
  137. Y[i + 1] = NAN;
  138. Y[i + 2] = INFINITY;
  139. Y[i + 3] = INFINITY;
  140. }
  141. Y[2 * N - 1] = NAN;
  142. Y[2 * N - 2] = NAN;
  143. BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  144. for (i = 0; i < 2 * N; i ++)
  145. ASSERT_TRUE(Y[i] == 0.0);
  146. }
  147. CTEST(cgemv, 0_nan_inf_incy_2)
  148. {
  149. int i;
  150. blasint N = 17;
  151. blasint incX = 1;
  152. blasint incY = 2;
  153. float alpha[2] = {0.0, 0.0};
  154. float beta[2] = {0.0, 0.0};
  155. char trans = 'N';
  156. float A[17 * 17 * 4];
  157. float X[17];
  158. float Y[17 * 2 * 2];
  159. float *ay = Y;
  160. memset(A, 0, sizeof(A));
  161. memset(X, 0, sizeof(X));
  162. memset(Y, 0, sizeof(Y));
  163. for (i = 0; i < (2 * N - 2); i += 4)
  164. {
  165. ay[0] = NAN;
  166. ay[1] = NAN;
  167. ay += 4;
  168. ay[0] = INFINITY;
  169. ay[1] = INFINITY;
  170. ay += 4;
  171. }
  172. Y[4 * N - 4] = NAN;
  173. Y[4 * N - 3] = NAN;
  174. BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  175. for (i = 0; i < 4 * N; i ++)
  176. ASSERT_TRUE(Y[i] == 0.0);
  177. }
  178. CTEST(cgemv, 0_2_nan_1_inf_1)
  179. {
  180. int i;
  181. blasint N = 17;
  182. blasint incX = 1;
  183. blasint incY = 1;
  184. float alpha[2] = {0.0, 0.0};
  185. float beta[2] = {0.0, 2.0};
  186. char trans = 'N';
  187. float A[17 * 17 * 4];
  188. float X[17 * 2];
  189. float Y[17 * 2];
  190. memset(A, 0, sizeof(A));
  191. memset(X, 0, sizeof(X));
  192. for (i = 0; i < (2 * N - 2); i += 4)
  193. {
  194. Y[i] = NAN;
  195. Y[i + 1] = 1.0;
  196. Y[i + 2] = INFINITY;
  197. Y[i + 3] = 1.0;
  198. }
  199. Y[2 * N - 2] = NAN;
  200. Y[2 * N - 1] = 1.0;
  201. BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  202. for (i = 0; i < 2 * N; i += 2) {
  203. if ((i >> 1) % 2){
  204. ASSERT_TRUE(isnan(Y[i]));
  205. ASSERT_TRUE(isinf(Y[i + 1]));
  206. }
  207. else {
  208. ASSERT_TRUE(isnan(Y[i]));
  209. ASSERT_TRUE(isnan(Y[i + 1]));
  210. }
  211. }
  212. }
  213. CTEST(cgemv, 0_2_nan_1_inf_1_incy_2)
  214. {
  215. int i;
  216. blasint N = 17;
  217. blasint incX = 1;
  218. blasint incY = 2;
  219. float alpha[2] = {0.0, 0.0};
  220. float beta[2] = {0.0, 2.0};
  221. char trans = 'N';
  222. float A[17 * 17 * 4];
  223. float X[17];
  224. float Y[17 * 2 * 2];
  225. float *ay = Y;
  226. memset(A, 0, sizeof(A));
  227. memset(X, 0, sizeof(X));
  228. memset(Y, 0, sizeof(Y));
  229. for (i = 0; i < (2 * N - 2); i += 4)
  230. {
  231. ay[0] = NAN;
  232. ay[1] = 1.0;
  233. ay += 4;
  234. ay[0] = INFINITY;
  235. ay[1] = 1.0;
  236. ay += 4;
  237. }
  238. Y[4 * N - 4] = NAN;
  239. Y[4 * N - 3] = 1.0;
  240. BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  241. for (i = 0; i < 4 * N; i += 2) {
  242. if ((i >> 1) % 2) {
  243. ASSERT_TRUE(Y[i] == 0.0);
  244. ASSERT_TRUE(Y[i + 1] == 0.0);
  245. }
  246. else {
  247. if ((i >> 2) % 2) {
  248. ASSERT_TRUE(isnan(Y[i]));
  249. ASSERT_TRUE(isinf(Y[i + 1]));
  250. }
  251. else {
  252. ASSERT_TRUE(isnan(Y[i]));
  253. ASSERT_TRUE(isnan(Y[i + 1]));
  254. }
  255. }
  256. }
  257. }
  258. CTEST(cgemv, 2_0_nan_1_inf_1)
  259. {
  260. int i;
  261. blasint N = 17;
  262. blasint incX = 1;
  263. blasint incY = 1;
  264. float alpha[2] = {0.0, 0.0};
  265. float beta[2] = {2.0, 0.0};
  266. char trans = 'N';
  267. float A[17 * 17 * 4];
  268. float X[17 * 2];
  269. float Y[17 * 2];
  270. memset(A, 0, sizeof(A));
  271. memset(X, 0, sizeof(X));
  272. for (i = 0; i < (2 * N - 2); i += 4)
  273. {
  274. Y[i] = NAN;
  275. Y[i + 1] = 1.0;
  276. Y[i + 2] = INFINITY;
  277. Y[i + 3] = 1.0;
  278. }
  279. Y[2 * N - 2] = NAN;
  280. Y[2 * N - 1] = 1.0;
  281. BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  282. for (i = 0; i < 2 * N; i += 2) {
  283. if ((i >> 1) % 2){
  284. ASSERT_TRUE(isinf(Y[i]));
  285. ASSERT_TRUE(isnan(Y[i + 1]));
  286. }
  287. else {
  288. ASSERT_TRUE(isnan(Y[i]));
  289. ASSERT_TRUE(isnan(Y[i + 1]));
  290. }
  291. }
  292. }
  293. CTEST(cgemv, 2_0_nan_1_inf_1_incy_2)
  294. {
  295. int i;
  296. blasint N = 17;
  297. blasint incX = 1;
  298. blasint incY = 2;
  299. float alpha[2] = {0.0, 0.0};
  300. float beta[2] = {2.0, 0.0};
  301. char trans = 'N';
  302. float A[17 * 17 * 4];
  303. float X[17];
  304. float Y[17 * 2 * 2];
  305. float *ay = Y;
  306. memset(A, 0, sizeof(A));
  307. memset(X, 0, sizeof(X));
  308. memset(Y, 0, sizeof(Y));
  309. for (i = 0; i < (2 * N - 2); i += 4)
  310. {
  311. ay[0] = NAN;
  312. ay[1] = 1.0;
  313. ay += 4;
  314. ay[0] = INFINITY;
  315. ay[1] = 1.0;
  316. ay += 4;
  317. }
  318. Y[4 * N - 4] = NAN;
  319. Y[4 * N - 3] = 1.0;
  320. BLASFUNC(cgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  321. for (i = 0; i < 4 * N; i += 2) {
  322. if ((i >> 1) % 2) {
  323. ASSERT_TRUE(Y[i] == 0.0);
  324. ASSERT_TRUE(Y[i + 1] == 0.0);
  325. }
  326. else {
  327. if ((i >> 2) % 2) {
  328. ASSERT_TRUE(isinf(Y[i]));
  329. ASSERT_TRUE(isnan(Y[i + 1]));
  330. }
  331. else {
  332. ASSERT_TRUE(isnan(Y[i]));
  333. ASSERT_TRUE(isnan(Y[i + 1]));
  334. }
  335. }
  336. }
  337. }
  338. #endif
  339. #ifdef BUILD_COMPLEX16
  340. CTEST(zgemv, 0_nan_inf)
  341. {
  342. int i;
  343. blasint N = 17;
  344. blasint incX = 1;
  345. blasint incY = 1;
  346. double alpha[2] = {0.0, 0.0};
  347. double beta[2] = {0.0, 0.0};
  348. char trans = 'N';
  349. double A[17 * 17 * 4];
  350. double X[17 * 2];
  351. double Y[17 * 2];
  352. memset(A, 0, sizeof(A));
  353. memset(X, 0, sizeof(X));
  354. for (i = 0; i < (2 * N - 2); i += 4)
  355. {
  356. Y[i] = NAN;
  357. Y[i + 1] = NAN;
  358. Y[i + 2] = INFINITY;
  359. Y[i + 3] = INFINITY;
  360. }
  361. Y[2 * N - 1] = NAN;
  362. Y[2 * N - 2] = NAN;
  363. BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  364. for (i = 0; i < 2 * N; i ++)
  365. ASSERT_TRUE(Y[i] == 0.0);
  366. }
  367. CTEST(zgemv, 0_nan_inf_incy_2)
  368. {
  369. int i;
  370. blasint N = 17;
  371. blasint incX = 1;
  372. blasint incY = 2;
  373. double alpha[2] = {0.0, 0.0};
  374. double beta[2] = {0.0, 0.0};
  375. char trans = 'N';
  376. double A[17 * 17 * 4];
  377. double X[17];
  378. double Y[17 * 2 * 2];
  379. double *ay = Y;
  380. memset(A, 0, sizeof(A));
  381. memset(X, 0, sizeof(X));
  382. memset(Y, 0, sizeof(Y));
  383. for (i = 0; i < (2 * N - 2); i += 4)
  384. {
  385. ay[0] = NAN;
  386. ay[1] = NAN;
  387. ay += 4;
  388. ay[0] = INFINITY;
  389. ay[1] = INFINITY;
  390. ay += 4;
  391. }
  392. Y[4 * N - 4] = NAN;
  393. Y[4 * N - 3] = NAN;
  394. BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  395. for (i = 0; i < 4 * N; i ++)
  396. ASSERT_TRUE(Y[i] == 0.0);
  397. }
  398. CTEST(zgemv, 0_2_nan_1_inf_1)
  399. {
  400. int i;
  401. blasint N = 17;
  402. blasint incX = 1;
  403. blasint incY = 1;
  404. double alpha[2] = {0.0, 0.0};
  405. double beta[2] = {0.0, 2.0};
  406. char trans = 'N';
  407. double A[17 * 17 * 4];
  408. double X[17 * 2];
  409. double Y[17 * 2];
  410. memset(A, 0, sizeof(A));
  411. memset(X, 0, sizeof(X));
  412. for (i = 0; i < (2 * N - 2); i += 4)
  413. {
  414. Y[i] = NAN;
  415. Y[i + 1] = 1.0;
  416. Y[i + 2] = INFINITY;
  417. Y[i + 3] = 1.0;
  418. }
  419. Y[2 * N - 2] = NAN;
  420. Y[2 * N - 1] = 1.0;
  421. BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  422. for (i = 0; i < 2 * N; i += 2) {
  423. if ((i >> 1) % 2){
  424. ASSERT_TRUE(isnan(Y[i]));
  425. ASSERT_TRUE(isinf(Y[i + 1]));
  426. }
  427. else {
  428. ASSERT_TRUE(isnan(Y[i]));
  429. ASSERT_TRUE(isnan(Y[i + 1]));
  430. }
  431. }
  432. }
  433. CTEST(zgemv, 0_2_nan_1_inf_1_incy_2)
  434. {
  435. int i;
  436. blasint N = 17;
  437. blasint incX = 1;
  438. blasint incY = 2;
  439. double alpha[2] = {0.0, 0.0};
  440. double beta[2] = {0.0, 2.0};
  441. char trans = 'N';
  442. double A[17 * 17 * 4];
  443. double X[17];
  444. double Y[17 * 2 * 2];
  445. double *ay = Y;
  446. memset(A, 0, sizeof(A));
  447. memset(X, 0, sizeof(X));
  448. memset(Y, 0, sizeof(Y));
  449. for (i = 0; i < (2 * N - 2); i += 4)
  450. {
  451. ay[0] = NAN;
  452. ay[1] = 1.0;
  453. ay += 4;
  454. ay[0] = INFINITY;
  455. ay[1] = 1.0;
  456. ay += 4;
  457. }
  458. Y[4 * N - 4] = NAN;
  459. Y[4 * N - 3] = 1.0;
  460. BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  461. for (i = 0; i < 4 * N; i += 2) {
  462. if ((i >> 1) % 2) {
  463. ASSERT_TRUE(Y[i] == 0.0);
  464. ASSERT_TRUE(Y[i + 1] == 0.0);
  465. }
  466. else {
  467. if ((i >> 2) % 2) {
  468. ASSERT_TRUE(isnan(Y[i]));
  469. ASSERT_TRUE(isinf(Y[i + 1]));
  470. }
  471. else {
  472. ASSERT_TRUE(isnan(Y[i]));
  473. ASSERT_TRUE(isnan(Y[i + 1]));
  474. }
  475. }
  476. }
  477. }
  478. CTEST(zgemv, 2_0_nan_1_inf_1)
  479. {
  480. int i;
  481. blasint N = 17;
  482. blasint incX = 1;
  483. blasint incY = 1;
  484. double alpha[2] = {0.0, 0.0};
  485. double beta[2] = {2.0, 0.0};
  486. char trans = 'N';
  487. double A[17 * 17 * 4];
  488. double X[17 * 2];
  489. double Y[17 * 2];
  490. memset(A, 0, sizeof(A));
  491. memset(X, 0, sizeof(X));
  492. for (i = 0; i < (2 * N - 2); i += 4)
  493. {
  494. Y[i] = NAN;
  495. Y[i + 1] = 1.0;
  496. Y[i + 2] = INFINITY;
  497. Y[i + 3] = 1.0;
  498. }
  499. Y[2 * N - 2] = NAN;
  500. Y[2 * N - 1] = 1.0;
  501. BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  502. for (i = 0; i < 2 * N; i += 2) {
  503. if ((i >> 1) % 2){
  504. ASSERT_TRUE(isinf(Y[i]));
  505. ASSERT_TRUE(isnan(Y[i + 1]));
  506. }
  507. else {
  508. ASSERT_TRUE(isnan(Y[i]));
  509. ASSERT_TRUE(isnan(Y[i + 1]));
  510. }
  511. }
  512. }
  513. CTEST(zgemv, 2_0_nan_1_inf_1_incy_2)
  514. {
  515. int i;
  516. blasint N = 17;
  517. blasint incX = 1;
  518. blasint incY = 2;
  519. double alpha[2] = {0.0, 0.0};
  520. double beta[2] = {2.0, 0.0};
  521. char trans = 'N';
  522. double A[17 * 17 * 4];
  523. double X[17];
  524. double Y[17 * 2 * 2];
  525. double *ay = Y;
  526. memset(A, 0, sizeof(A));
  527. memset(X, 0, sizeof(X));
  528. memset(Y, 0, sizeof(Y));
  529. for (i = 0; i < (2 * N - 2); i += 4)
  530. {
  531. ay[0] = NAN;
  532. ay[1] = 1.0;
  533. ay += 4;
  534. ay[0] = INFINITY;
  535. ay[1] = 1.0;
  536. ay += 4;
  537. }
  538. Y[4 * N - 4] = NAN;
  539. Y[4 * N - 3] = 1.0;
  540. BLASFUNC(zgemv)(&trans, &N, &N, alpha, A, &N, X, &incX, beta, Y, &incY);
  541. for (i = 0; i < 4 * N; i += 2) {
  542. if ((i >> 1) % 2) {
  543. ASSERT_TRUE(Y[i] == 0.0);
  544. ASSERT_TRUE(Y[i + 1] == 0.0);
  545. }
  546. else {
  547. if ((i >> 2) % 2) {
  548. ASSERT_TRUE(isinf(Y[i]));
  549. ASSERT_TRUE(isnan(Y[i + 1]));
  550. }
  551. else {
  552. ASSERT_TRUE(isnan(Y[i]));
  553. ASSERT_TRUE(isnan(Y[i + 1]));
  554. }
  555. }
  556. }
  557. }
  558. #endif