最近、システム メモリ管理 (malloc/free) から Intel の TBB スケーラブル アロケータに切り替えました。問題は、スレッドセーフである場合、情報が見つからないことです。TBB 全体がスレッドを中心に構築されているため、論理的に思えるかもしれませんが、具体的な証拠がなければ、そのようなことは想定したくありません。しかし、不要な同期も行いたくありません。誰もこれに関する情報を持っていますか?
2 に答える
次に、このソースIntel Threading Building Blocksはよりストレートに聞こえます (「TBB スケーラブル アロケーター」ページを参照)-
各スレッドには独自のプライベート ヒープがあります
– サイズで区切られたビンにより、局所性が向上します
– プライベート ヒープにより、同期のオーバーヘッドとフォールス シェアリングが削減されます
更新:そしてここから-
TBB は、スレッドごとのプールを備えたスケーラブルなアロケーターを提供します。まだ偽の共有がある可能性があります。
example: false sharing could matter in pipelining. TBB also provides a cache-aligned allocator, which guarantees that any two things you've allocated will never experience false sharing. The downside is that it has larger memory pressure. This is accomplished by making the minimum allocation N cache lines, where N is a small integer. In the book, the conventional wisdom is to start with the scalable allocator and see if switching to the cache-aligned allocator speeds things up.
しかし、false-sharing は、スレッドセーフではなくスローダウンに関するものです。
リンクしたマニュアルに従って:
特に明記しない限り、ライブラリのスレッド セーフ規則は次のとおりです。
2 つのスレッドは、異なるオブジェクトに対してメソッドまたは関数を同時に呼び出すことができますが、同じオブジェクトに対して同時に呼び出すことはできません。2 つのスレッドが同じオブジェクトのメソッドまたは関数を同時に呼び出すことは安全ではありません。クラスの説明は、この規則からの逸脱を示しています。たとえば、並行コンテナーはより自由です。その性質上、同じコンテナ オブジェクトに対するいくつかの同時操作が許可されます。
スケーラブル アロケータを使用すると、これは 2 つのスレッドが同時に同じメモリを解放できないことを意味しますが、これは当然のことです。