Changeset 9
- Timestamp:
- 03/14/07 10:27:52 (2 years ago)
- Files:
-
- 9 modified
-
ChangeLog (modified) (1 diff)
-
Makefile (modified) (2 diffs)
-
README (modified) (1 diff)
-
include/fflas-ffpack/fflas.h (modified) (13 diffs)
-
include/fflas-ffpack/fflas_fgemm.inl (modified) (4 diffs)
-
include/fflas-ffpack/fflas_fgemv.inl (modified) (1 diff)
-
include/fflas-ffpack/fflas_ftrmm.inl (modified) (8 diffs)
-
include/fflas-ffpack/fflas_ftrsm.inl (modified) (4 diffs)
-
tests/test-invert.C (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r4 r9 1 2007-03-13 v1.1.2 2 * change the genericity system for trsm to detect Field 3 implementations over double (compatibility with LinBox) 1 4 2007-03-11 v1.1.1 2 5 * complete preconditioning phase for the new Charpoly algorithm -
Makefile
r4 r9 1 VERSION=1.1. 11 VERSION=1.1.2 2 2 3 3 FFLAS_FFPACK_DIR=/home/pernet/Logiciels/fflas-ffpack … … 22 22 linbox: 23 23 24 cp ${FFLAS_FFPACK_DIR}/include/fflas-ffpack/{fflas.h,fflas_fgemm.inl,fflas_fgemv.inl,fflas_ftrsm.inl,fflas_ftrsv.inl,fflas_ftrmm.inl,fflas_fdot.inl,fflas_fcopy.inl,fflas_faxpy.inl,fflas_fger.inl } ${LINBOX_DIR}/linbox/fflas/24 cp ${FFLAS_FFPACK_DIR}/include/fflas-ffpack/{fflas.h,fflas_fgemm.inl,fflas_fgemv.inl,fflas_ftrsm.inl,fflas_ftrsv.inl,fflas_ftrmm.inl,fflas_fdot.inl,fflas_fcopy.inl,fflas_faxpy.inl,fflas_fger.inl,fflas_bounds.inl} ${LINBOX_DIR}/linbox/fflas/ 25 25 cp ${FFLAS_FFPACK_DIR}/include/fflas-ffpack/{ffpack.h,ffpack_charpoly.inl,ffpack_frobenius.inl,ffpack_ludivine.inl,ffpack_minpoly.inl,ffpack_krylovelim.inl,ffpack_charpoly_danilevski.inl,ffpack_charpoly_kglu.inl,ffpack_charpoly_kgfast.inl,ffpack_charpoly_kgfastgeneralized.inl} ${LINBOX_DIR}/linbox/ffpack/ 26 26 -
README
r4 r9 1 1 ****** FFLAS-FFPACK : Finite Field Linear Algebra Subroutines/Package ****** 2 2 3 Version 1.1. 13 Version 1.1.2 4 4 5 5 PURPOSE: -
include/fflas-ffpack/fflas.h
r6 r9 390 390 const typename Field::Element beta, 391 391 typename Field::Element * Y, const size_t incY); 392 template<class Field>393 static void MatVectProd_gen (const Field& F,394 const enum FFLAS_TRANSPOSE TransA,395 const size_t M, const size_t N,396 const typename Field::Element alpha,397 const typename Field::Element * A, const size_t lda,398 const typename Field::Element * X, const size_t incX,399 const typename Field::Element beta,400 typename Field::Element * Y, const size_t incY);401 template<class Field>402 static void MatVectProd_dbl (const Field& F,403 const enum FFLAS_TRANSPOSE TransA,404 const size_t M, const size_t N,405 const double alpha,406 const double * A, const size_t lda,407 const double * X, const size_t incX,408 const double beta,409 double * Y, const size_t incY);410 411 template<class Field>412 static typename Field::Element* fsquare_gen (const Field& F,413 const enum FFLAS_TRANSPOSE ta,414 const size_t n,415 const typename Field::Element alpha,416 const typename Field::Element* A,417 const size_t lda,418 const typename Field::Element beta,419 typename Field::Element* C,420 const size_t ldc);421 template<class Field>422 static double* fsquare_dbl (const Field& F,423 const enum FFLAS_TRANSPOSE ta,424 const size_t n,425 const double alpha,426 const double* A,427 const size_t lda,428 const double beta,429 double* C,430 const size_t ldc);431 392 432 393 template <class Field> … … 441 402 typename Field::Element * C, const size_t ldc, 442 403 const size_t kmax ); 443 template <class Field>444 static void ClassicMatmul_gen (const Field& F,445 const enum FFLAS_TRANSPOSE ta,446 const enum FFLAS_TRANSPOSE tb,447 const size_t m, const size_t n, const size_t k,448 const typename Field::Element alpha,449 const typename Field::Element * A, const size_t lda,450 const typename Field::Element * B, const size_t ldb,451 const typename Field::Element beta,452 typename Field::Element * C, const size_t ldc,453 const size_t kmax );454 455 template <class Field>456 static void ClassicMatmul_dbl (const Field& F,457 const enum FFLAS_TRANSPOSE ta,458 const enum FFLAS_TRANSPOSE tb,459 const size_t m, const size_t n, const size_t k,460 const double alpha,461 const double * A, const size_t lda,462 const double * B, const size_t ldb,463 const double beta,464 double * C, const size_t ldc,465 const size_t kmax );466 404 467 405 // Winograd Multiplication alpha.A(n*k) * B(k*m) + beta . C(n*m) … … 490 428 typename Field::Element * C, const size_t ldc, 491 429 const size_t kmax, const size_t w); 492 template<class Field> 493 static void WinoMain_gen (const Field& F, 494 const enum FFLAS_TRANSPOSE ta, 495 const enum FFLAS_TRANSPOSE tb, 496 const size_t m, const size_t n, const size_t k, 497 const typename Field::Element alpha, 498 const typename Field::Element* A,const size_t lda, 499 const typename Field::Element* B,const size_t ldb, 500 const typename Field::Element beta, 501 typename Field::Element * C, const size_t ldc, 502 const size_t kmax, const size_t w); 503 504 template<class Field> 505 static void WinoMain_dbl (const Field& F, 506 const enum FFLAS_TRANSPOSE ta, 507 const enum FFLAS_TRANSPOSE tb, 508 const size_t m, const size_t n, const size_t k, 509 const double alpha, 510 const double* A,const size_t lda, 511 const double* B,const size_t ldb, 512 const double beta, 513 double * C, const size_t ldc, 514 const size_t kmax, const size_t w); 515 430 template<bool AreEq> 431 class callWinoMain; 432 433 template<bool AreEq> 434 class callClassicMatmul; 435 436 template<bool AreEq> 437 class callFsquare; 438 439 template<bool AreEq> 440 class callMatVectProd; 441 516 442 // Specialized routines for ftrsm 517 443 template<class Field> … … 536 462 typename Field::Element * B, const size_t ldb, 537 463 const size_t nmax); 538 template<class Field> 539 static void ftrsmLeftLowNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag, 540 const size_t M, const size_t N, 541 const double alpha, 542 double * A, const size_t lda, 543 double * B, const size_t ldb, 544 const size_t nmax); 545 template<class Field> 546 static void ftrsmLeftLowNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag, 547 const size_t M, const size_t N, 548 const typename Field::Element alpha, 549 typename Field::Element * A, const size_t lda, 550 typename Field::Element * B, const size_t ldb, 551 const size_t nmax); 464 template<bool AreEq> 465 class callFtrsmLeftLowNoTrans; 466 467 template<bool AreEq> 468 class callFtrsmRightUpNoTrans; 469 470 template<bool AreEq> 471 class callFtrmmLeftUpNoTrans; 472 473 template<bool AreEq> 474 class callFtrmmLeftUpTrans; 475 476 template<bool AreEq> 477 class callFtrmmLeftLowNoTrans; 478 479 template<bool AreEq> 480 class callFtrmmLeftLowTrans; 481 482 template<bool AreEq> 483 class callFtrmmRightUpNoTrans; 484 485 template<bool AreEq> 486 class callFtrmmRightUpTrans; 487 488 template<bool AreEq> 489 class callFtrmmRightLowNoTrans; 490 491 template<bool AreEq> 492 class callFtrmmRightLowTrans; 493 552 494 template<class Field> 553 495 static void ftrsmLeftLowTrans (const Field& F, const enum FFLAS_DIAG Diag, … … 564 506 typename Field::Element * B, const size_t ldb, 565 507 const size_t nmax); 566 template<class Field> 567 static void ftrsmRightUpNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag, 568 const size_t M, const size_t N, 569 const double alpha, 570 double * A, const size_t lda, 571 double * B, const size_t ldb, 572 const size_t nmax); 573 template<class Field> 574 static void ftrsmRightUpNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag, 575 const size_t M, const size_t N, 576 const typename Field::Element alpha, 577 typename Field::Element * A, const size_t lda, 578 typename Field::Element * B, const size_t ldb, 579 const size_t nmax); 580 508 581 509 template<class Field> 582 510 static void ftrsmRightUpTrans (const Field& F, const enum FFLAS_DIAG Diag, … … 607 535 typename Field::Element * B, const size_t ldb, 608 536 const size_t nmax); 609 template<class Field>610 static void ftrmmLeftUpNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,611 const size_t M, const size_t N,612 const typename Field::Element * A, const size_t lda,613 typename Field::Element * B, const size_t ldb,614 const size_t nmax);615 template<class Field>616 static void ftrmmLeftUpNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,617 const size_t M, const size_t N,618 const double * A, const size_t lda,619 double * B, const size_t ldb,620 const size_t nmax);621 537 622 538 template<class Field> … … 626 542 typename Field::Element * B, const size_t ldb, 627 543 const size_t nmax); 628 template<class Field>629 static void ftrmmLeftUpTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,630 const size_t M, const size_t N,631 const typename Field::Element * A, const size_t lda,632 typename Field::Element * B, const size_t ldb,633 const size_t nmax);634 template<class Field>635 static void ftrmmLeftUpTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,636 const size_t M, const size_t N,637 const double * A, const size_t lda,638 double * B, const size_t ldb,639 const size_t nmax);640 544 641 545 template<class Field> … … 645 549 typename Field::Element * B, const size_t ldb, 646 550 const size_t nmax); 647 template<class Field>648 static void ftrmmLeftLowNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,649 const size_t M, const size_t N,650 const typename Field::Element * A, const size_t lda,651 typename Field::Element * B, const size_t ldb,652 const size_t nmax);653 template<class Field>654 static void ftrmmLeftLowNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,655 const size_t M, const size_t N,656 const double * A, const size_t lda,657 double * B, const size_t ldb,658 const size_t nmax);659 551 660 552 template<class Field> … … 664 556 typename Field::Element * B, const size_t ldb, 665 557 const size_t nmax); 666 template<class Field>667 static void ftrmmLeftLowTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,668 const size_t M, const size_t N,669 const typename Field::Element * A, const size_t lda,670 typename Field::Element * B, const size_t ldb,671 const size_t nmax);672 template<class Field>673 static void ftrmmLeftLowTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,674 const size_t M, const size_t N,675 const double * A, const size_t lda,676 double * B, const size_t ldb,677 const size_t nmax);678 558 679 559 template<class Field> … … 683 563 typename Field::Element * B, const size_t ldb, 684 564 const size_t nmax); 685 template<class Field>686 static void ftrmmRightUpNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,687 const size_t M, const size_t N,688 const typename Field::Element * A, const size_t lda,689 typename Field::Element * B, const size_t ldb,690 const size_t nmax);691 template<class Field>692 static void ftrmmRightUpNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,693 const size_t M, const size_t N,694 const double * A, const size_t lda,695 double * B, const size_t ldb,696 const size_t nmax);697 565 698 566 template<class Field> … … 702 570 typename Field::Element * B, const size_t ldb, 703 571 const size_t nmax); 704 template<class Field>705 static void ftrmmRightUpTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,706 const size_t M, const size_t N,707 const typename Field::Element * A, const size_t lda,708 typename Field::Element * B, const size_t ldb,709 const size_t nmax);710 template<class Field>711 static void ftrmmRightUpTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,712 const size_t M, const size_t N,713 const double * A, const size_t lda,714 double * B, const size_t ldb,715 const size_t nmax);716 572 717 573 template<class Field> … … 722 578 const size_t nmax); 723 579 template<class Field> 724 static void ftrmmRightLowNoTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,725 const size_t M, const size_t N,726 const typename Field::Element * A, const size_t lda,727 typename Field::Element * B, const size_t ldb,728 const size_t nmax);729 template<class Field>730 static void ftrmmRightLowNoTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,731 const size_t M, const size_t N,732 const double * A, const size_t lda,733 double * B, const size_t ldb,734 const size_t nmax);735 736 template<class Field>737 580 static void ftrmmRightLowTrans (const Field& F, const enum FFLAS_DIAG Diag, 738 581 const size_t M, const size_t N, … … 740 583 typename Field::Element * B, const size_t ldb, 741 584 const size_t nmax); 742 template<class Field>743 static void ftrmmRightLowTrans_gen (const Field& F, const enum FFLAS_DIAG Diag,744 const size_t M, const size_t N,745 const typename Field::Element * A, const size_t lda,746 typename Field::Element * B, const size_t ldb,747 const size_t nmax);748 template<class Field>749 static void ftrmmRightLowTrans_dbl (const Field& F, const enum FFLAS_DIAG Diag,750 const size_t M, const size_t N,751 const double * A, const size_t lda,752 double * B, const size_t ldb,753 const size_t nmax);754 585 }; // class FFLAS 755 586 -
include/fflas-ffpack/fflas_fgemm.inl
r1 r9 55 55 const size_t kmax) 56 56 { 57 if (AreEqual<typename Field::Element,double>::value) 58 ClassicMatmul_dbl (F,ta,tb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc,kmax); 59 else 60 ClassicMatmul_gen (F,ta,tb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc,kmax); 57 callClassicMatmul<AreEqual<typename Field::Element,double>::value> (F,ta,tb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc,kmax); 61 58 } 62 59 63 template < class Field > 64 void FFLAS::ClassicMatmul_gen (const Field& F, 65 const enum FFLAS_TRANSPOSE ta, 66 const enum FFLAS_TRANSPOSE tb, 67 const size_t m, const size_t n,const size_t k, 68 const typename Field::Element alpha, 69 const typename Field::Element * A, const size_t lda, 70 const typename Field::Element * B, const size_t ldb, 71 const typename Field::Element beta, 72 typename Field::Element* C, const size_t ldc, 73 const size_t kmax) 74 { 75 static typename Field::Element Mone; 76 static typename Field::Element one; 77 static typename Field::Element zero; 78 F.init(one, 1.0); 79 F.neg(Mone, one); 80 F.init(zero, 0.0); 81 typename Field::Element tmp; 82 DoubleDomain::Element alphad, betad; 83 size_t k2 = MIN(k,kmax-1); // Size of the blocks 84 85 if (k2 > 1) { 86 DoubleDomain::Element * Add = new DoubleDomain::Element[m*k2]; 87 DoubleDomain::Element * Bdd = new DoubleDomain::Element[k2*n]; 88 DoubleDomain::Element * Cd = new DoubleDomain::Element[m*n]; 89 60 template<> 61 class FFLAS::callClassicMatmul<false>{ 62 public: 63 template < class Field > 64 void operator() (const Field& F, 65 const enum FFLAS_TRANSPOSE ta, 66 const enum FFLAS_TRANSPOSE tb, 67 const size_t m, const size_t n,const size_t k, 68 const typename Field::Element alpha, 69 const typename Field::Element * A, const size_t lda, 70 const typename Field::Element * B, const size_t ldb, 71 const typename Field::Element beta, 72 typename Field::Element* C, const size_t ldc, 73 const size_t kmax) { 74 static typename Field::Element Mone; 75 static typename Field::Element one; 76 static typename Field::Element zero; 77 F.init(one, 1.0); 78 F.neg(Mone, one); 79 F.init(zero, 0.0); 80 typename Field::Element tmp; 81 DoubleDomain::Element alphad, betad; 82 size_t k2 = MIN(k,kmax-1); // Size of the blocks 83 84 if (k2 > 1) { 85 DoubleDomain::Element * Add = new DoubleDomain::Element[m*k2]; 86 DoubleDomain::Element * Bdd = new DoubleDomain::Element[k2*n]; 87 DoubleDomain::Element * Cd = new DoubleDomain::Element[m*n]; 88 89 size_t nblock = k / (kmax-1); 90 size_t remblock = k % (kmax-1); 91 if (!remblock) { 92 remblock = kmax - 1 ; 93 --nblock; 94 } 95 if (F.areEqual (Mone, beta)) 96 betad = -1.0; 97 else 98 F.convert (betad, beta); 99 100 if (F.areEqual (Mone, alpha)) 101 alphad = -1.0; 102 else { 103 alphad = 1.0; 104 if (! F.areEqual (one, alpha)) { 105 // Compute y = A*x + beta/alpha.y 106 // and after y *= alpha 107 F.div (tmp, beta, alpha); 108 F.convert (betad, tmp); 109 } 110 } 111 112 size_t dlda, dldb; 113 if (!F.isZero(beta)) 114 MatF2MatD (F, Cd, n, C, ldc, m, n); 115 116 if (ta == FflasTrans) { 117 dlda = m; 118 MatF2MatD (F, Add, dlda, A+k2*nblock*lda, lda, remblock, m); 119 } else { 120 dlda = k2; 121 MatF2MatD (F, Add, dlda, A+k2*nblock, lda, m, remblock); 122 } 123 if (tb == FflasTrans) { 124 dldb = k2; 125 MatF2MatD (F, Bdd, k2, B+k2*nblock, ldb, n, remblock); 126 } else { 127 dldb = n; 128 MatF2MatD (F, Bdd, dldb, B+k2*nblock*ldb, ldb, remblock, n); 129 } 130 131 ClassicMatmul (DoubleDomain(), ta, tb, m, n, remblock, alphad, Add, dlda, 132 Bdd, dldb, betad, Cd, n, kmax); 133 MatD2MatF (F, C, ldc, Cd, n, m, n); 134 MatF2MatD (F, Cd, n, C, ldc, m, n); 135 136 for (size_t i = 0; i < nblock; ++i) { 137 if (ta == FflasTrans) { 138 dlda = m; 139 MatF2MatD (F, Add, dlda, A+k2*i*lda, lda, k2, m); 140 } else { 141 dlda = k2; 142 MatF2MatD (F, Add, dlda, A+k2*i, lda, m, k2); 143 } 144 if (tb == FflasTrans) { 145 dldb = k2; 146 MatF2MatD (F, Bdd, dldb, B+k2*i, ldb, n, k2); 147 } 148 else { 149 dldb = n; 150 MatF2MatD (F, Bdd, dldb, B+k2*i*ldb, ldb, k2, n); 151 } 152 ClassicMatmul (DoubleDomain(), ta, tb, m, n, k2, alphad, Add, dlda, 153 Bdd, dldb, 1.0, Cd, n, kmax); 154 MatD2MatF (F, C, ldc, Cd, n, m, n); 155 MatF2MatD (F, Cd, n, C, ldc, m, n);
