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

メモリー割り当てのボトルネック

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

一部の Linux*、macOS*、および Windows* オペレーティング・システムで使用されているメモリー割り当て方法は、並列プログラムでボトルネックになります。これらのシステムでは、プログラムがヒープからメモリーの割り当てまたは解放を行う際に、(例えば、malloc、free、newdelete を使用したときに)、ランタイム・ライブラリーはヒープデータ構造の衝突を避けるため、ミューテックスによるロックを使用します。このロックは、シングルコア・プロセッサーでもかなりの代償が伴います。マルチコア (プロセッサー) では、複数のストランドが同時にメモリーの割り当てまたは解放を行おうとして発生するロックの競合により、プログラムの並列処理のほとんどが実行できなくなります。つまり、ヒープ・アロケーターがプロセッサー数に応じてスケーリングしないことを意味します。

この問題は、インテル® スレッディング・ビルディング・ブロック (インテル® TBB) などのスケーラブルなメモリー・アロケーターを使用することで解決できます。インテル® Cilk™ Plus プログラムでは、インテル® TBB の Scalable Memory Allocator を使用することを推奨します。