Я делаю матричное / векторное произведение с помощью этого простого кода:
#include "mkl.h"#include <stdio.h>
int main(){
const int M = 2;
const int N = 3;
double *x = new double[N];
double *A = new double[M*N];
double *b = new double[M];
for (int i = 0; i < M; i++){
b[i] = 0.0; //Not necessary but anyway...
for (int j = 0; j < N; j++){
A[j * M + i] = i + j * 2;
}
}
for (int j = 0; j < N; j++)
x[j] = j*j;
const int incr = 1;
const double alpha = 1.0;
const double beta = 0.0;
const char no = 'N';
dgemv(&no, &M, &N, &alpha, A, &M, x, &incr, &beta, b, &incr );
printf("b = [%e %e]'\n",b[0],b[1]);
delete[] x;
delete[] A;
delete[] b;
}
Хотя отображаемый результат соответствует ожидаемому ([18, 23]), Intel Inspector находит его неверный доступ к памяти и 2 неверный частичный доступ к памяти при вызове dgemv. неверный доступ к памяти и один неверный частичный доступ к памяти относятся к памяти, выделенной в соответствии с вектором b. Второй неверный частичный доступ к памяти связано с памятью, выделенной для A. Я не получаю никакой ошибки, если я использую статический массив.
Это также происходит с другими функциями MKL, такими как dgesv или когда я пытаюсь использовать cblas_dgemv. Я использую Intel Inspector XE 2016 и Intel C ++ Compiler 16.0 с последовательным MKL.
Является ли мой вызов dgemv неправильным, или это ложный положительный результат. Кто-нибудь испытал это?
Спасибо
РЕДАКТИРОВАТЬ:
По предложению Джоша Милторпа: ошибка появляется только для небольших массивов, вероятно, из-за того, что MKL пытается получить доступ к памяти большими кусками для эффективности.
Я сделал несколько тестов, и M должно быть не менее 20, чтобы не получить ошибку. N может быть любым положительным числом. Я предполагаю, что это не ошибка, и MKL просто обращается к памяти за пределами выделенного пространства для матрицы, но не изменяет и не использует ее в действительности.
Задача ещё не решена.
Других решений пока нет …