20 #include "common_magma.h"
23 #define A(i,j) &A[ (i) + (j)*ld ]
24 #define dA(i,j) &dA[ (i) + (j)*ld ]
25 #define C2(i,j) &C2[ (i) + (j)*ld ]
27 int main(
int argc,
char** argv )
33 const char trans[] = {
'N',
'C',
'T' };
34 const char uplo[] = {
'L',
'U' };
35 const char diag[] = {
'U',
'N' };
36 const char side[] = {
'L',
'R' };
38 cuDoubleComplex *
A, *
B, *
C, *
C2;
39 cuDoubleComplex *
dA, *
dB, *dC1, *dC2;
44 double work[1], error;
57 maxn =
max(
max( m, n ), k );
61 assert( piv != NULL );
77 printf(
"========== Level 1 BLAS ==========\n" );
81 printf(
"\ntesting zswap\n" );
92 printf(
"zswap diff %.2g\n", error );
96 printf(
"\ntesting izamax\n" );
98 for(
int j = 0; j < k; ++j ) {
100 int i2 = cublasIzamax( m,
dA(0,j), 1 );
102 printf(
"i1 %4d, i2 %4d, diff %d\n", i1, i2, i1-i2 );
105 printf(
"\n========== Level 2 BLAS ==========\n" );
110 printf(
"\ntesting zgemv\n" );
111 for(
int ia = 0; ia < 3; ++ia ) {
116 magma_zgemv( trans[ia], m, n, alpha, dA, ld, dB, 1, beta, dC1, 1 );
117 cublasZgemv( trans[ia], m, n, alpha, dA, ld, dB, 1, beta, dC2, 1 );
120 size = (trans[ia] ==
'N' ? m : n);
121 cublasZaxpy( size, c_neg_one, dC1, 1, dC2, 1 );
124 printf(
"zgemv( %c ) diff %.2g\n", trans[ia], error );
130 printf(
"\ntesting zhemv\n" );
131 for(
int iu = 0; iu < 2; ++iu ) {
136 magma_zhemv( uplo[iu], m, alpha, dA, ld, dB, 1, beta, dC1, 1 );
137 cublasZhemv( uplo[iu], m, alpha, dA, ld, dB, 1, beta, dC2, 1 );
140 cublasZaxpy( m, c_neg_one, dC1, 1, dC2, 1 );
143 printf(
"zhemv( %c ) diff %.2g\n", uplo[iu], error );
149 printf(
"\ntesting ztrsv\n" );
154 for(
int iu = 0; iu < 2; ++iu ) {
155 for(
int it = 0; it < 3; ++it ) {
156 for(
int id = 0;
id < 2; ++id ) {
160 magma_ztrsv( uplo[iu], trans[it], diag[
id], m, dA, ld, dC1, 1 );
161 cublasZtrsv( uplo[iu], trans[it], diag[
id], m, dA, ld, dC2, 1 );
164 cublasZaxpy( m, c_neg_one, dC1, 1, dC2, 1 );
167 printf(
"ztrsv( %c, %c, %c ) diff %.2g\n", uplo[iu], trans[it], diag[
id], error );
170 printf(
"\n========== Level 3 BLAS ==========\n" );
175 printf(
"\ntesting zgemm\n" );
176 for(
int ia = 0; ia < 3; ++ia ) {
177 for(
int ib = 0; ib < 3; ++ib ) {
178 bool nta = (trans[ia] ==
'N');
179 bool ntb = (trans[ib] ==
'N');
184 magma_zgemm( trans[ia], trans[ib], m, n, k, alpha, dA, ld, dB, ld, beta, dC1, ld );
185 cublasZgemm( trans[ia], trans[ib], m, n, k, alpha, dA, ld, dB, ld, beta, dC2, ld );
188 cublasZaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
191 printf(
"zgemm( %c, %c ) diff %.2g\n", trans[ia], trans[ib], error );
198 printf(
"\ntesting zhemm\n" );
199 for(
int is = 0; is < 2; ++is ) {
200 for(
int iu = 0; iu < 2; ++iu ) {
205 magma_zhemm( side[is], uplo[iu], m, n, alpha, dA, ld, dB, ld, beta, dC1, ld );
206 cublasZhemm( side[is], uplo[iu], m, n, alpha, dA, ld, dB, ld, beta, dC2, ld );
209 cublasZaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
212 printf(
"zhemm( %c, %c ) diff %.2g\n", side[is], uplo[iu], error );
219 printf(
"\ntesting zherk\n" );
220 for(
int iu = 0; iu < 2; ++iu ) {
221 for(
int it = 0; it < 3; ++it ) {
225 magma_zherk( uplo[iu], trans[it], n, k, dalpha, dA, ld, dbeta, dC1, ld );
226 cublasZherk( uplo[iu], trans[it], n, k, dalpha, dA, ld, dbeta, dC2, ld );
229 cublasZaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
232 printf(
"zherk( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );
239 printf(
"\ntesting zher2k\n" );
240 for(
int iu = 0; iu < 2; ++iu ) {
241 for(
int it = 0; it < 3; ++it ) {
242 bool nt = (trans[it] ==
'N');
246 magma_zher2k( uplo[iu], trans[it], n, k, alpha, dA, ld, dB, ld, dbeta, dC1, ld );
247 cublasZher2k( uplo[iu], trans[it], n, k, alpha, dA, ld, dB, ld, dbeta, dC2, ld );
250 cublasZaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
253 printf(
"zher2k( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );
260 printf(
"\ntesting ztrmm\n" );
261 for(
int is = 0; is < 2; ++is ) {
262 for(
int iu = 0; iu < 2; ++iu ) {
263 for(
int it = 0; it < 3; ++it ) {
264 for(
int id = 0;
id < 2; ++id ) {
265 bool left = (side[is] ==
'L');
269 magma_ztrmm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC1, ld );
270 cublasZtrmm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC2, ld );
273 cublasZaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
276 printf(
"ztrmm( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );
283 printf(
"\ntesting ztrsm\n" );
284 for(
int is = 0; is < 2; ++is ) {
285 for(
int iu = 0; iu < 2; ++iu ) {
286 for(
int it = 0; it < 3; ++it ) {
287 for(
int id = 0;
id < 2; ++id ) {
288 bool left = (side[is] ==
'L');
292 magma_ztrsm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC1, ld );
293 cublasZtrsm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC2, ld );
296 cublasZaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
299 printf(
"ztrsm( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );