インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

キャッシュ効率と帯域幅

キャッシュ効率は、シリアルプログラムでも重要ですが、マルチコアマシンで実行する並列プログラムではさらに重要になります。 コアがバス帯域幅を競うことで、メモリーとプロセッサー間のデータの転送速度が制限されます。 そのため、並列プログラムの設計と実装では、キャッシュ効率、データと空間の局所性について考慮する必要があります。「シリアルプログラムの最適化」で紹介した matrixmatrix_multiply の例は、これらの問題を考慮しています。

帯域幅の問題は、システムのそれぞれのコアでシリアルプログラムのコピーを 1 つずつ同時に実行することで、簡単に見つけることができます。 この平均実行時間が、そのプログラムの 1 つのコピーの実行時間よりもはるかに長い場合、プログラムによりシステムの帯域幅が飽和している可能性があります。 これは、メモリー帯域幅の制限、またはディスクやネットワークの I/O 帯域幅の制限により引き起こされます。

このような帯域幅のパフォーマンスへの影響は、ほとんどの場合システム固有です。 例えば、コアが 2 つのあるシステム (ここでは、仮に "S2C" と呼びます) で matrix コードサンプルを実行したところ、反復を並列化したバージョンは 4.431 秒かかったのに対し、反復がシリアルのバージョンは 1.435 秒と、並列化したバージョンのほうが著しく遅くなりました。 しかしながら、ほかのいくつかのシステムで、最大 16 個のコアとワーカーで行ったテストでは、並列化したバージョンで直線的なスピードアップが見られました。 次に、S2C の結果を示します。

1) Naive, Iterative Algorithm. Sequential and Parallel.
Running Iterative Sequential version...
  Iterative Sequential version took 1.435 seconds.
Running Iterative Parallel version...
  Iterative Parallel version took 4.431 seconds.
  Parallel Speedup: 0.323855

あるシステムのメモリー帯域幅のほうがほかのシステムよりも良いのには、複雑で予測不可能なさまざまな原因 (DRAM 速度、メモリーチャネル数、キャッシュテーブルとページテーブルのアーキテクチャー、1 つのダイあたりの CPU 数など) があります。 これらの要因が帯域幅に影響を与え、一貫性のない、予期しないパフォーマンス結果を引き起こす可能性があることに注意してください。 これは、並列プログラムに固有の問題であり、インテル® Cilk™ Plus プログラムに限ったことではありません。