並列アプリケーションのデータの読み取り/書き込みの最適化

同カテゴリーの次の記事

金融向けサービス

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Optimization of Data Read/Write in a Parallel Application」の日本語参考訳です。


(これは、筆者がインテル社でインターンシップをしていたときに取り組んでいたプロジェクトです。)

並列アプリケーションで入力データをファイルから読み取って初期化したり、出力データをファイルに書き込む場合、これらのデータの読み取り/書き込みが最適化されていないと、マルチコア環境で動作するマルチスレッド・アプリケーションのパフォーマンスが制限される可能性があります。このようなファイル I/O のボトルネックは、データ並列アプリケーションにより簡単に解決できます。データ並列アプリケーションとは、スレッド間でデータを分配し、互いに共有または通信することなく、同時に処理できるアプリケーションです。

ここでは、ブラック・ショールズの例 (PARSEC ベンチマーク・スイートに含まれるデータ並列アプリケーション) について考えてみます。データの読み取り/書き込みの最適化により、マルチスレッド・アプリケーションのスケーラビリティーを大幅に向上する方法を紹介します。

ブラック・ショールズは、ブラック・ショールズの偏微分方程式を用いて、オプション・ポートフォリオの価格を計算します。アプリケーションの入力値は、行ごとに 1 つのオプションの詳細データが含まれるファイルです。例では、250 万件のオプションからなる入力データセットを使用しました。初期化フェーズで、アプリケーションは 1 つのスレッドでファイルからオプションデータを 1 行ずつ読み取り、データ構造を初期化します。その後、複数のスレッドによってすべてのオプションの価格を並列に計算し、最後に 1 スレッドで各オプションの価格を出力ファイルに 1 行ずつシリアルに書き込みます。以下の図は、80 論理コアのシステムにおいて異なるスレッド数でアプリケーションを実行した際のパフォーマンス・スケーリングです (パフォーマンス・スケーリング: 1 スレッドで実行したアプリケーションの実行時間/x スレッドで実行したアプリケーションの実行時間)。

1: 最適化前のブラック・ショールズ・アプリケーションのパフォーマンス・スケーリング

上記の図から、スレッド数を 16 以上にしても、パフォーマンスが向上していないことが分かります。

以下の MPSTAT データは、80 スレッドでアプリケーションを実行した際の CPU 負荷 を示しています。

2: CPU 負荷を示す MPSTAT データ

上記の図から、80 スレッドでアプリケーションを実行した際、全体の実行時間の 65% がファイルからオプションデータを読み取って初期化するシリアル処理に費やされ、25% が結果をファイルへ書き込むシリアル処理に費やされていることが分かります。15 スレッドを超えると、アプリケーションのシリアル領域の処理時間が並列領域の処理時間を上回るため、パフォーマンス・スケーリングは 15 スレッドで頭打ちになります。これは、アムダールの法則の典型的な例です。(アムダールの法則: プログラムのシリアル領域により、並列アプリケーションのパフォーマンスの向上が制限されます。) アプリケーションのシリアル領域を最適化しない限り、スレッド数/CPU コア数を増やしてもパフォーマンスは向上しません。

それでは、パフォーマンス・スケーリングを向上させるため、アプリケーションのデータの読み取り/書き込みを最適化する 1 つのアプローチについて見てみましょう。

データの初期化の最適化:

アプリケーションの初期化フェーズで、ファイルから 1 行ずつオプションデータを読み取る代わりに、ファイル全体をまとめてインメモリー・バッファーに読み込み、1 スレッドでバッファーをトークン化して各オプションデータへのポインターを作成します。続くデータ構造へのオプションデータの読み取りと初期化は、スレッド間でオプション・データ・ポインターを分配することで並列化できます。これで、複数のスレッドが同時にオプションデータを読み取り、価格計算処理を行えます。

データの書き込みの最適化: 

 複数のスレッドでオプションデータを並列に処理した後、1 スレッドで結果を出力ファイルに 1 行ずつ書き込む代わりに、複数のスレッドで同時に結果を共有出力バッファーの対応する場所へ書き込みます。そして、すべての並列スレッドがバッファーへの書き込みを終了したら、1 スレッドでバッファー全体をまとめて出力ファイルに書き込みます。

以下の図は、これらの最適化を実装したブラック・ショールズ・アプリケーションと最適化前のアプリケーションのパフォーマンス・スケーリングの比較です。

 3: 最適化したブラック・ショールズ・アプリケーションのパフォーマンス・スケーリング

データの読み取り/書き込みを最適化する上記のアプローチにより、アプリケーションが 5 倍も高速になりました。つまり、シリアル領域を最適化することで、並列アプリケーション全体のパフォーマンスを向上させることができます。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事