質問

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コンテナをわずかに高速化します。要素の割り当てにメモリプールを使用するため、すべてのプラットフォームで非常に効果的です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top