2009-03-18 11 views
25

インテルスレッディング・ビルディング・ブロックのtbb::scalable_allocatorは実際に何をしていますか?インテルTBBのスケーラブル・アロケータはどのように機能しますか?

確かに効果的です。私はちょうどstd::vector<T>std::vector<T,tbb::scalable_allocator<T> >に変更することで、アプリの実行時間を25%短縮しました(そして、4コアシステムではCPU使用率が200%から350%に上昇するのを見ています)。一方、別のアプリで私はそれがすでに大きなメモリ消費量を倍増し、都市を交換するために物事を送信することを見てきました。

インテル独自のドキュメントではあまり意味がありません(たとえば、FAQの最後の短いセクション)。誰かが自分のコードに自分自身を掘り起こす前に、どんなトリックを使うのか教えてもらえますか?

UPDATE:初めてTBB 3.0を使用し、scalable_allocatorから私の最高のスピードアップを見ました。 vector<int>vector<int,scalable_allocator<int> >に変更すると、実行時間が85秒から35秒に短縮されました(Debian Lenny、Core2、テストではTBB 3.0)。

答えて

18

アロケータの良い紙があります:The Foundations for Scalable Multi-core Software in Intel Threading Building Blocks

私の限られた経験は:私はグローバルな新しいオーバーロード/私のAIアプリケーション用のTBB :: scalable_allocatorを削除します。しかし、時間プロファイルの変化はほとんどありませんでした。私はメモリの使用量を比較しませんでした。

+2

ありがとうございます!記事には、私が探していた種類の情報が含まれています。 – timday

+3

元のリンクは現在無効ですが、CiteSeerにPDFがあります:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.8289 –

+4

データポイントを追加するには:私の特定のアプリでは、アロケータの競合すべてのスピードアップを殺すことを約15スレッド後にはスピードアップを停止し、40スレッドではシングルスレッドよりもはるかに遅くなります。 'scalable_allocator'がスレッド単位のカーネル内で使われているので、ボトルネックがなくなり、スケーリングが戻ってきました。 (マシンには40個の物理コアがあります)。 – Adam

0

上記の解決方法は、Intel CPUに最適化されています。パフォーマンスを向上させるために特定のCPUメカニズムを組み込んでいます。

いつか私は別の非常に便利な解決策を見つけました:Fast C++11 allocator for STL containers。 VS2017(〜5x)およびGCC(〜7x)上のSTLコンテナをわずかにスピードアップします。それはすべてのplatofrmsのために非常に効果的になる要素割り当てのためのメモリプールを使用します。

関連する問題