使用较少的矩阵与BLAS

Using less matrices with BLAS

本文关键字:BLAS      更新时间:2023-10-16

我对BLAS很陌生(使用OpenBLAS与c++和VisualStudio)

我知道dgemm执行C <- alpha * op(A) * op(B) + beta * C

我试图节省一些分配这样做:B <- 1 * op(A) * op(B) + 0 * B

换句话说,把结果放到B矩阵中,

BUTbeta = 0并在C位置重复B,结果为0。

有办法让它正确吗?

我正在使用的代码:

double* A = new double [3*3]; //3 rows x 3 columns
A[0] = 8;
A[1] = 3;
A[2] = 4;
A[3] = 1;
A[4] = 5;
A[5] = 9;
A[6] = 6;
A[7] = 7;
A[8] = 2;
double* v = new double[3]; //3 rows x 1 column
v[0] = 3;
v[1] = 5;
v[2] = 2;
double* foo = new double[3]; //3 rows x 1 column
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
    3, 1, 3,
    1,
    A, 3,
    v, 3,
    0,
    foo, 3); // makes foo = [41 ; 48 ; 61], **right**
cblas_dgemm(CblasColMajor, CblasTrans, CblasTrans,
    3, 1, 3,
    1,
    A, 3,
    v, 3,
    0,
    v, 3); // makes v = [0 ; 0 ; 0], **wrong**

BLAS dgemm函数文档说明,只有C矩阵参数同时用于输入和输出,并被操作结果覆盖。由于B只是为输入定义的,因此BLAS实现可以假设它不应该被修改。

将B和C设置为相同的数据指针可能会触发对您正在使用的实现的某些错误验证,返回归零结果以指示