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

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

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

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