Weitere (einfache) BLAS Funktionen aufbohren

Analog zum Kopieren von Matrizen sollen folgende low-level BLAS Funktionen in hpc/ulmblas/ angepasst werden:

Dabei soll wieder berücksichtigt werden, ob die Matrix zeilen- oder spaltenweise im Speicher liegt. Natürlich sollte auch berücksichtigt werden, dass in bestimmten Spezialfällen keine Operation durchgeführt werden muss.

Beim Testen sollen wieder verschiedene Datentypen für A, B und alpha verwendet werden. Dabei kann folgende Vorlage benutzt werden:

#include <cstdio>
#include <hpc/ulmblas/geaxpy.h>
#include <hpc/ulmblas/gecopy.h>
#include <hpc/ulmblas/gescal.h>

template <typename T, typename Func>
void
geinit(long m, long n, T *A, long incRowA, long incColA, Func func)
{
    for (long i=0; i<m; ++i) {
        for (long j=0; j<n; ++j) {
            A[i*incRowA+j*incColA] = func(m, n, i, j);
        }
    }
}

void
print_value(float x)
{
    printf(" %6.1f", x);
}

void
print_value(double x)
{
    printf(" %6.1lf", x);
}

template <typename T>
void
geprint(long m, long n, const T *A, long incRowA, long incColA)
{
    for (long i=0; i<m; ++i) {
        for (long j=0; j<n; ++j) {
            print_value(A[i*incRowA+j*incColA]);
        }
        printf("\n");
    }
}

int
main()
{
    // Element type for A, B and alpha
    typedef float   TA;
    typedef double  TB;
    typedef double  Alpha;

    // Dimensions of A and B 
    long m       = 7;
    long n       = 8;

    // Storage order of A
    long incRowA = 1;
    long incColA = m;

    // Storage order of B
    long incRowB = n;
    long incColB = 1;

    // Allocate A and B
    TA *A = new TA[m*n];
    TB *B = new TB[m*n];

    // Value for alpha
    Alpha alpha = 1.5;
    printf("alpha =\n");
    geprint(1, 1, &alpha, 1, 1);

    // Initialize A
    auto fooInit = [](long m, long n, long i, long j) -> long
                   {
                       return m*j+i+1;
                   };
    geinit(m, n, A, incRowA, incColA, fooInit);

    // Print A
    printf("A = \n");
    geprint(m, n, A, incRowA, incColA);

    // Copy A to B
    hpc::ulmblas::gecopy(m, n, A, incRowA, incColA, B, incRowB, incColB);
    printf("B = \n");
    geprint(m, n, B, incRowB, incColB);

    //  B <- alpha*B
    printf("B <- alpha*B\n");
    printf("B = \n");
    hpc::ulmblas::gescal(m, n, alpha, B, incRowB, incColB);
    geprint(m, n, B, incRowB, incColB);

    //  B <- alpha*A + B
    printf("B <- alpha*A +B\n");
    printf("B = \n");
    hpc::ulmblas::geaxpy(m, n, alpha, A, incRowA, incColA, B, incRowB, incColB);
    geprint(m, n, B, incRowB, incColB);
}