1 #include <cxxblas/cxxblas.cxx>
2 #include <cxxblas/interface/aux.h>
3
4 using cxxblas::StorageOrder;
5 using cxxblas::ColMajor;
6 using cxxblas::RowMajor;
7 using cxxblas::Transpose;
8 using cxxblas::NoTrans;
9 using cxxblas::Trans;
10 using cxxblas::Conj;
11 using cxxblas::ConjTrans;
12 using cxxblas::StorageUpLo;
13 using cxxblas::Upper;
14 using cxxblas::Lower;
15
16
17 extern "C" {
18
19 void xerbla_(const char* srname, int* info);
20
21 #ifndef COMPLEX_FLOAT1
22 typedef CBLAS_FLOAT CBLAS_ALPHA;
23 typedef CBLAS_FLOAT CBLAS_BETA;
24 typedef CBLAS_FLOAT CXXBLAS_FLOAT;
25 #else
26 typedef const CBLAS_FLOAT * CBLAS_ALPHA;
27 typedef const CBLAS_FLOAT * CBLAS_BETA;
28 typedef std::complex<CBLAS_FLOAT> CXXBLAS_FLOAT;
29 #endif
30
31 enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102};
32 enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112,
33 CblasConjTrans=113, CblasConjNoTrans=114};
34 enum CBLAS_UPLO {CblasUpper=121, CblasLower=122};
35
36 void
37 CBLAS_NAME(enum CBLAS_ORDER _order,
38 enum CBLAS_UPLO _upLo,
39 CBLAS_INT n,
40 CBLAS_ALPHA _alpha,
41 const CBLAS_FLOAT *_A,
42 const CBLAS_FLOAT *_x, CBLAS_INT incX,
43 CBLAS_BETA _beta,
44 CBLAS_FLOAT *_y, CBLAS_INT incY)
45 #ifdef CREATE_CBLAS
46 {
47 StorageOrder order = (_order==CblasColMajor) ? ColMajor
48 : RowMajor;
49 StorageUpLo upLo = Lower;
50 if (_upLo==CblasUpper) {
51 upLo = Upper;
52 }
53
54 const CXXBLAS_FLOAT *A = reinterpret_cast<const CXXBLAS_FLOAT *>(_A);
55 const CXXBLAS_FLOAT *x = reinterpret_cast<const CXXBLAS_FLOAT *>(_x);
56 CXXBLAS_FLOAT *y = reinterpret_cast<CXXBLAS_FLOAT *>(_y);
57
58 #ifndef COMPLEX_FLOAT1
59 CXXBLAS_FLOAT alpha = _alpha;
60 CXXBLAS_FLOAT beta = _beta;
61 #else
62 CXXBLAS_FLOAT alpha(_alpha[0], _alpha[1]);
63 CXXBLAS_FLOAT beta(_beta[0], _beta[1]);
64 #endif
65
66 # ifdef TEST_ROW_MAJOR
67 switchPackedStorageOrder(order, upLo, n, A);
68 order = (order==ColMajor) ? RowMajor : ColMajor;
69 # endif
70
71 cxxblas::hpmv(order,
72 upLo,
73 n,
74 alpha,
75 A,
76 x, incX,
77 beta,
78 y, incY);
79
80 # ifdef TEST_ROW_MAJOR
81 releaseStorage(A);
82 # endif
83 }
84 #else
85 ;
86 #endif // CREATE_CBLAS
87
88 #ifdef CREATE_BLAS
89 void
90 BLAS_NAME(const char *_upLo,
91 const CBLAS_INT *_n,
92 const CBLAS_FLOAT *_alpha,
93 const CBLAS_FLOAT *A,
94 const CBLAS_FLOAT *x, const CBLAS_INT *_incX,
95 const CBLAS_FLOAT *_beta,
96 CBLAS_FLOAT *y, const CBLAS_INT *_incY)
97 {
98 bool checkUpLo = false;
99 CBLAS_UPLO upLo = CblasUpper;
100 if ((*_upLo=='L') || (*_upLo=='l')) {
101 upLo = CblasLower;
102 checkUpLo = true;
103 }
104 if ((*_upLo=='U') || (*_upLo=='u')) {
105 checkUpLo = true;
106 }
107
108 CBLAS_INT n = *_n;
109 CBLAS_INT incX = *_incX;
110 CBLAS_INT incY = *_incY;
111
112 # ifndef COMPLEX_FLOAT1
113 CBLAS_ALPHA alpha = *_alpha;
114 CBLAS_BETA beta = *_beta;
115 # else
116 CBLAS_ALPHA alpha = _alpha;
117 CBLAS_BETA beta = _beta;
118 # endif
119
120 CBLAS_INT info = 0;
121 if (incY==0) {
122 info = 9;
123 }
124 if (incX==0) {
125 info = 6;
126 }
127 if (n<0) {
128 info = 2;
129 }
130 if (!checkUpLo) {
131 info = 1;
132 }
133 if (info!=0) {
134 char blasName[6];
135 strncpy(blasName, BLAS_NAME_STR, 6);
136 for (int i=0; i<6; ++i) {
137 blasName[i] = std::toupper(blasName[i]);
138 }
139 xerbla_(blasName, &info);
140 return;
141 }
142
143 // the blas interface calls the cblas interface
144 // so any blas-test will also test the cblas-interface
145 CBLAS_NAME(CblasColMajor,
146 upLo,
147 n,
148 alpha,
149 A,
150 x, incX,
151 beta,
152 y, incY);
153 }
154 #endif // CREATE_BLAS
155
156 } // extern "C"
2 #include <cxxblas/interface/aux.h>
3
4 using cxxblas::StorageOrder;
5 using cxxblas::ColMajor;
6 using cxxblas::RowMajor;
7 using cxxblas::Transpose;
8 using cxxblas::NoTrans;
9 using cxxblas::Trans;
10 using cxxblas::Conj;
11 using cxxblas::ConjTrans;
12 using cxxblas::StorageUpLo;
13 using cxxblas::Upper;
14 using cxxblas::Lower;
15
16
17 extern "C" {
18
19 void xerbla_(const char* srname, int* info);
20
21 #ifndef COMPLEX_FLOAT1
22 typedef CBLAS_FLOAT CBLAS_ALPHA;
23 typedef CBLAS_FLOAT CBLAS_BETA;
24 typedef CBLAS_FLOAT CXXBLAS_FLOAT;
25 #else
26 typedef const CBLAS_FLOAT * CBLAS_ALPHA;
27 typedef const CBLAS_FLOAT * CBLAS_BETA;
28 typedef std::complex<CBLAS_FLOAT> CXXBLAS_FLOAT;
29 #endif
30
31 enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102};
32 enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112,
33 CblasConjTrans=113, CblasConjNoTrans=114};
34 enum CBLAS_UPLO {CblasUpper=121, CblasLower=122};
35
36 void
37 CBLAS_NAME(enum CBLAS_ORDER _order,
38 enum CBLAS_UPLO _upLo,
39 CBLAS_INT n,
40 CBLAS_ALPHA _alpha,
41 const CBLAS_FLOAT *_A,
42 const CBLAS_FLOAT *_x, CBLAS_INT incX,
43 CBLAS_BETA _beta,
44 CBLAS_FLOAT *_y, CBLAS_INT incY)
45 #ifdef CREATE_CBLAS
46 {
47 StorageOrder order = (_order==CblasColMajor) ? ColMajor
48 : RowMajor;
49 StorageUpLo upLo = Lower;
50 if (_upLo==CblasUpper) {
51 upLo = Upper;
52 }
53
54 const CXXBLAS_FLOAT *A = reinterpret_cast<const CXXBLAS_FLOAT *>(_A);
55 const CXXBLAS_FLOAT *x = reinterpret_cast<const CXXBLAS_FLOAT *>(_x);
56 CXXBLAS_FLOAT *y = reinterpret_cast<CXXBLAS_FLOAT *>(_y);
57
58 #ifndef COMPLEX_FLOAT1
59 CXXBLAS_FLOAT alpha = _alpha;
60 CXXBLAS_FLOAT beta = _beta;
61 #else
62 CXXBLAS_FLOAT alpha(_alpha[0], _alpha[1]);
63 CXXBLAS_FLOAT beta(_beta[0], _beta[1]);
64 #endif
65
66 # ifdef TEST_ROW_MAJOR
67 switchPackedStorageOrder(order, upLo, n, A);
68 order = (order==ColMajor) ? RowMajor : ColMajor;
69 # endif
70
71 cxxblas::hpmv(order,
72 upLo,
73 n,
74 alpha,
75 A,
76 x, incX,
77 beta,
78 y, incY);
79
80 # ifdef TEST_ROW_MAJOR
81 releaseStorage(A);
82 # endif
83 }
84 #else
85 ;
86 #endif // CREATE_CBLAS
87
88 #ifdef CREATE_BLAS
89 void
90 BLAS_NAME(const char *_upLo,
91 const CBLAS_INT *_n,
92 const CBLAS_FLOAT *_alpha,
93 const CBLAS_FLOAT *A,
94 const CBLAS_FLOAT *x, const CBLAS_INT *_incX,
95 const CBLAS_FLOAT *_beta,
96 CBLAS_FLOAT *y, const CBLAS_INT *_incY)
97 {
98 bool checkUpLo = false;
99 CBLAS_UPLO upLo = CblasUpper;
100 if ((*_upLo=='L') || (*_upLo=='l')) {
101 upLo = CblasLower;
102 checkUpLo = true;
103 }
104 if ((*_upLo=='U') || (*_upLo=='u')) {
105 checkUpLo = true;
106 }
107
108 CBLAS_INT n = *_n;
109 CBLAS_INT incX = *_incX;
110 CBLAS_INT incY = *_incY;
111
112 # ifndef COMPLEX_FLOAT1
113 CBLAS_ALPHA alpha = *_alpha;
114 CBLAS_BETA beta = *_beta;
115 # else
116 CBLAS_ALPHA alpha = _alpha;
117 CBLAS_BETA beta = _beta;
118 # endif
119
120 CBLAS_INT info = 0;
121 if (incY==0) {
122 info = 9;
123 }
124 if (incX==0) {
125 info = 6;
126 }
127 if (n<0) {
128 info = 2;
129 }
130 if (!checkUpLo) {
131 info = 1;
132 }
133 if (info!=0) {
134 char blasName[6];
135 strncpy(blasName, BLAS_NAME_STR, 6);
136 for (int i=0; i<6; ++i) {
137 blasName[i] = std::toupper(blasName[i]);
138 }
139 xerbla_(blasName, &info);
140 return;
141 }
142
143 // the blas interface calls the cblas interface
144 // so any blas-test will also test the cblas-interface
145 CBLAS_NAME(CblasColMajor,
146 upLo,
147 n,
148 alpha,
149 A,
150 x, incX,
151 beta,
152 y, incY);
153 }
154 #endif // CREATE_BLAS
155
156 } // extern "C"