2016-05-20 4 views
3

私は最近、非常に大きなスパース線形システムを解くために、Visual C++でEigenライブラリを使っています。プログラムはリリースモードでは本当に速く動作しますが、デバッグモードでは解決に数時間かかります。私はタイミングを辿ったが、プログラムはEigenの "解決"機能に長時間を要する。私は多くをデバッグする必要があるので、私はデバッグモードでプロジェクトを構築したいです。今、Eigen部分のデバッグ情報を生成しない方法がありますか?または、この問題の他の回避策がありますか?は、プロジェクトの特定の部分のデバッグ情報を生成しないための方法ですか?

+2

問題がデバッグ情報に接続されていないため、最適化設定です。 – teivaz

+0

@teivazが正しいです。 Eigenはオプティマイザがその仕事をしていることに頼りすぎているライブラリです。私がEigenを使うとき、私はいつも_RelWithDebInfo_モード(CMake + gcc、通常は '-O2 -g'を意味する)でビルドしますが、デバッグモードは通常' -O0'(最適化なし)を意味します。 – mindriot

+0

プログラムをSmart Way™でテストしてください。実行に1分足らずでよく選ばれた* small *データセットで99.9%のバグが見つかります。残りの0.1%のメモリと実行時間の制限を調べるリリースビルドを使用して時間ごとのシナリオをテストするだけです。あなたのプログラムが現時点でのように縮尺されておらず、縮尺を変えなければ、デバッグできないプログラムはあなたが出荷できるプログラムではありません。 –

答えて

6

デバッグ情報を無効にし、ファイルごとにコードの最適化を有効にすることができます。

Eigen関数を含むファイルをソリューションエクスプローラで右クリックし、[プロパティ]を選択します。

表示されるダイアログで、C/C++ - >最適化を選択し、リリースモードで使用しているのと同じオプションを選択します。

[C/C++ - >一般]を選択し、[デバッグ情報の形式]で[なし]を選択します。しかし、デバッグ情報の存在はおそらく実行速度に影響を与えません。

7

@ MichaelWalzの回答は素晴らしいですが、私はあなたの質問に私のコメントで概説したように、私は強くEigenのデバッグモードを使用しないことをお勧めします。

Eigenは非常に効率的ですが、非常に使いやすいマトリックスライブラリです。多くの抽象化レイヤーを使用して、多くの「テンプレートマジック」を通して効率を達成し、コンパイラーの最適化ステージに依存して、効率の高いコードを生成します。

デバッグモードは通常、コンパイラがデバッグシンボルを作成することを意味しますが、最適化も無効にします。 GCC/clangでは、通常-O0 -gに相当します。私はそれが/O0 /DEBUGに対応するVisual Studioを信じています。

代わりに、「release-with-debug-info」モードでEigenを使用するすべてのコードを作成することをお勧めします(CMakeはCMAKE_BUILD_TYPE=RelWithDebInfoと呼んでいます)。これは、デバッグシンボルを生成しながら、コンパイラが最適化できるようにすることを意味します。 GCC/clangでは、これは通常-O2 -gに相当します。私はVisual Studioでそれが/O2 /DEBUGに対応すると信じています。個人的に私はこのような非常に良い経験をしています。あなたが実際に完全に最適化を完全に無効にする必要があるのはごくまれな状況です。