質問

大規模なVC ++プロジェクトのコンパイル時間を最適化しようとしています。 私のプロセッサはCorei7 950です(Intelハイパースレッディングテクノロジーをサポートしているため、4コア、8スレッド)。

Microsoft Visual Studio 2010では、 [ツール]> [オプション]> [プロジェクトとソリューション]> [VC ++プロジェクト設定]> [最大同時C ++コンパイル]

並列C ++コンパイルに使用するCPUコアの最大数を選択できます。 そこで0を選択すると(すべてのコアが使用されるように)、4または8を使用した場合とまったく同じ結果が得られます。

プロジェクトのコンパイル中にタスクマネージャーを開くと、4つの並列コンパイルスレッドが実行されていることがわかります(プロセスの下には、Microsoft C / C ++コンパイラドライバーの説明があります)。CPU使用率の合計は常に50%未満です。

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

クアッドコアのハイパースレッドプロセッサに8つの並列コンパイルスレッドを含めることは可能ですか?これが不可能な場合、コンパイル中にプロセッサパワーをほぼ100%使用することは可能ですか?

これにより、時間を大幅に節約できます。

よろしくお願いします

ニコラス

役に立ちましたか?

解決

これにより、時間を大幅に節約できます。

いいえ、そうではありません。ハイパースレッディングは、CPU内の補完的なリソースを使用するさまざまな種類のタスクを実行する場合に役立ちます。たとえば、一方のスレッドは多くの浮動小数点を使用し、もう一方は使用しません。 1つ目は浮動小数点演算を実行していますが、残りのCPUは他のスレッドで使用できます。

明らかな理由で、多数のコンパイルスレッドが同じ内部CPUリソースを必要としています。達成できるのは、CPUキャッシュとリソースをめぐって2倍のスレッドが競合することだけです。キャッシュの競合が増えると、寿命は遅くなりますが、速くはなりません。


さて、上記は、ハイパースレッディングと同種のコードから大きな利益が得られない理由を説明しています。並列作成の一般通念は、ジョブの数をコアの数より1つ多く設定することです。これは、1 / NプロセスがおそらくディスクI / Oを実行していることを前提としています。もちろん、これは、ジョブが実際のコンパイルに加えて多くのメイクファイル処理を行うUnixmakeの場合です。

ノブを8まで回しても、タスクマネージャーで報告されたCPU使用率に変化が見られなかった場合(上記の理由でスループットがマイナスに変化した可能性があることに注意してください)、ソリューションの相互依存性が強制されていることが原因である可能性があります順次実行する特定のコンパイルタスク。あるタスクが別のタスクの出力に依存している場合(プリコンパイル済みヘッダーが原因であることが多い)、同時ジョブの数が制限されます-16コアシステムを使用している場合でも、プロジェクト構造で許可されている以上の並列処理は得られません。

他のヒント

CPUが制限されているのではなくディスクが制限されている可能性があります。

これはVisualStudioの問題だと思います。並列nmakeクローンを「jom」してmakefileを実行してみてください。4コアでコンパイルするために呼び出されたmsvcを使用すると、35%の増加が見られるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top