当使用VS 2017编译程序并将Optimization设置为/ O2

时间:2018-01-29 03:38:54

标签: c++ visual-studio-2017 eigen eigen3

我正在使用 VS 2017专业版编译涉及 Eigen 3.3.4 的C ++命令行程序。

这是我的计划:

#include "stdafx.h"
#include <iostream>
#include "Eigen/Dense"
#include <Eigen/Sparse>
#include <Eigen/Eigenvalues>
#include <vector>



using namespace std;
using namespace Eigen;
using Eigen::Dynamic;
using Eigen::Matrix;
using Eigen::SparseMatrix;

typedef SparseMatrix<double, Eigen::RowMajor> SpMat;

int main()
{
    try
    {
        MatrixXd mat(8, 8);

        mat << 7, 0, 1, 0, 0, 2, 7, 0,
            0, 4, 8, 0, 2, 0, 0, 0,
            1, 8, 1, 0, 0, 0, 0, 5,
            0, 0, 0, 7, 0, 0, 9, 0,
            0, 2, 0, 0, 5, 1, 5, 0,
            2, 0, 0, 0, 1, 1, 0, 5,
            7, 0, 0, 9, 5, 0, 11, 0,
            0, 0, 5, 0, 0, 5, 0, 5;

        cout << mat << endl;

        Eigen::LLT<Eigen::MatrixXd> lltOfA(mat);
        cout << lltOfA.info() << endl;

        SpMat sparseMat = mat.sparseView();

        cout << "try SimplicialLLT solver" << endl;
        SimplicialLLT<SpMat, Eigen::Upper> lltSolver;
        lltSolver.compute(sparseMat);
        cout << lltSolver.info() << endl;

    }
    catch (const exception& e)
    {
        cout << e.what() << endl;
    }

    return 0;
}

这是我的链接器选项:

  

/ OUT:“D:\ TestProjects \ LLTSolver \ x64 \ Release \ LLTSolver.exe”/ MANIFEST   / LTCG / NXCOMPAT   /PDB:"D:\TestProjects\LLTSolver\x64\Release\LLTSolver.pdb”   / DYNAMICBASE“kernel32.lib”“user32.lib”“gdi32.lib”“winspool.lib”   “comdlg32.lib”“advapi32.lib”“shell32.lib”“ole32.lib”“oleaut32.lib”   “uuid.lib”“odbc32.lib”“odbccp32.lib”/ DEBUG / MACHINE:X64 / OPT:REF   /增量:NO   /PGD:"D:\TestProjects\LLTSolver\x64\Release\LLTSolver.pgd”   / SUBSYSTEM:CONSOLE / MANIFESTUAC:“level ='asInvoker'uiAccess ='false'”   /ManifestFile:"x64\Release\LLTSolver.exe.intermediate.manifest”   / OPT:ICF / ERRORREPORT:PROMPT / NOLOGO / TLBID:1

这是我的编译选项:

  

/ Yu“stdafx.h”/ GS / GL / W3 / Gy / Zc:wchar_t / Zi / Gm- / O2 / sdl   /Fd"x64\Release\vc110.pdb“/ D”WIN32“/ D”_CONSOLE“/ D”_UNICODE“/ D   “UNICODE”/ errorReport:prompt / WX- / Zc:forScope / Gd / Oi / MD   / Fa“x64 \ Release \”/ EHa / nologo / Fo“x64 \ Release \”   /Fp"x64\Release\LLTSolver.pch“

以下是我的发现:

  1. 如果我使用Release标志编译它,并且没有优化(/Od),那么程序可以正常工作。当我在命令行中运行程序时,可以生成输出
  2. 如果我使用Release标志进行编译,并使用优化(/O1O/2),则程序将崩溃,并且会以 甚至catch语句都不能捕获异常
  3. 崩溃导致的唯一迹象是事件查看器:

    Faulting module name: LLTSolver.exe, version: 0.0.0.0, time stamp: 0x5a6e9440
    Exception code: 0xc0000005
    Fault offset: 0x000000000000d4b4
    Faulting process id: 0x5004
    Faulting application start time: 0x01d398b0e99f62f4
    

    当我在没有NDEBUG宏(gcc等效于-DNDEBUG)的情况下编译时,我会收到以下消息,有时;其他一些时候,根本没有错误信息。

    Assertion failed: (m_outerIndex[outer+1]-m_outerIndex[outer]==0 || m_data.index(m_data.size()-1)<inner) && "Invalid ordered insertion (invalid inner index)",
    

    在档案

      

    .. \ eigen \ src / SparseCore / SparseMatrix.h,第393行

    不太确定VS编译器优化是否应该受到指责,或者是否存在Eigen 3.3.4中的错误。我该如何进一步处理这个问题?

0 个答案:

没有答案