1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
#include <flens/flens.cxx>
#include <thread>
#include <iostream>

using namespace flens;
using namespace std;

void
mm(const GeMatrix<FullStorage<double> > *A,
   const GeMatrix<FullStorageView<double, ColMajor> > *B,
   GeMatrix<FullStorageView<double, ColMajor> > *C)
{
    blas::mm(NoTrans, NoTrans, 1.0, *A, *B, 0.0, *C);
}

int
main()
{
    const int m = 4000;
    const int k = 4000;
    const int n = 4000;

    GeMatrix<FullStorage<double> > A(m, k), B(k,n), C(m,n);

    const Underscore<int>  _;

    fillRandom(A);
    fillRandom(B);

    auto C_1 = C(_, _(    1, n/2));
    auto C_2 = C(_, _(n/2+1,   n));

    const auto B_1 = B(_, _(    1, n/2));
    const auto B_2 = B(_, _(n/2+1,   n));

#   ifndef USE_THREADS
    C = A*B;
#   else

    auto p0 = std::thread( [&]{ C_1 = A*B_1; });
    auto p1 = std::thread( [&]{ C_2 = A*B_2; });

    p0.join();
    p1.join();
#   endif

    cout << "asum(A*B) = " << blas::asum(C) << endl;
}