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

シリアルプログラムの最適化

インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」を参照してください。

並列化の第一歩は、C/C++ シリアルプログラムで優れたパフォーマンスが得られており、コンパイラーによる最適化などの通常の最適化手法がすでに使用されていることを確認することです。

シリアルプログラムの最適化の重要性について示す簡単で限定的な例として matrix_multiply について考えてみましょう。この例では、キャッシュ・ライン・ミスを最小限に抑えるようにループが記述されています。次のようなコードになります。

cilk_for(unsigned int i = 0; i < n; ++i){
   for (unsigned int k = 0; k < n; ++k) {
     for (unsigned int j = 0; j < n; ++j) {
       A[i*n + j] += B[i*n + k] * C[k*n + j];
      }
    }
 }

複数回のパフォーマンス・テストで、このコードは、ループの内側に 2 つのループ (kj) を含む同じプログラムと比べて、パフォーマンスが大幅に向上しました。このパフォーマンスの差は、シリアルプログラムとインテル® Cilk™ Plus で並列化されたプログラムの両方に当てはまります。matrix の例は同じループ構造です。matrix の例は同じループ構造です。ただし、このようなパフォーマンスの向上は、アーキテクチャー上のさまざまな要因によって異なるため、すべてのシステムで同様の結果が得られるわけではないことに注意してください。