首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SuperLu与LaPack的对比研究在用鲤鱼做基准测试时失败

SuperLu与LaPack的对比研究在用鲤鱼做基准测试时失败
EN

Stack Overflow用户
提问于 2017-05-26 19:58:12
回答 1查看 173关注 0票数 1

我想比较一下SuperLu稀疏求解器的速度和使用LaPack时使用spsolve()的密集版本的速度。因此,我编写了这个程序:

代码语言:javascript
复制
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <armadillo\armadillo>

#define SIZE 2500
#define ROUNDS 2500

int main()
{
    //Time measurement stuff
    LARGE_INTEGER frequency;
    LARGE_INTEGER t1, t2, t3, t4;
    QueryPerformanceFrequency(&frequency);
    //Other stuff
    arma::cx_colvec b = arma::randu<arma::cx_colvec>(SIZE);
    arma::cx_colvec b1 = b, b2 = b;
    arma::sp_cx_mat A = arma::sp_cx_mat(SIZE, SIZE);
    A.diag(-2).fill(-1);
    A.diag(-1).fill(16);
    A.diag(0).fill(-30);
    A.diag(1).fill(16);
    A.diag(2).fill(-1);


    arma::cx_colvec c = arma::zeros<arma::cx_colvec>(SIZE), d = arma::zeros<arma::cx_colvec>(SIZE); 
    QueryPerformanceCounter(&t1);
    for (size_t i = 0; i < ROUNDS; i++)
    {
        if(arma::spsolve(c, A, b1, "superlu") == false)
        {
            std::cout << "Error in round 1\n";
            break;
        }
        b1 = c;
    }
    QueryPerformanceCounter(&t2);
    QueryPerformanceCounter(&t3);
    for (size_t i = 0; i < ROUNDS; i++)
    {
        if(arma::spsolve(d, A, b2, "lapack") == false)
        {
            std::cout << "Error in round 2\n";
            break;
        }
        b2 = d;
    }
    QueryPerformanceCounter(&t4);
    std::cout << "Superlu took " << (t2.QuadPart - t1.QuadPart)*1000.0 / frequency.QuadPart << '\n';
    std::cout << "Lapack took " << (t4.QuadPart - t3.QuadPart)*1000.0 / frequency.QuadPart << '\n';
    std::cout << "Both results are equal: " << arma::approx_equal(b1, b2, "abstol", 1e-5) << '\n';
    return 0;
}

现在,对于SIZEROUND的小值,函数approx_equal返回true,但对于较大的值,根据approx_equal,结果b1b2不再相等。为什么?问题是我的超级图书馆不能正常工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-28 09:57:24

我不怪SuperLU库。这里的“问题”似乎是矩阵A的最小特征值变得越来越小,而SIZE的值却越来越大。现在,for循环重复地将inv(A)应用于给定的向量。由于你开始的向量是随机的,它将有一些与最小特征值相对应的A特征向量的非零“混合”。如果多次重复反演,该分量就会明显放大,从而使矢量b1/b2的各个分量变得很大。

例如,对于SIZE=2000ROUNDS=2,我得到解决方案的最大组件(绝对值)在10^9附近。因此,您的测试似乎对10^-5有绝对的容忍度。然而,对于如此大的数字,这将意味着14个重要数字必须完全匹配,这几乎是在双重精度的极限。在我看来,考虑到这里比较的数字的性质,测试更有意义,例如approx_equal(b1, b2, "reldiff", 1E-8)的相对误差。

另外,我们应该检查解决方案实际上是否有意义--对于大量的ROUNDS来说,它迟早会溢出。例如,对于SIZE=2000ROUNDS=80,我在b1/b2向量中得到无穷大.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44209297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档