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.

c_dblas3.c 10 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /*
  2. * Written by D.P. Manley, Digital Equipment Corporation.
  3. * Prefixed "C_" to BLAS routines and their declarations.
  4. *
  5. * Modified by T. H. Do, 2/19/98, SGI/CRAY Research.
  6. */
  7. #include <stdlib.h>
  8. #include "common.h"
  9. #include "cblas_test.h"
  10. #define TEST_COL_MJR 0
  11. #define TEST_ROW_MJR 1
  12. #define UNDEFINED -1
  13. void F77_dgemm(int *order, char *transpa, char *transpb, int *m, int *n,
  14. int *k, double *alpha, double *a, int *lda, double *b, int *ldb,
  15. double *beta, double *c, int *ldc ) {
  16. double *A, *B, *C;
  17. int i,j,LDA, LDB, LDC;
  18. enum CBLAS_TRANSPOSE transa, transb;
  19. get_transpose_type(transpa, &transa);
  20. get_transpose_type(transpb, &transb);
  21. if (*order == TEST_ROW_MJR) {
  22. if (transa == CblasNoTrans) {
  23. LDA = *k+1;
  24. A = (double *)malloc( (*m)*LDA*sizeof( double ) );
  25. for( i=0; i<*m; i++ )
  26. for( j=0; j<*k; j++ )
  27. A[i*LDA+j]=a[j*(*lda)+i];
  28. }
  29. else {
  30. LDA = *m+1;
  31. A = ( double* )malloc( LDA*(*k)*sizeof( double ) );
  32. for( i=0; i<*k; i++ )
  33. for( j=0; j<*m; j++ )
  34. A[i*LDA+j]=a[j*(*lda)+i];
  35. }
  36. if (transb == CblasNoTrans) {
  37. LDB = *n+1;
  38. B = ( double* )malloc( (*k)*LDB*sizeof( double ) );
  39. for( i=0; i<*k; i++ )
  40. for( j=0; j<*n; j++ )
  41. B[i*LDB+j]=b[j*(*ldb)+i];
  42. }
  43. else {
  44. LDB = *k+1;
  45. B = ( double* )malloc( LDB*(*n)*sizeof( double ) );
  46. for( i=0; i<*n; i++ )
  47. for( j=0; j<*k; j++ )
  48. B[i*LDB+j]=b[j*(*ldb)+i];
  49. }
  50. LDC = *n+1;
  51. C = ( double* )malloc( (*m)*LDC*sizeof( double ) );
  52. for( j=0; j<*n; j++ )
  53. for( i=0; i<*m; i++ )
  54. C[i*LDC+j]=c[j*(*ldc)+i];
  55. cblas_dgemm( CblasRowMajor, transa, transb, *m, *n, *k, *alpha, A, LDA,
  56. B, LDB, *beta, C, LDC );
  57. for( j=0; j<*n; j++ )
  58. for( i=0; i<*m; i++ )
  59. c[j*(*ldc)+i]=C[i*LDC+j];
  60. free(A);
  61. free(B);
  62. free(C);
  63. }
  64. else if (*order == TEST_COL_MJR)
  65. cblas_dgemm( CblasColMajor, transa, transb, *m, *n, *k, *alpha, a, *lda,
  66. b, *ldb, *beta, c, *ldc );
  67. else
  68. cblas_dgemm( UNDEFINED, transa, transb, *m, *n, *k, *alpha, a, *lda,
  69. b, *ldb, *beta, c, *ldc );
  70. }
  71. void F77_dsymm(int *order, char *rtlf, char *uplow, int *m, int *n,
  72. double *alpha, double *a, int *lda, double *b, int *ldb,
  73. double *beta, double *c, int *ldc ) {
  74. double *A, *B, *C;
  75. int i,j,LDA, LDB, LDC;
  76. enum CBLAS_UPLO uplo;
  77. enum CBLAS_SIDE side;
  78. get_uplo_type(uplow,&uplo);
  79. get_side_type(rtlf,&side);
  80. if (*order == TEST_ROW_MJR) {
  81. if (side == CblasLeft) {
  82. LDA = *m+1;
  83. A = ( double* )malloc( (*m)*LDA*sizeof( double ) );
  84. for( i=0; i<*m; i++ )
  85. for( j=0; j<*m; j++ )
  86. A[i*LDA+j]=a[j*(*lda)+i];
  87. }
  88. else{
  89. LDA = *n+1;
  90. A = ( double* )malloc( (*n)*LDA*sizeof( double ) );
  91. for( i=0; i<*n; i++ )
  92. for( j=0; j<*n; j++ )
  93. A[i*LDA+j]=a[j*(*lda)+i];
  94. }
  95. LDB = *n+1;
  96. B = ( double* )malloc( (*m)*LDB*sizeof( double ) );
  97. for( i=0; i<*m; i++ )
  98. for( j=0; j<*n; j++ )
  99. B[i*LDB+j]=b[j*(*ldb)+i];
  100. LDC = *n+1;
  101. C = ( double* )malloc( (*m)*LDC*sizeof( double ) );
  102. for( j=0; j<*n; j++ )
  103. for( i=0; i<*m; i++ )
  104. C[i*LDC+j]=c[j*(*ldc)+i];
  105. cblas_dsymm( CblasRowMajor, side, uplo, *m, *n, *alpha, A, LDA, B, LDB,
  106. *beta, C, LDC );
  107. for( j=0; j<*n; j++ )
  108. for( i=0; i<*m; i++ )
  109. c[j*(*ldc)+i]=C[i*LDC+j];
  110. free(A);
  111. free(B);
  112. free(C);
  113. }
  114. else if (*order == TEST_COL_MJR)
  115. cblas_dsymm( CblasColMajor, side, uplo, *m, *n, *alpha, a, *lda, b, *ldb,
  116. *beta, c, *ldc );
  117. else
  118. cblas_dsymm( UNDEFINED, side, uplo, *m, *n, *alpha, a, *lda, b, *ldb,
  119. *beta, c, *ldc );
  120. }
  121. void F77_dsyrk(int *order, char *uplow, char *transp, int *n, int *k,
  122. double *alpha, double *a, int *lda,
  123. double *beta, double *c, int *ldc ) {
  124. int i,j,LDA,LDC;
  125. double *A, *C;
  126. enum CBLAS_UPLO uplo;
  127. enum CBLAS_TRANSPOSE trans;
  128. get_uplo_type(uplow,&uplo);
  129. get_transpose_type(transp,&trans);
  130. if (*order == TEST_ROW_MJR) {
  131. if (trans == CblasNoTrans) {
  132. LDA = *k+1;
  133. A = ( double* )malloc( (*n)*LDA*sizeof( double ) );
  134. for( i=0; i<*n; i++ )
  135. for( j=0; j<*k; j++ )
  136. A[i*LDA+j]=a[j*(*lda)+i];
  137. }
  138. else{
  139. LDA = *n+1;
  140. A = ( double* )malloc( (*k)*LDA*sizeof( double ) );
  141. for( i=0; i<*k; i++ )
  142. for( j=0; j<*n; j++ )
  143. A[i*LDA+j]=a[j*(*lda)+i];
  144. }
  145. LDC = *n+1;
  146. C = ( double* )malloc( (*n)*LDC*sizeof( double ) );
  147. for( i=0; i<*n; i++ )
  148. for( j=0; j<*n; j++ )
  149. C[i*LDC+j]=c[j*(*ldc)+i];
  150. cblas_dsyrk(CblasRowMajor, uplo, trans, *n, *k, *alpha, A, LDA, *beta,
  151. C, LDC );
  152. for( j=0; j<*n; j++ )
  153. for( i=0; i<*n; i++ )
  154. c[j*(*ldc)+i]=C[i*LDC+j];
  155. free(A);
  156. free(C);
  157. }
  158. else if (*order == TEST_COL_MJR)
  159. cblas_dsyrk(CblasColMajor, uplo, trans, *n, *k, *alpha, a, *lda, *beta,
  160. c, *ldc );
  161. else
  162. cblas_dsyrk(UNDEFINED, uplo, trans, *n, *k, *alpha, a, *lda, *beta,
  163. c, *ldc );
  164. }
  165. void F77_dsyr2k(int *order, char *uplow, char *transp, int *n, int *k,
  166. double *alpha, double *a, int *lda, double *b, int *ldb,
  167. double *beta, double *c, int *ldc ) {
  168. int i,j,LDA,LDB,LDC;
  169. double *A, *B, *C;
  170. enum CBLAS_UPLO uplo;
  171. enum CBLAS_TRANSPOSE trans;
  172. get_uplo_type(uplow,&uplo);
  173. get_transpose_type(transp,&trans);
  174. if (*order == TEST_ROW_MJR) {
  175. if (trans == CblasNoTrans) {
  176. LDA = *k+1;
  177. LDB = *k+1;
  178. A = ( double* )malloc( (*n)*LDA*sizeof( double ) );
  179. B = ( double* )malloc( (*n)*LDB*sizeof( double ) );
  180. for( i=0; i<*n; i++ )
  181. for( j=0; j<*k; j++ ) {
  182. A[i*LDA+j]=a[j*(*lda)+i];
  183. B[i*LDB+j]=b[j*(*ldb)+i];
  184. }
  185. }
  186. else {
  187. LDA = *n+1;
  188. LDB = *n+1;
  189. A = ( double* )malloc( LDA*(*k)*sizeof( double ) );
  190. B = ( double* )malloc( LDB*(*k)*sizeof( double ) );
  191. for( i=0; i<*k; i++ )
  192. for( j=0; j<*n; j++ ){
  193. A[i*LDA+j]=a[j*(*lda)+i];
  194. B[i*LDB+j]=b[j*(*ldb)+i];
  195. }
  196. }
  197. LDC = *n+1;
  198. C = ( double* )malloc( (*n)*LDC*sizeof( double ) );
  199. for( i=0; i<*n; i++ )
  200. for( j=0; j<*n; j++ )
  201. C[i*LDC+j]=c[j*(*ldc)+i];
  202. cblas_dsyr2k(CblasRowMajor, uplo, trans, *n, *k, *alpha, A, LDA,
  203. B, LDB, *beta, C, LDC );
  204. for( j=0; j<*n; j++ )
  205. for( i=0; i<*n; i++ )
  206. c[j*(*ldc)+i]=C[i*LDC+j];
  207. free(A);
  208. free(B);
  209. free(C);
  210. }
  211. else if (*order == TEST_COL_MJR)
  212. cblas_dsyr2k(CblasColMajor, uplo, trans, *n, *k, *alpha, a, *lda,
  213. b, *ldb, *beta, c, *ldc );
  214. else
  215. cblas_dsyr2k(UNDEFINED, uplo, trans, *n, *k, *alpha, a, *lda,
  216. b, *ldb, *beta, c, *ldc );
  217. }
  218. void F77_dtrmm(int *order, char *rtlf, char *uplow, char *transp, char *diagn,
  219. int *m, int *n, double *alpha, double *a, int *lda, double *b,
  220. int *ldb) {
  221. int i,j,LDA,LDB;
  222. double *A, *B;
  223. enum CBLAS_SIDE side;
  224. enum CBLAS_DIAG diag;
  225. enum CBLAS_UPLO uplo;
  226. enum CBLAS_TRANSPOSE trans;
  227. get_uplo_type(uplow,&uplo);
  228. get_transpose_type(transp,&trans);
  229. get_diag_type(diagn,&diag);
  230. get_side_type(rtlf,&side);
  231. if (*order == TEST_ROW_MJR) {
  232. if (side == CblasLeft) {
  233. LDA = *m+1;
  234. A = ( double* )malloc( (*m)*LDA*sizeof( double ) );
  235. for( i=0; i<*m; i++ )
  236. for( j=0; j<*m; j++ )
  237. A[i*LDA+j]=a[j*(*lda)+i];
  238. }
  239. else{
  240. LDA = *n+1;
  241. A = ( double* )malloc( (*n)*LDA*sizeof( double ) );
  242. for( i=0; i<*n; i++ )
  243. for( j=0; j<*n; j++ )
  244. A[i*LDA+j]=a[j*(*lda)+i];
  245. }
  246. LDB = *n+1;
  247. B = ( double* )malloc( (*m)*LDB*sizeof( double ) );
  248. for( i=0; i<*m; i++ )
  249. for( j=0; j<*n; j++ )
  250. B[i*LDB+j]=b[j*(*ldb)+i];
  251. cblas_dtrmm(CblasRowMajor, side, uplo, trans, diag, *m, *n, *alpha,
  252. A, LDA, B, LDB );
  253. for( j=0; j<*n; j++ )
  254. for( i=0; i<*m; i++ )
  255. b[j*(*ldb)+i]=B[i*LDB+j];
  256. free(A);
  257. free(B);
  258. }
  259. else if (*order == TEST_COL_MJR)
  260. cblas_dtrmm(CblasColMajor, side, uplo, trans, diag, *m, *n, *alpha,
  261. a, *lda, b, *ldb);
  262. else
  263. cblas_dtrmm(UNDEFINED, side, uplo, trans, diag, *m, *n, *alpha,
  264. a, *lda, b, *ldb);
  265. }
  266. void F77_dtrsm(int *order, char *rtlf, char *uplow, char *transp, char *diagn,
  267. int *m, int *n, double *alpha, double *a, int *lda, double *b,
  268. int *ldb) {
  269. int i,j,LDA,LDB;
  270. double *A, *B;
  271. enum CBLAS_SIDE side;
  272. enum CBLAS_DIAG diag;
  273. enum CBLAS_UPLO uplo;
  274. enum CBLAS_TRANSPOSE trans;
  275. get_uplo_type(uplow,&uplo);
  276. get_transpose_type(transp,&trans);
  277. get_diag_type(diagn,&diag);
  278. get_side_type(rtlf,&side);
  279. if (*order == TEST_ROW_MJR) {
  280. if (side == CblasLeft) {
  281. LDA = *m+1;
  282. A = ( double* )malloc( (*m)*LDA*sizeof( double ) );
  283. for( i=0; i<*m; i++ )
  284. for( j=0; j<*m; j++ )
  285. A[i*LDA+j]=a[j*(*lda)+i];
  286. }
  287. else{
  288. LDA = *n+1;
  289. A = ( double* )malloc( (*n)*LDA*sizeof( double ) );
  290. for( i=0; i<*n; i++ )
  291. for( j=0; j<*n; j++ )
  292. A[i*LDA+j]=a[j*(*lda)+i];
  293. }
  294. LDB = *n+1;
  295. B = ( double* )malloc( (*m)*LDB*sizeof( double ) );
  296. for( i=0; i<*m; i++ )
  297. for( j=0; j<*n; j++ )
  298. B[i*LDB+j]=b[j*(*ldb)+i];
  299. cblas_dtrsm(CblasRowMajor, side, uplo, trans, diag, *m, *n, *alpha,
  300. A, LDA, B, LDB );
  301. for( j=0; j<*n; j++ )
  302. for( i=0; i<*m; i++ )
  303. b[j*(*ldb)+i]=B[i*LDB+j];
  304. free(A);
  305. free(B);
  306. }
  307. else if (*order == TEST_COL_MJR)
  308. cblas_dtrsm(CblasColMajor, side, uplo, trans, diag, *m, *n, *alpha,
  309. a, *lda, b, *ldb);
  310. else
  311. cblas_dtrsm(UNDEFINED, side, uplo, trans, diag, *m, *n, *alpha,
  312. a, *lda, b, *ldb);
  313. }