=============== High-Level BLAS [TOC] =============== Für folgende Funktionen im Namensraum `hpc::matvec` sollen High-Level BLAS-Wrapper implementiert werden: - `i = iamax(x)` zum Bestimmen des betragsgrößten Elements, - `swap(x, y)` zum Vertauschen von Vektoren, - `scal(alpha, x)` zum Skalieren von Vektoren und - `r(alpha, x, y, A)` für die Rang-1 Operation $A \leftarrow \alpha x\,y^T$. Am Beispiel von `scal` soll gezeigt werden, wie dabei die Funktionalität lediglich an die low-level Implementierung in `hpc::ulmblas` weitergereicht wird: ==== CODE (type=cc) ============================================================ #ifndef HPC_MATVEC_SCAL_H #define HPC_MATVEC_SCAL_H 1 #include #include #include #include #include #include namespace hpc { namespace matvec { template typename std::enable_if::value, void>::type scal(const Alpha &alpha, MA &A) { typedef typename MA::Index Index; const Index m = A.numRows; const Index n = A.numCols; ulmblas::gescal(m, n, alpha, A.data, A.incRow, A.incCol); } template typename std::enable_if::value, void>::type scal(const Alpha &alpha, VX &x) { ulmblas::scal(x.length, alpha, x.data, x.inc); } } } // namespace matvec, hpc #endif // HPC_MATVEC_SCAL_H ================================================================================ Aufgabe ======= Implementiert die restlichen BLAS-Funktionen. Zum Testen könnt Ihr folgendes Programm benutzen: ==== CODE (type=cc) ============================================================ #include #include #include #include #include #include #include #include #include // // Random initializer for general matrices: real and complex valued // template void randomInit(Index m, Index n, T *A, Index incRowA, Index incColA) { std::random_device random; std::default_random_engine mt(random()); std::uniform_real_distribution uniform(-100,100); for (Index i=0; i typename std::enable_if::value, void>::type randomInit(VX &x) { typedef typename VX::Index Index; randomInit(x.length, Index(1), x.data, x.inc, Index(1)); } template typename std::enable_if::value, void>::type randomInit(MA &A) { randomInit(A.numRows, A.numCols, A.data, A.incRow, A.incCol); } //------------------------------------------------------------------------------ int main() { using namespace hpc::matvec; typedef double T; typedef std::size_t Index; GeMatrix A(8,10); auto x = A.row(2); auto y = x(3, 7); auto z = y(0, 4, 2); randomInit(A); print(A, "A"); print(x, "x"); print(y, "y"); print(z, "z"); printf("iamax(x) = %ld\n", iamax(x)); printf("iamax(y) = %ld\n", iamax(y)); printf("iamax(z) = %ld\n", iamax(z)); scal(2.5, y); auto x1 = x(0,5); auto x2 = x(5,5); swap(x1, x2); print(A, "A"); print(x, "x"); print(y, "y"); print(z, "z"); auto a10 = A.col(0)(1,7); auto a01 = A.row(0)(1,9); auto A11 = A(1,1,7,9); print(a01, "a01"); print(a10, "a10"); print(A11, "A11"); r(1.5, a10, a01, A11); print(A, "A"); } ================================================================================ :navigate: up -> doc:index next -> doc:session19/page06 back -> doc:session19/page04