在 BLAS 中使用更少的矩阵
Using less matrices with BLAS
我对 BLAS 很陌生(将 OpenBLAS 与 C++ 和 VisualStudio 结合使用)
我知道 dgemm 执行 C <- alpha * op(A) * op(B) + beta * C
我这样做是为了节省一些分配:B <- 1 * op(A) * op(B) + 0 * B
也就是说,将结果放在B矩阵中,
BUT 使 beta = 0 并在 [=25] 的位置重复 B =]C,结果为零。
有没有办法改正?
我使用的代码:
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 function documentation表示只有C矩阵参数同时为输入输出,被运算结果覆盖。由于 B 仅为输入定义,BLAS 实现可以假定不应修改它。
将 B 和 C 设置为相同的数据指针可能会触发对您正在使用的实现进行一些错误验证,返回归零结果以表明这一点。
我对 BLAS 很陌生(将 OpenBLAS 与 C++ 和 VisualStudio 结合使用)
我知道 dgemm 执行 C <- alpha * op(A) * op(B) + beta * C
我这样做是为了节省一些分配:B <- 1 * op(A) * op(B) + 0 * B
也就是说,将结果放在B矩阵中,
BUT 使 beta = 0 并在 [=25] 的位置重复 B =]C,结果为零。
有没有办法改正?
我使用的代码:
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 function documentation表示只有C矩阵参数同时为输入输出,被运算结果覆盖。由于 B 仅为输入定义,BLAS 实现可以假定不应修改它。
将 B 和 C 设置为相同的数据指针可能会触发对您正在使用的实现进行一些错误验证,返回归零结果以表明这一点。