在 C++ 中调用 zhemv blas 函数时,Valgrind 发出“无效读取大小 8”警告

问题描述 投票:0回答:1

我正在通过从 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,并且是我在较大的程序中获得分段错误的可能原因。

c++ segmentation-fault valgrind blas
1个回答
0
投票

“摆脱 Valgrind 的警告”

我希望您的目标是修复您的代码中的错误。如果您从无效内存中读取,则意味着您的代码具有未定义的行为。结果任何事情都可能发生,最有可能的是不正确的结果或崩溃。

阅读错误报告

您只发布了错误报告的前两行(代码中的错误来自哪里)。您没有发布 memcheck 提供的有关错误地址的信息。如果你能找出哪个变量出了问题,那么修复错误就会容易得多。如果您无法从日志中找出它是哪个变量,请使用

vgdb

检查zhemv_对齐要求

我认为这是问题最有可能的原因。例如,如果

zhemv_
期望复杂数组采用 32 字节对齐,而您以 16 字节对齐方式分配它们,那么偶数大小的数组就可以,但奇数大小的数组就不行。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.