Intel TBBのscalable_allocatorはどのように機能しますか?
-
19-08-2019 - |
質問
Intel Threading Building Blocksのtbb::scalable_allocator
は実際に内部で何をしますか?
それは確かに効果的です。単一のstd::vector<T>
をstd::vector<T,tbb::scalable_allocator<T> >
に変更することで、アプリの実行時間を25%削減するために使用しました(4コアシステムでCPU使用率が〜200%から350%に増加することを確認しました)。一方、別のアプリでは、既に大量のメモリ消費量が2倍になり、スワップシティに送信されることがわかりました。
Intel自身のドキュメントではあまり説明していません(たとえば、この FAQ )。自分でコードを掘り下げる前に、誰がどのトリックを使っているのか教えてもらえますか?
UPDATE :初めてTBB 3.0を使用しただけで、scalable_allocatorからの私の最高の高速化が見られました。単一のvector<int>
をvector<int,scalable_allocator<int> >
に変更すると、何かの実行時間が85秒から35秒に短縮されました(Debian Lenny、Core2、テストからTBB 3.0を使用)。
解決
アロケータに関する優れた論文があります:インテルスレッディングビルディングブロックのスケーラブルマルチコアソフトウェアの基礎
限られた経験:AIアプリケーションのtbb :: scalable_allocatorでグローバルなnew / deleteをオーバーロードしました。しかし、時間プロファイルにはほとんど変化がありませんでした。ただし、メモリ使用量は比較しませんでした。
他のヒント
言及したソリューションは、Intel CPU用に最適化されています。特定のCPUメカニズムを組み込んで、パフォーマンスを改善します。
ときどき、別の非常に便利なソリューションを見つけました: STLコンテナ用の高速C ++ 11アロケーター。 VS2017(〜5x)およびGCC(〜7x)でSTLコンテナをわずかに高速化します。要素の割り当てにメモリプールを使用するため、すべてのプラットフォームで非常に効果的です。