7

デュアルxeonチップを搭載したマシンで実行されているCアプリ(VStudio 2010、win7 64ビット)があります。これは、12個の物理コアと24個の論理コア、および192ギガのRAMを意味します。編集:OSはwin7(つまり、Windows 7、64ビット)です。

アプリには24個のスレッドがあり(各スレッドには独自の論理コアがあります)、計算を実行し、大規模なC構造の異なる部分を埋めます。すべてのスレッドが終了したとき(およびスレッドがすべて完全にバランスが取れているため、同時に完了するとき)の構造は、約60ギガバイトです。

(ハードウェアのセットアップを制御できるので、RAID 0を実行する6台の2TBドライブを使用します。つまり、書き込みの物理的な制限は、平均シーケンシャル書き込み速度の約6倍、つまり約2ギガ/秒になります。)

これをディスクに保存する最も効率的な方法は何ですか?明らかに、i/o時間は計算時間を小さくします。このトピックに関する私の調査から、(fwrite()ではなく)write()が進むべき道のようです。しかし、バッファサイズの設定などに関して、ソフトウェア側で他にどのような最適化を行うことができますか?mmapの方が効率的でしょうか?

4

2 に答える 2

8

mmap()、またはブーストmmapは、ほとんどの場合、最良のアプローチです。OSはあなたよりも賢いので、何をキャッシュするか心配しましょう!

あなたはどのOSかは言いませんでしたが、Linuxではmadviseまたは同等のブーストヒントが実際にパフォーマンスを向上させることができます。

于 2011-12-09T19:01:24.817 に答える
6

あなたの状況に最適なものを判断するのは難しいです。

最初に行う最適化は、ファイルを事前に割り当てることです。そうすれば、ファイルシステムはそのサイズを拡張し続ける必要がありません。これにより、一部のディスク操作が最適化されます。ただし、実際のゼロをディスクに書き込むことは避けてください。長さを設定するだけです。

次に、mmapとwriteのどちらかを選択できます。これは、使用しているオペレーティングシステムによっても異なります。Unixでは、mmapとpwriteの両方を試します。pwriteは、各スレッドがファイルオフセットを争うことなく、目的のファイル位置でファイルに書き込むことができるので便利です。

コピーをファイルキャッシュに作成する代わりに、スレッドがファイルキャッシュに直接書き込むため、mmapが適している可能性があります。60 GBはおそらくファイル全体をmmapするには大きすぎるため、各スレッドはファイル上で移動できる独自のmmapウィンドウを必要とする可能性があります。

Windowsでは、オーバーラップした非同期IOを使用してみてください。これは、Win32API呼び出しでのみ実行できます。

于 2011-12-09T19:06:28.167 に答える