//using namespace LinBox; int main () { using namespace std; typedef FLTTYPE Field ; Field F(17); typedef Field::Element Element ; size_t n=768, nmax=5000, prec=512, nbest=0, count=0; TTimer chrono; bool bound=false; Field::RandIter G(F); Element *A,*B,*C; A = FFLAS::fflas_new<Element>(nmax*nmax); B = FFLAS::fflas_new<Element>(nmax*nmax); C = FFLAS::fflas_new<Element>(nmax*nmax); for (size_t i=0; i<nmax*nmax;++i) G.random(A[i]); for (size_t i=0; i<nmax*nmax;++i) G.random(B[i]); for (size_t i=0; i<nmax*nmax;++i) G.random(C[i]); std::ofstream outlog; outlog.open("optim.log", std::ofstream::out | std::ofstream::app); #ifdef __FFLASFFPACK_HAVE_CXX11 std::time_t result = std::time(NULL); outlog << std::endl << "---------------------------------------------------------------------" << std::endl << std::asctime(std::localtime(&result)); #endif outlog << std::endl << "Threshold for finite field Strassen-Winograd matrix multiplication" ; F.write(outlog << "(using ") << ')' << std::endl; do { double basetime, time; FFLAS::MMHelper<Field, FFLAS::MMHelperAlgo::Winograd> ClassicH(F,0, FFLAS::ParSeqHelper::Sequential()); FFLAS::MMHelper<Field, FFLAS::MMHelperAlgo::Winograd> WinogradH(F,1, FFLAS::ParSeqHelper::Sequential()); int iter=3; //warm up computation FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n, F.mOne, A, n, B, n, F.one, C, n, ClassicH); chrono.start(); for (int i=0;i<iter;i++) FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n, F.mOne, A, n, B, n, F.one, C, n, ClassicH); chrono.stop(); std::cout << std::endl << "fgemm " << n << "x" << n << ": " << chrono.realtime()/iter << " s, " << GFLOPS << " Gffops" << std::endl; outlog << std::endl << "fgemm " << n << "x" << n << ": " << chrono.realtime()/iter << " s, " << GFLOPS << " Gffops" << std::endl; basetime= chrono.realtime(); //warm up FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n, F.mOne, A, n, B, n, F.one, C, n, WinogradH); chrono.clear(); chrono.start(); for (int i=0; i<iter; i++) FFLAS::fgemm(F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, n, n, n, F.mOne, A, n, B,n, F.one, C, n, WinogradH); chrono.stop(); std::cout << "1Wino " << n << "x" << n << ": " << chrono.realtime()/iter << " s, " << GFLOPS << " Gffops" << std::endl; outlog << "1Wino " << n << "x" << n << ": " << chrono.realtime()/iter << " s, " << GFLOPS << " Gffops" << std::endl; time= chrono.realtime(); if (basetime > time ){ count++; if (count > 1){ nbest=n; bound=true; prec=prec>>1; n-=prec; } }