0

私は現在、レガシー C コード (SPICE バリアント) を組み込んだパフォーマンス クリティカルなアプリケーションに取り組んでいます。

問題は次のとおりです。

従来の C コードの作成者は、引数の受け渡しの使用が現代の大きな悪の 1 つであることを明らかに信じていました。したがって、すべての変数の約 90% がグローバルに宣言されました。

レガシ コードは、シミュレーションのために繰り返し呼び出す必要があり、このコード セクションへの同時呼び出しにスレッドを使用すると、全体の実行時間に有利になる可能性があります。

私のアイデアは、レガシー コードの複数のオブジェクトを作成して、多くのミューテックス ロックの必要性を排除できるように、レガシー C コード (g++ コンパイル用に既にわずかに変更しています) をカプセル化することでした。明らかに、グローバル変数はメンバー変数としてカプセル化されます。

これにより、別の問題がテーブルにもたらされました。従来のコーダーは、グローバル変数の初期化も信じていませんでした。おそらく、C はグローバル変数を 0 に初期化する傾向があるためです。ただし、C++ メンバー変数は、同じ処理を取得するために継ぎ目はありません。従来の C コードを正しく動作させるには、いくつかの変数を 0 に初期化する必要があります。しかし、膨大な量のグローバル変数が使用されているため、これらの変数を見つけることは非常に難しいことがわかっています。

レガシ C コードを大幅に変更する時間はありません。

私の質問は次のとおりです。

  1. C コードのカプセル化は、約 90 個のミューテックス ロックを使用するよりも高速であるという仮定は正しいですか?

  2. 初期化されていないメンバー変数の使用を見つける簡単な方法はありますか? (私が理解しているように、gccは自動変数に対してのみこれを行うことができます)。重要な変数のみを初期化できるようにするには?

  3. 質問 2 ではない場合 ... 通常のコンストラクターの init メソッドを使用せずに、すべてのメンバー変数を初期化する高速でクリーンな方法はありますか?

  4. または(ロングショット)自分自身を渡す引数を組み込むことができるように、プログラムフローに従う高速な方法はありますか?

どんな助けでも大歓迎です。注意

4

3 に答える 3

3
  1. はい。ポインタを渡すオブジェクトに状態を入れることができれば、実際にスレッドを使用すると仮定すると、ロックするよりも高速になります。
  2. いいえ、ユニット化されたメンバー変数を見つけるのは簡単ではありません。基本的に、それにはコード全体の分析を実行する必要がありますが、これは通常は実行できません (ライブラリの存在により)。
  3. すべてのデータを古いスタイルの構造体 (つまり、メソッドもアクセス宣言もなし) に入れる場合、構造体全体を memset() してゼロにすることができます。これにより、グローバル変数が初期化されるのと同じ方法で初期化が行われます (C はゼロに初期化することを保証します)。
  4. すぐに「自動」を意味する場合、答えはおそらく「いいえ」です。
于 2009-10-03T09:19:22.660 に答える
1

複数のスレッドを使用する場合は、スレッド間で共有されるデータを削除またはロックする必要があります。古い非スレッド セーフ コードを再入可能にすると、多くの作業と多くのデバッグが必要になります。レガシー コードを掘り下げる時間があまりない場合は、試しません。あなたはワームの巨大な缶を開けています。

  • -fno-common を使用すると、g++ でグローバルの初期値を 0 にすることができます。gcc のマニュアルを参照してください。

  • 複数のスレッドではなく、複数のプロセスを使用するという提案を追求する方がはるかに優れていると思います。各プロセスには独自のアドレス空間があり、レガシー コードに手を加える必要はありません。プロセスレベルで問題を分解する方法を見つける方法を見つけるのは非常に難しいと思います. (たとえば、すべての呼び出しに対して行うのではなく、問題の論理的に独立したチャンクに対して大きな処理を行います。たとえば、一度に 1000 回路のバッチなどです。)

  • 最適化する前に、そもそもなぜ遅いのかを真剣に考えてください。既存のシリアル コードを並列化することは、利益が限られる可能性があるため、非常に困難な作業です。それがあなたがやりたいことだと確信していますか。

よろしく、マット

于 2009-10-03T22:42:01.603 に答える
0

oo-spiceを作るのではなく、フォークを使うことを考えたことはありますか?コードにほとんど変更を加える必要がないように思われます。非常に小さなモデルを大量に分析しようとしない限り、パフォーマンスの点でそれほどコストがかからない可能性があります。

于 2009-10-03T10:52:03.877 に答える