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 cuFloatComplex *
A, *
B, *
C, *
C2;
39 cuFloatComplex *
dA, *
dB, *dC1, *dC2;
57 maxn =
max(
max( m, n ), k );
61 assert( piv != NULL );
77 printf(
"========== Level 1 BLAS ==========\n" );
81 printf(
"\ntesting cswap\n" );
92 printf(
"cswap diff %.2g\n", error );
96 printf(
"\ntesting icamax\n" );
98 for(
int j = 0; j < k; ++j ) {
100 int i2 = cublasIcamax( 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 cgemv\n" );
111 for(
int ia = 0; ia < 3; ++ia ) {
116 magma_cgemv( trans[ia], m, n, alpha, dA, ld, dB, 1, beta, dC1, 1 );
117 cublasCgemv( trans[ia], m, n, alpha, dA, ld, dB, 1, beta, dC2, 1 );
120 size = (trans[ia] ==
'N' ? m : n);
121 cublasCaxpy( size, c_neg_one, dC1, 1, dC2, 1 );
124 printf(
"cgemv( %c ) diff %.2g\n", trans[ia], error );
130 printf(
"\ntesting chemv\n" );
131 for(
int iu = 0; iu < 2; ++iu ) {
136 magma_chemv( uplo[iu], m, alpha, dA, ld, dB, 1, beta, dC1, 1 );
137 cublasChemv( uplo[iu], m, alpha, dA, ld, dB, 1, beta, dC2, 1 );
140 cublasCaxpy( m, c_neg_one, dC1, 1, dC2, 1 );
143 printf(
"chemv( %c ) diff %.2g\n", uplo[iu], error );
149 printf(
"\ntesting ctrsv\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_ctrsv( uplo[iu], trans[it], diag[
id], m, dA, ld, dC1, 1 );
161 cublasCtrsv( uplo[iu], trans[it], diag[
id], m, dA, ld, dC2, 1 );
164 cublasCaxpy( m, c_neg_one, dC1, 1, dC2, 1 );
167 printf(
"ctrsv( %c, %c, %c ) diff %.2g\n", uplo[iu], trans[it], diag[
id], error );
170 printf(
"\n========== Level 3 BLAS ==========\n" );
175 printf(
"\ntesting cgemm\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_cgemm( trans[ia], trans[ib], m, n, k, alpha, dA, ld, dB, ld, beta, dC1, ld );
185 cublasCgemm( trans[ia], trans[ib], m, n, k, alpha, dA, ld, dB, ld, beta, dC2, ld );
188 cublasCaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
191 printf(
"cgemm( %c, %c ) diff %.2g\n", trans[ia], trans[ib], error );
198 printf(
"\ntesting chemm\n" );
199 for(
int is = 0; is < 2; ++is ) {
200 for(
int iu = 0; iu < 2; ++iu ) {
205 magma_chemm( side[is], uplo[iu], m, n, alpha, dA, ld, dB, ld, beta, dC1, ld );
206 cublasChemm( side[is], uplo[iu], m, n, alpha, dA, ld, dB, ld, beta, dC2, ld );
209 cublasCaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
212 printf(
"chemm( %c, %c ) diff %.2g\n", side[is], uplo[iu], error );
219 printf(
"\ntesting cherk\n" );
220 for(
int iu = 0; iu < 2; ++iu ) {
221 for(
int it = 0; it < 3; ++it ) {
225 magma_cherk( uplo[iu], trans[it], n, k, dalpha, dA, ld, dbeta, dC1, ld );
226 cublasCherk( uplo[iu], trans[it], n, k, dalpha, dA, ld, dbeta, dC2, ld );
229 cublasCaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
232 printf(
"cherk( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );
239 printf(
"\ntesting cher2k\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_cher2k( uplo[iu], trans[it], n, k, alpha, dA, ld, dB, ld, dbeta, dC1, ld );
247 cublasCher2k( uplo[iu], trans[it], n, k, alpha, dA, ld, dB, ld, dbeta, dC2, ld );
250 cublasCaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
253 printf(
"cher2k( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );
260 printf(
"\ntesting ctrmm\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_ctrmm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC1, ld );
270 cublasCtrmm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC2, ld );
273 cublasCaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
276 printf(
"ctrmm( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );
283 printf(
"\ntesting ctrsm\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_ctrsm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC1, ld );
293 cublasCtrsm( side[is], uplo[iu], trans[it], diag[
id], m, n, alpha, dA, ld, dC2, ld );
296 cublasCaxpy( ld*n, c_neg_one, dC1, 1, dC2, 1 );
299 printf(
"ctrsm( %c, %c ) diff %.2g\n", uplo[iu], trans[it], error );