問題タブ [cilk-plus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Intel MIC での Intel TBB および Cilk Plus スレッド アフィニティ
Intel TBB と Cilk Plus を使用して Intel Xeon Phi の並列コードを書きたいのですが、スレッド アフィニティに問題があります。1 つのスレッドを 1 つの論理コアにバインドしたい。OpenMP のようにアフィニティを設定することはできますか? つまり、KMP_AFFINITY="compact" です。前もって感謝します。:)
arrays - この Cilk Array Notation マトリックスのパフォーマンスがシリアル バージョンの約 2 倍遅いのはなぜですか?
シリアルおよび Cilk 配列表記バージョンの行列乗算パフォーマンスのベンチマークを行っています。Cilk の実装には、シリアルのほぼ 2 倍の時間がかかりますが、その理由がわかりません。
これはシングルコア実行用です
これが Cilk 乗算の要です。ランクの制限により、各乗算を配列に格納し、次に__sec_reduce_add
この配列を格納してから、目的の行列要素の値を設定する必要があります。
私はキャッシングの問題を理解しており、Cilk バージョンがシリアルよりもキャッシュ ヒットが少ない理由はわかりません。これは、両方とも行要素の一連のミスと共に、キャッシュ内にあることが期待される列配列にアクセスするためです。
私が見落としている明らかな依存関係や、使用すべき Cilk の構文要素はありますか? SIMD 演算を使用した非ブロック行列乗算のパフォーマンスを最大化するには、別の方法で Cilk を使用する必要がありますか?
私は Cilk を初めて使用するので、どんな助けや提案も歓迎します。
編集:
シリアル実装は次のとおりです。
メモリは適切に割り当て (解放) され、乗算の結果は両方の実装で正しくなります。行列のサイズはコンパイル時には不明であり、ベンチマーク全体でさまざまなサイズが使用されます。
コンパイラ: icpc (ICC) 15.0.0 20140723
コンパイル フラグ: icpc -g Wall -O2 -std=c++11
割り当てられたメモリの使用、ベクトルからバニラ配列への変換などは無視してください。別のプログラムをハックして、実際よりも簡単であると仮定して、これを実行しました。2D ベクトルの両方の次元で cilk 表記をコンパイラに受け入れさせることができなかったので、ベンチマークのために従来の配列を使用することにしました。
適切なファイルはすべて次のとおりです。
MatrixTest.cpp
Matrix.h
マトリックス.cpp
c++ - Xeon phi オフロード モード スレッド並列処理とベクトル化の両方を活用する方法
cilk plus とオフロードを使用して、Xeon phi でいくつかのパフォーマンス テストを行っています。
単純なベクトル追加プログラムでは、次の 2 つの方法があります。
cilk_for を使用して、Xeon phi でタスクを異なるスレッドに分割します。
/li>ベクトル注釈の使用:
/li>
私のテストでは、xeon phi で最初の方法が 2 番目の方法よりも ~10 倍高速であることが示されています。オフロードせずに Xeon E5 ホスト CPU で実行すると、同じ話が発生します。
まず、私の理解が正しいかどうかを知りたいです。
最初の方法は、XEON phi でスレッドの並列処理 (それぞれ 60 コア * 4 スレッド) のみを利用します。ただし、ベクトル操作は実行されません。
2 番目の方法は、このコードを 1 つのスレッドでのみ実行し、SIMD(IMCI) 命令を使用するベクトル化のみを利用します。
次に、タスクを異なるスレッドに分割し、Xeon phi でベクトル命令を使用するように、これを記述する正しい方法を知りたいですか?
前もって感謝します。
c++ - 別のアロケーターを持つ stl コンテナーから構築しても問題ありませんか?
私が持っていると言う
ホスト CPU から Xeon Phi コプロセッサーへのオフロードのために、Cilk Plus で __offload::shared_allocator を allocator2 として使用しています。
B から A を構成できますか?
もっと一般的に言えば、どの種類の STL 関数について、異なるアロケータが重要になるのでしょうか?
c++ - 基本的な OpenMP 並列プログラムが期待どおりにスケーリングしない
export OMP_NUM_THREADS=4
icpc -Ofast -fopenmp -g dummy.cpp -o dummy
/usr/bin/time -v ./dummy 115000 20000
- CPU% = 225% (380% 以上である必要があります)
私は OpenMP と CilkPlus についてかなりの経験がありますが、ここでのスケーリングの障壁は私にはわかりません。これはかなり初歩的なプログラムです。明らかなことであることはわかっていますが、データの危険性と制御の危険性をすべて消去したような気がします。私は完全に困惑しています。
c++ - Ubuntu の Cilk Plus
Ubuntu 15.04 で次のコードをテストしようとしています。
次のエラーが表示されます。g++ コマンドは cilk plus を検出できますが、何とかコンパイルできないようです。
c++ - Cilk Plus でスレッドセーフでないリソースのプールを編成する方法 (ワーカーごとに 1 つのリソース)?
Cilk Plus を使用して並列化したいシリアル コードがあります。nts
メイン ループは、異なるデータ セットに対して処理関数を繰り返し呼び出すため、外部ライブラリによって提供されるクラス (たとえば ) にカプセル化された非スレッド セーフ リソースの使用を除いて、反復は互いに独立しています。これはファイル名を取り、それに対して I/O を行います。
OpenMP を使用している場合は、スレッドと同じ数のリソースを含むリソースのプールを作成し、スレッド ID に従ってこれらのリソースにアクセスします。
Cilk Plus を使用すると、 API__cilkrts_get_nworkers()
と__cilkrts_get_worker_number()
API を使用して同様のことができますが、Intel フォーラムの複数の投稿から、これは問題に対する間違った解決策であると考えられており、正しい解決策はホルダー ハイパーオブジェクトを使用することであることがわかりました。
ワーカー スレッドと同じ数のビューだけを作成したいという点を除けば、ホルダー ソリューションは確かに見栄えがします。つまり、3 つのワーカー スレッドの場合、3 つのオブジェクトが必要であり、それ以上は必要ありません。正当な理由は、私が言うように、リソースはサードパーティのライブラリによって提供され、構築するのに非常に費用がかかり、後で結果のファイルを処理する必要があるため、少ないほど良いということです.
残念ながら、ワーカーごとにビューを作成して同期まで保持するのではなく、所有者が私が理解できないロジックに従ってビューを作成および破棄していることを発見しました。影響を与える方法はないようです。この動作。
ホルダーを私が望むように動作させることは可能ですか? そうでない場合、私の問題に対する慣用的な Cilk Plus ソリューションは何でしょうか?
ホルダーを調査するために使用したプログラムは次のとおりです。1 回の実行でテスト マシンに最大 50 個のビューが作成され、一見ランダムに割り当てられて破棄されることに注意してください。