インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
プログラムが十分に並列化されているにも関わらず速度が向上しない場合は、その他の要因がパフォーマンスに影響している可能性があります。 一般的な要因はいくつかありますが、ここではその一部について説明します。
cilk_for の粒度の設定。 粒度が大きすぎると、プログラムの論理的な並列性は減少します。 粒度が小さすぎると、各スポーンにかかるオーバーヘッドによりパフォーマンスが犠牲になることがあります。 インテル® コンパイラーとランタイムシステムは、デフォルトの式を使用して粒度を計算します。ほとんどの場合は、このデフォルトの式で問題ありません。 プログラムで cilk_for を使用している場合は、さまざまな粒度でパフォーマンスのチューニングを行ってみてください。
ロック競合。 一般に、ロックはプログラムの並列性を減少させるため、パフォーマンスに影響します。 ロックの使用は、パフォーマンス・ツールやプロファイル・ツールを使用して解析できます。
キャッシュ効率とメモリー帯域幅。 後のセクションを参照してください。
フォルス・シェアリング。後のセクションを参照してください。
アトミック演算。 コンパイラーの組込み関数によって提供されるアトミック演算は、キャッシュラインをロックします。このため、ロック競合と同様に、パフォーマンスに影響します。 また、キャッシュライン全体がロックされるため、フォルス・シェアリングを引き起こす可能性があります。