MKL dgemv - 动态分配的数组的内存访问无效

时间:2016-10-28 11:00:41

标签: c++ blas intel-mkl intel-inspector

我用这个简单的代码做了一个blas矩阵/向量产品:

#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]),但在调用dgemv时,Intel Inspector会发现一个无效的内存访问和2 无效的部分内存访问无效内存访问和一个无效部分内存访问与分配给向量b的内存相关。第二个无效的部分内存访问与为A分配的内存有关。如果我使用静态数组,则不会出现任何错误。

其他MKL函数也会发生这种情况,例如dgesv或当我尝试使用cblas_dgemv时。我使用Intel Inspector XE 2016和intel C ++ Compiler 16.0和MKL顺序。

我的dgemv呼叫是错误的,还是误报。有谁经历过这个?

由于

编辑:

正如Josh Milthorpe所建议的那样:错误只出现在小型阵列上,可能是因为MKL试图以大块的形式访问内存以提高效率。

我做了几次测试,为了不出错,M需要至少20次。 N可以是任何正数。我想这不是一个错误,MKL只是访问矩阵分配空间之外的内存,但不会改变或真正使用它。

0 个答案:

没有答案