インテル® スレッディング・ビルディング・ブロック (インテル® TBB) には、STL テンプレート・クラス std::allocator に似た 2 つのメモリー・アロケーター・テンプレートが用意されています。scalable_allocator<T> と cache_aligned_allocator<T> の 2 つのテンプレートは、次のように、並列プログラムのクリティカルな問題に対処します。
スケーラビリティー: スケーラビリティーの問題は、元々シリアルプログラム向けに設計されたメモリー・アロケーターを、スレッドで使用する際に発生します。スレッドは、1 回に 1 つのスレッドしか割り当てができない方法で、シングル共有プールで競合します。scalable_allocator<T> メモリー・アロケーター・テンプレートを使用して、そのようなスケーラビリティーのボトルネックを回避します。このテンプレートは、メモリーを迅速に割り当ててリリースし、プログラムのパフォーマンスを向上させます。
フォールス・シェアリング: シェアリングの問題は、2 つのスレッドが、同一キャッシュラインを共有する別々のワードにアクセスする際に生じます。問題は、キャッシュラインがプロセッサー・キャッシュ間の情報交換単位であるということです。1 つのプロセッサーがキャッシュラインを変更し、別のプロセッサーが同じキャッシュラインの読み取り (または書き込み) を行う場合、たとえ、2 つのプロセッサーがライン中の異なるワードを処理していたとしても、キャッシュラインはプロセッサーから別のプロセッサーへ移動しなければなりません。フォールス・シェアリングは、キャッシュラインの移動に何百ものクロックが必要なため、パフォーマンスに影響します。
常にキャッシュライン上で割り当てるには、cache_aligned_allocator<T> クラスを使用します。cache_aligned_allocator によって割り当てられる 2 つのオブジェクトでは、フォールス・シェアリングが発生しないことが保証されます。1 つのオブジェクトが cache_aligned_allocator で割り当てられ、もう 1 つのオブジェクトが別の方法で割り当てられた場合、フォールス・シェアリングを回避する保証はありません。cache_aligned_allocator のインターフェイスは std::allocator と同一なため、STL テンプレート・クラスの allocator 引数として使用できます。
次のコードは、cache_aligned_allocator を割り当てに使用する STL ベクトルの宣言方法を示しています。
std::vector<int,cache_aligned_allocator<int> >;
スケーラブル・メモリー・アロケーターは、インテルの PSL CTG チームによって開発された McRT テクノロジーを採用しています。