メモリー割り当て

メモリー割り当て#

oneAPI スレッディング・ビルディング・ブロック (oneTBB) は、STL テンプレート・クラス std::allocator に似たいくつかのメモリー・アロケーター・テンプレートを提供します。2 つのテンプレート、scalable_allocator<T>cache_aligned_allocator<T> は、次のような並列プログラミングにおける重要な問題に対処します。

  • スケーラビリティー。スケーラビリティーの問題は、元々シリアルプログラム用に設計されたメモリー・アロケーターを、一度に 1 つのスレッドのみが割り当て可能な方法で、単一の共有プールで競合が発生する可能性があるスレッドで使用するときに発生します。

    スケーラビリティーのボトルネックを回避するには、scalable_allocator<T> テンプレートを使用します。このテンプレートを使用すると、メモリーを迅速に割り当て、および解放するプログラムのパフォーマンスを向上できます。

  • フォールス・シェアリング。共有の問題は、2 つのスレッドが同じキャッシュラインを共有する異なるワードにアクセスすると発生します。問題は、キャッシュラインがプロセッサー・キャッシュ間の情報交換の単位であることです。1 つのプロセッサーがキャッシュラインを更新し、別のプロセッサーが同じキャッシュラインを読み取る場合、2 つのプロセッサーがライン内の異なるワードを処理していても、そのラインを 1 つのプロセッサーから別のプロセッサーに移動して、整合性を確保する必要があります。キャッシュラインの移動には数百クロックかかることがあるため、フォールス・シェアリングによってパフォーマンスが低下する可能性があります。

    常に別のキャッシュラインに割り当てるには、cache_aligned_allocator<T> テンプレートを使用します。cache_aligned_allocator によって割り当てられた 2 つのオブジェクトには、フォールス・シェアリングがないことが保証されます。ただし、オブジェクトが cache_aligned_allocator によって割り当てられ、別のオブジェクトが他の方法で割り当てられている場合は、その保証はありません。

これらのアロケーター・テンプレートは、STL テンプレート・クラスのアロケーター引数として使用できます。次のコードは、割り当てに cache_aligned_allocator を使用する STL ベクトルの宣言方法を示しています。

std::vector<int,cache_aligned_allocator<int> >;

ヒント

cache_aligned_allocator<T> の機能は、たとえ小さなオブジェクトであっても、1 キャッシュライン分のメモリーを割り当てる必要があるため、ある程度のスペースが必要になります。そのため、フォールス・シェアリングが重要な問題になりそうな場合のみ、cache_aligned_allocator<T> を使用するようにしてください。

スケーラブル・メモリー・アロケーターは、C 標準ライブラリーのメモリー管理ルーチンと同等の関数セットも提供しますが、その名前には scalable_ プレフィクスが付きます。また、標準ルーチンをこれらの関数に簡単にリダイレクトする方法も提供します。