Intel の Threading Building Blocks を使用した経験はありますか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/106862

  •  01-07-2019
  •  | 
  •  

質問

インテルの スレッドビルディングブロック (TBB) オープンソースライブラリは本当に面白そうです。さえあるのに オライリーの本 この件に関しては、多くの人がそれを使用しているという話は聞きません。Unix (Mac、Linux など) 環境でのマルチレベル並列アプリケーション (MPI + スレッド) にこれを使用することに興味があります。当然のことながら、私は高性能コンピューティングや数値手法の種類のアプリケーションに興味があります。

TBBの経験のある人はいますか?うまくいきますか?かなり移植性がありますか (GCC やその他のコンパイラを含む)?このパラダイムは、あなたが作成したプログラムでもうまく機能しますか?他に検討すべきライブラリはありますか?

役に立ちましたか?

解決

16 コア マシンに移行するときに使用する bettor malloc が必要だったので、これをコード ベースに導入しました。8 以下では重大な問題にはなりませんでした。それは私たちにとってうまくいきました。次に、きめ細かい同時コンテナを使用する予定です。理想的には製品の本質を活用できますが、そのためにはコードの構築方法を再考する必要があります。TBB のアイデアはとても気に入っていますが、コード ベースに後付けするのは簡単ではありません。

TBB を別のスレッド ライブラリと考えることはできません。彼らは、実際にスレッドの上に位置し、スレッドを抽象化するまったく新しいモデルを持っています。タスク、Parallel_for タイプの操作、パイプラインで考える方法を学びます。新しいプロジェクトを構築するとしたら、おそらくこの方法でモデル化しようとするでしょう。

私たちは Visual Studio で作業していますが、問題なく動作します。元々は Linux/pthreads 用に書かれたものなので、Linux/pthreads でも問題なく動作します。

他のヒント

私は数値計算を行っているわけではありませんが、データ マイニング (クラスタリングと分類を考えてください) を扱っており、ワークロードはおそらく似ています。すべてのデータは静的であり、プログラムの先頭にあります。Intel の TBB を簡単に調査しましたが、私のニーズには過剰であることがわかりました。生の pthread ベースのコードから始めた後、OPENMP に切り替えて、読みやすさとパフォーマンスを適切に組み合わせることができました。

携帯性

TBBはポータブルです。Intel と AMD をサポートしています (つまり、x86) プロセッサー、IBM PowerPC および POWER プロセッサー、ARM プロセッサー、およびおそらくその他のプロセッサー。中を見てみると、 ビルドディレクトリ, では、幅広いオペレーティング システム (Linux、Windows、Android、MacOS、iOS、FreeBSD、AIX など) とコンパイラー (GCC、Intel、Clang/LLVM、IBM) を含む、ビルド システムがサポートするすべての構成を確認できます。 XLなど)。私は PGI C++ コンパイラで TBB を試したことはありませんが、Cray C++ コンパイラでは動作しないことを知っています (2017 年現在)。

数年前、私は TBB を IBM Blue Gene システムに移植する取り組みに参加しました。静的リンクは課題でしたが、現在は ビッグアイアン株式会社 ビルドシステムヘルパー。その他の問題は、GCC の比較的古いバージョン (4.1 および 4.4) をサポートすることと、PowerPC アトミックが動作することを確認することでした。現在サポートされていないアーキテクチャへの移植は、GCC および POSIX を提供するか、GCC および POSIX と互換性のあるプラットフォームでは比較的簡単に行えると思います。

コミュニティコードでの使用法

TBB を使用する HPC アプリケーション フレームワークが少なくとも 2 つあることを私は知っています。

MOOSE が TBB をどのように使用しているかはわかりませんが、MADNESS はタスク キューとメモリ アロケーターに TBB を使用しています。

パフォーマンスと他のスレッドモデルの比較

私は個人的にTBBを使用しました パラレルリサーチカーネル このプロジェクトでは、TBB を OpenMP、OpenCL、Kokkos、RAJA、C++17 Parallel STL、およびその他のモデルと比較しました。を参照してください。 C++ サブディレクトリ 詳細については。

次の図は、インテル Xeon Phi 7250 プロセッサー上の前述のモデルの相対的なパフォーマンスを示しています (詳細は重要ではありません。すべてのモデルは同じ設定を使用しました)。ご覧のとおり、TBB は、適応型スケジューリングのオーバーヘッドがより関係する、問題のサイズが小さい場合を除いて、非常にうまく機能します。TBB には、これらの結果に影響を与える調整ノブがあります。

PRK stencil

完全な開示:私はインテルで研究/経路探索の仕事をしています。

私は TBB を少しだけ使用しましたが、おそらく将来はさらに使用するでしょう。私はこれを使用するのが気に入りました。最も重要なのは、C++ のマクロ/拡張機能を扱う必要がなく、言語内に留まるためです。また、かなりポータブルです。WindowsとLinuxの両方で使用しました。ただし、1 つだけ:TBB を使用してスレッドを操作するのは難しく、タスクの観点から考える必要があります (これは実際には良いことです)。Intel TBB はベア ロックの使用をサポートしません (これは面倒になります)。しかし全体として、これは私の予備的な経験です。

openMP 3 も参照することをお勧めします。

ZThread は LGPL であるため、オープン ソース プロジェクトで動作しない場合は、ライブラリを動的リンケージで使用することに制限されます。

オープンソース バージョンの Threading Building Blocks (TBB) (新しい商用バージョンがあり、$299 ですが、違いはまだわかりません) は、いわゆる「実行時例外」を備えた GNU General Public License バージョン 2 です。 (これは、フリー ソフトウェアの作成にのみ使用する場合に特有のものです。)LGPL に近づこうとする他のランタイム例外を見てきましたが、商用利用と静的リンクを可能にしています。 ではありません 今でしょ ケース。

私がこれを書いているのは、図書館のライセンスを調べる機会があったからです。図書館のライセンスも、意図した用途に基づいて選択する際の考慮事項となるはずです。


Txs、Jihn、このアップデートを指摘してくれました...

TBB について調べたことはありますが、プロジェクトで使用したことはありません。(私の目的にとって)利点は何もありませんでした Zスレッド. 。簡単でやや古い概要が記載されています。 ここ.

これは、いくつかのスレッド ディスパッチ オプション、すべての通常の同期クラス、および非常に便利な例外ベースのスレッド「割り込み」メカニズムを備えており、かなり完全です。簡単に拡張でき、よく書かれ、文書化されています。私は 20 以上のプロジェクトでそれを使用してきました。
また、Windows だけでなく POSIX スレッドをサポートする *NIX ともうまく動作します。

一見の価値あり。

あるプロジェクトでTBBを使用しています。スレッドよりも使いやすそうでした。並行して実行できるタスクがあります。タスクは、並列化されたサブルーチンへの単なる呼び出しです。負荷分散は自動的に行われます。それが、私がこれをより高レベルの並列化ライブラリとして受け入れる理由です。4 コア Intel プロセッサーを使用すると、あまり手間をかけずに 2.5 倍の高速化を達成できました。例があり、フォーラムで質問に答え、保守されており、無料です。

TBB (スレッド ビルディング ブロック) が他の代替手段 (例:C++ 11x 同時実行機能)。TBB は、移植可能でスケーラブルなライブラリ (コンパイラ拡張機能ではありません) であり、TBB が利用可能な CPU リソースで可能な限り高速に実行するようにスケジュールされる軽量タスクの形式でコードを作成できます。他の目的 (例:先制)。

TBB を使用して、画像スキャン ライン上の for ループの既存の画像処理を、Parallel_for ループ (「粒度」サイズとして最小 2 ~ 4 スキャン ライン) に高速化しました。これは非常に成功しました。各ループ本体が順次処理されることを前提とするのではなく、任意のインデックスを処理するようにループ本体を(再)書き込む必要があります(例:各ループ反復間でインクリメントされるポインター)。

更新する共有ストレージがなかったため、これはかなり簡単なケースでした。より強力な機能を使用する (例:パイプライン) は、既存のコードの大幅な再考や書き直しが必要になるため、おそらく新しいコードの方が適しています。

この TBB ベースのコードは移植可能であり、他のスレッド化戦略を同時に使用している同じプロセス内の他のコードに干渉することがないようで、後で上位または下位のレベルでマルチプロセッシング戦略と組み合わせることができるという強力な利点があります (例:TBB のParallel_for コードは、TBB マルチプロセッシング パイプラインのフィルターから呼び出すことができます)。

見ましたか ブースト 図書館とその スレッドAPI?

オープンソースバージョンのスレッドビルディングブロック(TBB)(新しい商用バージョン、299ドル、違いはまだわからない)は、いわゆる「ランタイム例外」を備えたGNU一般パブリックライセンスバージョン2です。フリーソフトウェアの作成でのみ使用することに固有のものです。)LGPLにアプローチしようとするが、これをコマーシャルの使用と静的リンクを可能にしようとする他のランタイムの例外を見てきました。

これによれば 質問 スレッド構成ブロックは商用利用の場合、コピーレフト制限なしで使用できます。

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