Content |
Using CXXBLAS
FLENS matrix/vector types make iteraction with BLAS easy as you have access to
-
matrix/vector dimensions,
-
storage order,
-
leading dimensions and strides and
-
data pointers.
In addition CXXBLAS makes it easy to reuse the same code for different element types like float, double, std::complex<float>, std::complex<double> or any other type that “can be used like a double”, i.e. relevant operators (e.g. +, *, ...) are overloaded.
Toy Example
Assume you want to compute \(y = \beta y + \alpha\,A^T x + z\) where \(\alpha, \beta\) are scalars, \(x, y, z\) are (dense) vectors and \(A\) is a (general) matrix (with full storage).
Using CXXBLAS for this task you will first call gemv and subsequently axpy.
Example Code
#include <flens/flens.cxx>
using namespace flens;
using namespace std;
int
main()
{
typedef double T;
typedef DenseVector<Array<T> > DEVector;
typedef GeMatrix<FullStorage<T, ColMajor> > GEMatrix;
const T alpha = 1.5,
beta = 2.5;
DEVector x(3), y(3), z(3);
x = 1, 2, 3;
y = 2, 3, 4;
z = 3, 4, 5;
GEMatrix A(3,3);
A = 1, 2, 3,
5, 6, 7,
5, 4, 3;
cxxblas::gemv(A.numRows(), A.numCols(),
alpha,
true, false, A.data(), A.strideRow(), A.strideCol(),
x.data(), x.stride(),
beta,
y.data(), y.stride());
cxxblas::axpy(y.length(), T(1), z.data(), z.stride(), y.data(), y.stride());
cout << "y = " << y << endl;
return 0;
}
Comments on Example Code
Compute \(y = \beta y + \alpha A^T x\)
alpha,
true, false, A.data(), A.strideRow(), A.strideCol(),
x.data(), x.stride(),
beta,
y.data(), y.stride());
Compute the update \(y = y + z\)
Compile and Run
$shell> cd flens/examples $shell> g++ -Wall -std=c++11 -I../.. tut02-page01-example.cc $shell> ./a.out y = 47 50.5 54