来自 BLAS 的“ddot”的错误结果

计算科学 C 拉帕克 布拉斯
2021-12-07 23:13:10

我在使用 BLAS 例程的 C/C++ 程序时遇到问题ddot我正在运行 Linux,到目前为止 LAPACK 例程工作没有任何问题。

无论我选择int整数参数的类型ddot还是选择ptrdiff_t.

该代码是:

#include <iostream>
#include <stdlib.h>
using namespace std;

extern "C" {
    extern int ddot_( int*, double* , int* , double* ,int*); 
    // OR extern int ddot_( ptrdiff_t*, double* , ptrdiff_t* , double* ,ptrdiff_t*);
}

int main() {
    int n=3; // OR ptrdiff_t  n=3;
    int inc=1; // OR ptrdiff_t inc=1;
    double result=0;

    double *x = (double*) calloc (n, sizeof (double));
    double *y = (double*) calloc (n, sizeof (double));

    result = ddot_(&n, x, &inc, y, &inc);
    cout<<result<<endl;
    return 0;
}

如果我选择ninc成为类型,int一切都会编译,但我得到的输出result等于4. x不同数字的相同效果y

我试图用谷歌搜索我的问题,发现 和 的类型n可能inc会导致错误的结果,我应该尝试ptrdiff_tor mwSignedIndexmwSignedIndex到目前为止,我还没有设法将其包含在我的程序中,但是如果我选择ninc成为类型ptrdiff_t并在开始时更改“extern C”部分,我也会得到4结果。

我错过了什么吗?我的数学错了吗?我感谢任何帮助或建议!

编辑:在以前版本的问题中,我没有设法正确使用ptrdiff_t. 尽管如此,错误的结果仍然存在。

1个回答

您的代码中奇怪的事情ddot_被声明为extern C int,而它实际上是一个double-valued 函数。并将其值分配给一个double变量result这些转换可能是导致您的问题的原因(我不完全确定它是如何编译并传递-Wall编译器标志的——我希望您正在使用一个)。

n并且s 应该没问题,除非您没有在特定架构上使用专门配置的 BLAS 版本做一些非常具体的事情incint