インテル® スレッディング・ビルディング・ブロック (インテル® TBB) には、STL テンプレート・クラス std::allocator に似た、さまざまなメモリー・アロケーター・テンプレートが用意されています。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 つのオブジェクトが別の方法で割り当てられた場合、フォルス・シェアリングを回避する保証はありません。
これらのアロケーター・テンプレートは、STL テンプレート・クラスの allocator 引数として使用できます。次のコードは、cache_aligned_allocator を割り当てに使用する STL ベクトルの宣言方法を示しています。
std::vector<int,cache_aligned_allocator<int> >;