6

私はHigh Performance Computingこのフォーラムに初めて参加し、長い間読者であったこのフォーラムでの最初の質問です。

基本的に、たとえば非常に大きな配列で算術演算を行う必要があります

double variable [9][4][300][300][300] (uninitialized)

ケース 1:上記の配列を then として宣言すると、 " " のようlocal/automaticに最適化せずにコンパイルした場合、実行時エラーが発生します (エラーはセグメンテーション違反です -- スタック オーバーフロー???)g++ file.cpp

ケース 2:上記と同じケースで、最適化を使用してコンパイルした場合、コードは期待どおりに実行されます。"g++ -O2 file.cpp」(今はarray入ってbssいますか???)

ケース 3:変数を作成すると、正常にglobal/staticコンパイルされますが、実行されずkilled、端末にメッセージ " " が表示されて終了します。

実際の問題はありませんが、非常に大きな配列が宣言されたときに何が起こるか、データ型に応じてメモリ内のどこに存在するかを知りたいと思っています。

また、malloc または new を使用して実行時にこれらの配列を生成する方法についても認識しています。もちろん、それはヒープ上にあります。

したがって、私にとって最も重要な質問は、 --> でコンパイルしg++て実行するときに大きな配列を処理する最も効率的な方法 (つまり、メモリ内の配列の計算中の最小の実行時間) ですlinux clusters

お読みいただきありがとうございます。

4

2 に答える 2

7

最適化フラグに関係なく、ローカル変数は常にスタック上にあります。そして、その配列は約 7 ギガバイトになります! 可能なスタックよりもはるかに大きい。

グローバル/静的変数として配置した場合、プログラムをロードできるようにするには、7 GB 以上の空きメモリまたは連続した仮想メモリが必要になるため、サイズも起動しない理由になる可能性があります。

于 2013-04-04T05:43:30.983 に答える
3

次の行に沿って何かを提案できますか:

typedef double slice[300][300][300];

std::vector<slice> variable[9] = { 4, 4, 4, 4, 4, 4, 4, 4, 4 };

このようにして、4 つのsliceオブジェクトの各ベクトルが動的に割り当てられ、9 つのベクトルの内容が互いに連続している必要はなく、スタックの消費は 9 つのベクトルのメタデータに対してのみ十分です。

于 2013-04-04T06:09:03.503 に答える