我正在通过从 C++ 接口调用该函数,通过 BLAS 中的 ZHEMV 计算埃尔米特(自伴随)矩阵乘以复数向量乘法。 我看到的问题是仅对奇数维度执行矩阵向量乘法时,从 Valgrind 收到“无效读取大小 8” 警告。
这是给我这样的警告的代码:
#include <iostream>
#include <vector>
#include <complex>
#include <cmath>
#include <cstdlib>
#include <cassert>
typedef std::complex<double> Complex;
typedef std::vector<Complex> cvector;
extern "C"
{
int zhemv_(const char &uplo, int *n, Complex *alpha, Complex *v, int *lda, Complex *x, int *incx, Complex *beta, Complex *w, int *incy);
}
int main()
{
int Dim;
int ld = 1;
Complex unit(1,0);
Complex zero(0,0);
std::cout<<"Read dimension:"<<std::endl;
std::cin>>Dim ;
std::vector<Complex> vec1(Dim,1);
std::vector<Complex> vec2(Dim,2);
std::vector<Complex> Ham(Dim*Dim,1.5);
zhemv_('U',&Dim,&unit,&Ham[0],&Dim,&vec1[0],&ld,&zero,&vec2[0],&ld);
}
我收到的警告如下:
==363614== 大小 8 的读取无效
==363614==在0x65316CF:zhemv_U_HASWELL(在/usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so中)
据我所知,我被卡住了,我想这可能与我在 zhemv 中插入
n
、lda
、incx
和 incy
整数的方式有关。我尝试了不同的方法,但我没有摆脱 Valgrind 的警告。另外,BLAS 文档目前似乎没有太大帮助。
此代码是我从一个较大的项目中提取的 MWE,并且是我在较大的程序中获得分段错误的可能原因。
“摆脱 Valgrind 的警告”
我希望您的目标是修复您的代码中的错误。如果您从无效内存中读取,则意味着您的代码具有未定义的行为。结果任何事情都可能发生,最有可能的是不正确的结果或崩溃。
阅读错误报告
您只发布了错误报告的前两行(代码中的错误来自哪里)。您没有发布 memcheck 提供的有关错误地址的信息。如果你能找出哪个变量出了问题,那么修复错误就会容易得多。如果您无法从日志中找出它是哪个变量,请使用
vgdb
。
检查zhemv_对齐要求
我认为这是问题最有可能的原因。例如,如果
zhemv_
期望复杂数组采用 32 字节对齐,而您以 16 字节对齐方式分配它们,那么偶数大小的数组就可以,但奇数大小的数组就不行。