4

数値シミュレーションを実行するプログラムを FORTRAN から C++ に翻訳しています。

800MB のサイズの 2 倍の大きな行列を処理する必要があります。これ

double M[100][100][100][100];

スタックがそれほど大きくないため、セグメンテーション エラーが発生します。配列を割り当てたり、割り当てを解除したりするために 4 つの for ループが必要なため、new、delete を使用するのは厄介です。

std::array はスタックにあるので良くありません。std::vector は良い選択なので、

最初の質問 std::vector は、高速シミュレーションまたは

vector<vector<vector<vector<int,100>,100>,100>,100> 

無駄で重いデータをたくさん運ぶでしょうか?

2番目の質問 私が使用できる他のデータ構造を知っていますか? たぶんブーストから何かがあるでしょう。

今のところ、私は単にこのソリューションを使用しています:

double * M = new double [100000000];

必要なエントリに手動でアクセスしています。他にパフォーマンスの高いソリューションが見つからない場合は、この最後のメソッドを自動的に管理するクラスを作成します。

3 番目の質問それによってパフォーマンスが大幅に低下すると思いますか?

4

5 に答える 5

0

スタック上で何かを使用すると、明らかにはるかに効率的です。プロセスメモリはOS(スタック+ヒープ)によって制限されており、ほとんどの場合、プロセスに割り当てられたメモリを超える可能性があるという問題があります。

メモリの制限を解決するには、stxxlをご覧になることをお勧めします。これは、ほとんどの STL コンテナーとアルゴリズムを実装するライブラリですが、必要に応じて外部メモリを使用します。もちろん、これはパフォーマンスを低下させます...

于 2016-09-17T13:19:48.187 に答える
-1

その質問の答えはかなり意見に基づいていると思います。「良い」という概念は、データ構造の使用法に厳密に依存します。

とにかく、実行時間中に要素の数が変化せず、問題が実質的にメモリアクセスである場合、私の意見では、最良の解決策は連続したブロックの配列です。

T* data = new T[SIZE];通常、そのような場合、アクセスを正しく処理するクラスにカプセル化された単純なものを選択します。

ポインターを使用すると、メモリ制御について少し快適に感じることができますが、実際には astd::vector<T>は実質的に同じです。


あなたが質問で提供した知識から私が言えることはそれだけです。とにかく、私がさらに提案できることは、データの使用にも注意を払うことです.

例: アプリケーションのパフォーマンスを最大化するには、キャッシュを活用してミスを回避します。したがって、データに「アクセスパターン」があるかどうか、またはマルチスレッドコンテキストを考えて問題をスケーリングできるかどうかを理解しようとすることができます。


結論として、私の意見では、一般的に連続したベクトルがdouble最良の選択です。それはあなたの質問に答えます。しかし、パフォーマンスを重視する場合は、キャッシュプロセッサ メカニズム(マルチスレッドなど) を最大限に活用する方法を検討する必要があります。

于 2016-09-17T12:53:52.403 に答える