Использование меньшего количества матриц с BLAS

Я совершенно новичок в BLAS (использую OpenBLAS с C ++ и VisualStudio)

Я знаю, что Dgemm выполняет С <- альфа * оп (A) * оп (B) + бета * C

Я пытался сохранить некоторые выделения, выполнив это: В <- 1 * оп (A) * оп (B) + 0 * B

Другими словами, поместив результат в матрицу 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**

0

Решение

BLAS документация по функциям dgemm утверждает, что только параметр матрицы C предназначен как для ввода, так и для вывода, и перезаписывается результатом операции. Поскольку B определяется только для ввода, реализации BLAS могут предполагать, что его не следует изменять.

Установка B и C на один и тот же указатель данных может инициировать некоторую проверку ошибок в используемой реализации, возвращая обнуленный результат, чтобы показать это.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]