207 int32_t batchCount = Amk.size();
208 assert(Bkn.size()==batchCount);
209 assert(Cmn.size()==batchCount);
230 hipblasOperation_t hOpA;
231 hipblasOperation_t hOpB;
242 (hipblasDoubleComplex *) &alpha_p[0],
243 (hipblasDoubleComplex **)&Amk[0], lda,
244 (hipblasDoubleComplex **)&Bkn[0], ldb,
245 (hipblasDoubleComplex *) &beta_p[0],
246 (hipblasDoubleComplex **)&Cmn[0], ldc,
249 assert(err==HIPBLAS_STATUS_SUCCESS);
252 cublasOperation_t hOpA;
253 cublasOperation_t hOpB;
264 (cuDoubleComplex *) &alpha_p[0],
265 (cuDoubleComplex **)&Amk[0], lda,
266 (cuDoubleComplex **)&Bkn[0], ldb,
267 (cuDoubleComplex *) &beta_p[0],
268 (cuDoubleComplex **)&Cmn[0], ldc,
270 assert(err==CUBLAS_STATUS_SUCCESS);
279 int64_t batchCount64=batchCount;
281 oneapi::mkl::transpose iOpA;
282 oneapi::mkl::transpose iOpB;
284 if ( OpA ==
GridBLAS_OP_N ) iOpA = oneapi::mkl::transpose::N;
285 if ( OpA ==
GridBLAS_OP_T ) iOpA = oneapi::mkl::transpose::T;
286 if ( OpA ==
GridBLAS_OP_C ) iOpA = oneapi::mkl::transpose::C;
287 if ( OpB ==
GridBLAS_OP_N ) iOpB = oneapi::mkl::transpose::N;
288 if ( OpB ==
GridBLAS_OP_T ) iOpB = oneapi::mkl::transpose::T;
289 if ( OpB ==
GridBLAS_OP_C ) iOpB = oneapi::mkl::transpose::C;
296 (
const ComplexD **)&Amk[0], (
const int64_t *)&lda64,
297 (
const ComplexD **)&Bkn[0], (
const int64_t *)&ldb64,
299 (
ComplexD **)&Cmn[0], (
const int64_t *)&ldc64,
300 (int64_t)1,&batchCount64,std::vector<sycl::event>());
304 std::cerr <<
" Called SYCL batched ZGEMM OpA "<< OpA <<
" OpB "<<OpB <<std::endl;
305 std::vector<ComplexD> A(m*k);
306 std::vector<ComplexD>
B(k*n);
307 std::vector<ComplexD> C(m*n);
311 std::cerr <<
" Checking the GEMM results "<<std::endl;
312 for (
int p = 0; p < 1; ++p) {
319 std::cerr <<
" p " << p <<
" copied pointers "<<std::endl;
323 std::cerr <<
" p " << p <<
" copied matrices "<<std::endl;
324 std::cerr <<
" C[0] "<<C[0]<<std::endl;
325 std::cerr <<
" A[0] "<<A[0]<<std::endl;
326 std::cerr <<
" B[0] "<<
B[0]<<std::endl;
327 std::cerr <<
" m "<<m<<std::endl;
328 std::cerr <<
" n "<<n<<std::endl;
329 std::cerr <<
" k "<<k<<std::endl;
330 for (
int mm = 0; mm < m; ++mm) {
331 for (
int nn = 0; nn < n; ++nn) {
333 for (
int kk = 0; kk < k; ++kk) {
357 std::cerr <<
" beta "<<beta<<
" alpha "<<alpha<<
" C_"<<mm<<
","<<nn<<
" "<<c_mn<<
" "<<C[mm + nn*ldc]<<std::endl;
363#if !defined(GRID_SYCL) && !defined(GRID_CUDA) && !defined(GRID_HIP)
367 Eigen::Map<Eigen::MatrixXcd> eAmk(Amk[p],m,k);
368 Eigen::Map<Eigen::MatrixXcd> eBkn(Bkn[p],k,n);
369 Eigen::Map<Eigen::MatrixXcd> eCmn(Cmn[p],m,n);
370 if (std::abs(beta) != 0.0)
371 eCmn = beta * eCmn + alpha * eAmk * eBkn ;
373 eCmn = alpha * eAmk * eBkn ;
377 Eigen::Map<Eigen::MatrixXcd> eAmk(Amk[p],k,m);
378 Eigen::Map<Eigen::MatrixXcd> eBkn(Bkn[p],k,n);
379 Eigen::Map<Eigen::MatrixXcd> eCmn(Cmn[p],m,n);
380 if (std::abs(beta) != 0.0)
381 eCmn = beta * eCmn + alpha * eAmk.adjoint() * eBkn ;
383 eCmn = alpha * eAmk.adjoint() * eBkn ;
387 Eigen::Map<Eigen::MatrixXcd> eAmk(Amk[p],k,m);
388 Eigen::Map<Eigen::MatrixXcd> eBkn(Bkn[p],k,n);
389 Eigen::Map<Eigen::MatrixXcd> eCmn(Cmn[p],m,n);
390 if (std::abs(beta) != 0.0)
391 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn ;
393 eCmn = alpha * eAmk.transpose() * eBkn ;
397 Eigen::Map<Eigen::MatrixXcd> eAmk(Amk[p],m,k);
398 Eigen::Map<Eigen::MatrixXcd> eBkn(Bkn[p],n,k);
399 Eigen::Map<Eigen::MatrixXcd> eCmn(Cmn[p],m,n);
400 if (std::abs(beta) != 0.0)
401 eCmn = beta * eCmn + alpha * eAmk * eBkn.adjoint() ;
403 eCmn = alpha * eAmk * eBkn.adjoint() ;
407 Eigen::Map<Eigen::MatrixXcd> eAmk(Amk[p],m,k);
408 Eigen::Map<Eigen::MatrixXcd> eBkn(Bkn[p],n,k);
409 Eigen::Map<Eigen::MatrixXcd> eCmn(Cmn[p],m,n);
410 eCmn = beta * eCmn + alpha * eAmk * eBkn.transpose() ;
414 Eigen::Map<Eigen::MatrixXcd> eAmk(Amk[p],k,m);
415 Eigen::Map<Eigen::MatrixXcd> eBkn(Bkn[p],n,k);
416 Eigen::Map<Eigen::MatrixXcd> eCmn(Cmn[p],m,n);
417 if (std::abs(beta) != 0.0)
418 eCmn = beta * eCmn + alpha * eAmk.adjoint() * eBkn.adjoint() ;
420 eCmn = alpha * eAmk.adjoint() * eBkn.adjoint() ;
424 Eigen::Map<Eigen::MatrixXcd> eAmk(Amk[p],k,m);
425 Eigen::Map<Eigen::MatrixXcd> eBkn(Bkn[p],n,k);
426 Eigen::Map<Eigen::MatrixXcd> eCmn(Cmn[p],m,n);
427 if (std::abs(beta) != 0.0)
428 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn.transpose() ;
430 eCmn = alpha * eAmk.transpose() * eBkn.transpose() ;
437 RealD flops = 8.0*m*n*k*batchCount;
454 int32_t batchCount = Amk.size();
473 assert(Bkn.size()==batchCount);
474 assert(Cmn.size()==batchCount);
476 hipblasOperation_t hOpA;
477 hipblasOperation_t hOpB;
488 (hipblasComplex *) &alpha_p[0],
489 (hipblasComplex **)&Amk[0], lda,
490 (hipblasComplex **)&Bkn[0], ldb,
491 (hipblasComplex *) &beta_p[0],
492 (hipblasComplex **)&Cmn[0], ldc,
495 assert(err==HIPBLAS_STATUS_SUCCESS);
498 cublasOperation_t hOpA;
499 cublasOperation_t hOpB;
510 (cuComplex *) &alpha_p[0],
511 (cuComplex **)&Amk[0], lda,
512 (cuComplex **)&Bkn[0], ldb,
513 (cuComplex *) &beta_p[0],
514 (cuComplex **)&Cmn[0], ldc,
516 assert(err==CUBLAS_STATUS_SUCCESS);
525 int64_t batchCount64=batchCount;
527 oneapi::mkl::transpose iOpA;
528 oneapi::mkl::transpose iOpB;
530 if ( OpA ==
GridBLAS_OP_N ) iOpA = oneapi::mkl::transpose::N;
531 if ( OpA ==
GridBLAS_OP_T ) iOpA = oneapi::mkl::transpose::T;
532 if ( OpA ==
GridBLAS_OP_C ) iOpA = oneapi::mkl::transpose::C;
533 if ( OpB ==
GridBLAS_OP_N ) iOpB = oneapi::mkl::transpose::N;
534 if ( OpB ==
GridBLAS_OP_T ) iOpB = oneapi::mkl::transpose::T;
535 if ( OpB ==
GridBLAS_OP_C ) iOpB = oneapi::mkl::transpose::C;
542 (
const ComplexF **)&Amk[0], (
const int64_t *)&lda64,
543 (
const ComplexF **)&Bkn[0], (
const int64_t *)&ldb64,
545 (
ComplexF **)&Cmn[0], (
const int64_t *)&ldc64,
546 (int64_t)1,&batchCount64,std::vector<sycl::event>());
549#if !defined(GRID_SYCL) && !defined(GRID_CUDA) && !defined(GRID_HIP)
553 Eigen::Map<Eigen::MatrixXcf> eAmk(Amk[p],m,k);
554 Eigen::Map<Eigen::MatrixXcf> eBkn(Bkn[p],k,n);
555 Eigen::Map<Eigen::MatrixXcf> eCmn(Cmn[p],m,n);
556 if (std::abs(beta) != 0.0)
557 eCmn = beta * eCmn + alpha * eAmk * eBkn ;
559 eCmn = alpha * eAmk * eBkn ;
563 Eigen::Map<Eigen::MatrixXcf> eAmk(Amk[p],k,m);
564 Eigen::Map<Eigen::MatrixXcf> eBkn(Bkn[p],k,n);
565 Eigen::Map<Eigen::MatrixXcf> eCmn(Cmn[p],m,n);
566 if (std::abs(beta) != 0.0)
567 eCmn = beta * eCmn + alpha * eAmk.adjoint() * eBkn ;
569 eCmn = alpha * eAmk.adjoint() * eBkn ;
573 Eigen::Map<Eigen::MatrixXcf> eAmk(Amk[p],k,m);
574 Eigen::Map<Eigen::MatrixXcf> eBkn(Bkn[p],k,n);
575 Eigen::Map<Eigen::MatrixXcf> eCmn(Cmn[p],m,n);
576 if (std::abs(beta) != 0.0)
577 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn ;
579 eCmn = alpha * eAmk.transpose() * eBkn ;
583 Eigen::Map<Eigen::MatrixXcf> eAmk(Amk[p],m,k);
584 Eigen::Map<Eigen::MatrixXcf> eBkn(Bkn[p],n,k);
585 Eigen::Map<Eigen::MatrixXcf> eCmn(Cmn[p],m,n);
586 if (std::abs(beta) != 0.0)
587 eCmn = beta * eCmn + alpha * eAmk * eBkn.adjoint() ;
589 eCmn = alpha * eAmk * eBkn.adjoint() ;
593 Eigen::Map<Eigen::MatrixXcf> eAmk(Amk[p],m,k);
594 Eigen::Map<Eigen::MatrixXcf> eBkn(Bkn[p],n,k);
595 Eigen::Map<Eigen::MatrixXcf> eCmn(Cmn[p],m,n);
596 if (std::abs(beta) != 0.0)
597 eCmn = beta * eCmn + alpha * eAmk * eBkn.transpose() ;
599 eCmn = alpha * eAmk * eBkn.transpose() ;
603 Eigen::Map<Eigen::MatrixXcf> eAmk(Amk[p],k,m);
604 Eigen::Map<Eigen::MatrixXcf> eBkn(Bkn[p],n,k);
605 Eigen::Map<Eigen::MatrixXcf> eCmn(Cmn[p],m,n);
606 if (std::abs(beta) != 0.0)
607 eCmn = beta * eCmn + alpha * eAmk.adjoint() * eBkn.adjoint() ;
609 eCmn = alpha * eAmk.adjoint() * eBkn.adjoint() ;
613 Eigen::Map<Eigen::MatrixXcf> eAmk(Amk[p],k,m);
614 Eigen::Map<Eigen::MatrixXcf> eBkn(Bkn[p],n,k);
615 Eigen::Map<Eigen::MatrixXcf> eCmn(Cmn[p],m,n);
616 if (std::abs(beta) != 0.0)
617 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn.transpose() ;
619 eCmn = alpha * eAmk.transpose() * eBkn.transpose() ;
626 RealD flops = 8.0*m*n*k*batchCount;
644 int32_t batchCount = Amk.size();
663 assert(Bkn.size()==batchCount);
664 assert(Cmn.size()==batchCount);
666 hipblasOperation_t hOpA;
667 hipblasOperation_t hOpB;
678 (
float *) &alpha_p[0],
679 (
float **)&Amk[0], lda,
680 (
float **)&Bkn[0], ldb,
681 (
float *) &beta_p[0],
682 (
float **)&Cmn[0], ldc,
684 assert(err==HIPBLAS_STATUS_SUCCESS);
687 cublasOperation_t hOpA;
688 cublasOperation_t hOpB;
699 (
float *) &alpha_p[0],
700 (
float **)&Amk[0], lda,
701 (
float **)&Bkn[0], ldb,
702 (
float *) &beta_p[0],
703 (
float **)&Cmn[0], ldc,
705 assert(err==CUBLAS_STATUS_SUCCESS);
714 int64_t batchCount64=batchCount;
716 oneapi::mkl::transpose iOpA;
717 oneapi::mkl::transpose iOpB;
719 if ( OpA ==
GridBLAS_OP_N ) iOpA = oneapi::mkl::transpose::N;
720 if ( OpA ==
GridBLAS_OP_T ) iOpA = oneapi::mkl::transpose::T;
721 if ( OpA ==
GridBLAS_OP_C ) iOpA = oneapi::mkl::transpose::C;
722 if ( OpB ==
GridBLAS_OP_N ) iOpB = oneapi::mkl::transpose::N;
723 if ( OpB ==
GridBLAS_OP_T ) iOpB = oneapi::mkl::transpose::T;
724 if ( OpB ==
GridBLAS_OP_C ) iOpB = oneapi::mkl::transpose::C;
730 (
float *) &alpha_p[0],
731 (
const float **)&Amk[0], (
const int64_t *)&lda64,
732 (
const float **)&Bkn[0], (
const int64_t *)&ldb64,
733 (
float *) &beta_p[0],
734 (
float **)&Cmn[0], (
const int64_t *)&ldc64,
735 (int64_t)1,&batchCount64,std::vector<sycl::event>());
738#if !defined(GRID_SYCL) && !defined(GRID_CUDA) && !defined(GRID_HIP)
742 Eigen::Map<Eigen::MatrixXf> eAmk(Amk[p],m,k);
743 Eigen::Map<Eigen::MatrixXf> eBkn(Bkn[p],k,n);
744 Eigen::Map<Eigen::MatrixXf> eCmn(Cmn[p],m,n);
745 if (std::abs(beta) != 0.0)
746 eCmn = beta * eCmn + alpha * eAmk * eBkn ;
748 eCmn = alpha * eAmk * eBkn ;
752 Eigen::Map<Eigen::MatrixXf> eAmk(Amk[p],k,m);
753 Eigen::Map<Eigen::MatrixXf> eBkn(Bkn[p],k,n);
754 Eigen::Map<Eigen::MatrixXf> eCmn(Cmn[p],m,n);
755 if (std::abs(beta) != 0.0)
756 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn ;
758 eCmn = alpha * eAmk.transpose() * eBkn ;
762 Eigen::Map<Eigen::MatrixXf> eAmk(Amk[p],m,k);
763 Eigen::Map<Eigen::MatrixXf> eBkn(Bkn[p],n,k);
764 Eigen::Map<Eigen::MatrixXf> eCmn(Cmn[p],m,n);
765 if (std::abs(beta) != 0.0)
766 eCmn = beta * eCmn + alpha * eAmk * eBkn.transpose() ;
768 eCmn = alpha * eAmk * eBkn.transpose() ;
772 Eigen::Map<Eigen::MatrixXf> eAmk(Amk[p],k,m);
773 Eigen::Map<Eigen::MatrixXf> eBkn(Bkn[p],n,k);
774 Eigen::Map<Eigen::MatrixXf> eCmn(Cmn[p],m,n);
775 if (std::abs(beta) != 0.0)
776 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn.transpose() ;
778 eCmn = alpha * eAmk.transpose() * eBkn.transpose() ;
785 RealD flops = 2.0*m*n*k*batchCount;
786 RealD bytes = 1.0*
sizeof(
RealF)*(m*k+k*n+m*n)*batchCount;
803 int32_t batchCount = Amk.size();
823 assert(Bkn.size()==batchCount);
824 assert(Cmn.size()==batchCount);
826 hipblasOperation_t hOpA;
827 hipblasOperation_t hOpB;
838 (
double *) &alpha_p[0],
839 (
double **)&Amk[0], lda,
840 (
double **)&Bkn[0], ldb,
841 (
double *) &beta_p[0],
842 (
double **)&Cmn[0], ldc,
844 assert(err==HIPBLAS_STATUS_SUCCESS);
847 cublasOperation_t hOpA;
848 cublasOperation_t hOpB;
859 (
double *) &alpha_p[0],
860 (
double **)&Amk[0], lda,
861 (
double **)&Bkn[0], ldb,
862 (
double *) &beta_p[0],
863 (
double **)&Cmn[0], ldc,
865 assert(err==CUBLAS_STATUS_SUCCESS);
874 int64_t batchCount64=batchCount;
876 oneapi::mkl::transpose iOpA;
877 oneapi::mkl::transpose iOpB;
879 if ( OpA ==
GridBLAS_OP_N ) iOpA = oneapi::mkl::transpose::N;
880 if ( OpA ==
GridBLAS_OP_T ) iOpA = oneapi::mkl::transpose::T;
881 if ( OpA ==
GridBLAS_OP_C ) iOpA = oneapi::mkl::transpose::C;
882 if ( OpB ==
GridBLAS_OP_N ) iOpB = oneapi::mkl::transpose::N;
883 if ( OpB ==
GridBLAS_OP_T ) iOpB = oneapi::mkl::transpose::T;
884 if ( OpB ==
GridBLAS_OP_C ) iOpB = oneapi::mkl::transpose::C;
890 (
double *) &alpha_p[0],
891 (
const double **)&Amk[0], (
const int64_t *)&lda64,
892 (
const double **)&Bkn[0], (
const int64_t *)&ldb64,
893 (
double *) &beta_p[0],
894 (
double **)&Cmn[0], (
const int64_t *)&ldc64,
895 (int64_t)1,&batchCount64,std::vector<sycl::event>());
898#if !defined(GRID_SYCL) && !defined(GRID_CUDA) && !defined(GRID_HIP)
902 Eigen::Map<Eigen::MatrixXd> eAmk(Amk[p],m,k);
903 Eigen::Map<Eigen::MatrixXd> eBkn(Bkn[p],k,n);
904 Eigen::Map<Eigen::MatrixXd> eCmn(Cmn[p],m,n);
905 if (std::abs(beta) != 0.0)
906 eCmn = beta * eCmn + alpha * eAmk * eBkn ;
908 eCmn = alpha * eAmk * eBkn ;
912 Eigen::Map<Eigen::MatrixXd> eAmk(Amk[p],k,m);
913 Eigen::Map<Eigen::MatrixXd> eBkn(Bkn[p],k,n);
914 Eigen::Map<Eigen::MatrixXd> eCmn(Cmn[p],m,n);
915 if (std::abs(beta) != 0.0)
916 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn ;
918 eCmn = alpha * eAmk.transpose() * eBkn ;
922 Eigen::Map<Eigen::MatrixXd> eAmk(Amk[p],m,k);
923 Eigen::Map<Eigen::MatrixXd> eBkn(Bkn[p],n,k);
924 Eigen::Map<Eigen::MatrixXd> eCmn(Cmn[p],m,n);
925 if (std::abs(beta) != 0.0)
926 eCmn = beta * eCmn + alpha * eAmk * eBkn.transpose() ;
928 eCmn = alpha * eAmk * eBkn.transpose() ;
932 Eigen::Map<Eigen::MatrixXd> eAmk(Amk[p],k,m);
933 Eigen::Map<Eigen::MatrixXd> eBkn(Bkn[p],n,k);
934 Eigen::Map<Eigen::MatrixXd> eCmn(Cmn[p],m,n);
935 if (std::abs(beta) != 0.0)
936 eCmn = beta * eCmn + alpha * eAmk.transpose() * eBkn.transpose() ;
938 eCmn = alpha * eAmk.transpose() * eBkn.transpose() ;
945 RealD flops = 2.0*m*n*k*batchCount;
946 RealD bytes = 1.0*
sizeof(
RealD)*(m*k+k*n+m*n)*batchCount;