問題タブ [c++-amp]
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++ - CPU と GPU デバイスで同時にタスクを実行するにはどうすればよいですか?
私の知識レベルで取得できる可能性が高いのと同じくらい、プロファイリングされ、最適化され、キャッシュ効率の高いこのコードがあります。概念的には次のように CPU 上で実行されます。
これRunTask()
は基本的に、同じ非常に大きなデータセットに対して毎回繰り返し実行される一連の線形代数演算であるため、GPU で実行するのに適しています。だから私は次のことを達成したいと思います:
- 一部のタスクを GPU にオフロードする
- GPU がビジー状態の間、CPU で残りのタスクを処理する
RunTask()
CPU レベルの操作については、準拠するように変更する必要なく、超大型機能を保持しrestrict(amp)
ます。restrict(amp)
もちろん、GPU タスクに準拠したラムダを設計することもできます。
当初、私は次のことを考えていました:
しかし、私はあなたがこのようなことをすることができるとは思わない.
parallel_for_each の呼び出しは、同期しているかのように動作します。
( http://msdn.microsoft.com/en-us/library/hh305254.aspx )
では、私の要求の 1 ~ 3 を達成することは可能ですか、それとも 3 番を捨てる必要がありますか? それでも、どのように実装しますか?
c++ - 「最も重要な」次元と「最も重要でない」次元とはどういう意味ですか?
C++ AMP に関する本を読んでいるのですが、いくつかの用語がよくわかりません。
最下位次元のスレッド数が少なくとも 16 になるように常にタイル サイズを選択し、可能であれば 32 または 64 を使用してください。
Eigen のドキュメントで同様の用語が使用されているのを見たことがあるので、これはかなり一般的な使用法だと思います。
では、2D インデックス、配列などを持っているとしましょう。
の型をちょっと忘れてArrayType
、用語についてもっと考えてみると、その配列の最も重要な次元と最も重要でない次元はどれでしょうか?
c++ - tile_static として宣言できるメモリ量はどれくらいですか?
現在、C++ AMP コードをタイル化しています。各タイルには、頻繁に読み取られる 4096 バイトのデータがあるため、これを tile_static として宣言したいと思います。各スレッドがすべてのデータにアクセスする必要があるため、これを複数のタイルに分割することは現実的ではありません。私のタイルは 128 のスレッドで構成されているため、Nvidia/AMD GPU では 2 ~ 4 回のワープが必要です。
次の記事を読んだところ、ワープごとに tile_static で 1024 ビットしか使用できないことが示唆されているようです 。 -on-tile-static-memory-with-c-amp.aspx
一部の最近の GPU では、tile_static メモリは、同時にアクセスできる「n」個の同じサイズのメモリ バンクで構成され、連続する「m」ビット ワードは連続するメモリ バンクにマップされます。tile_static メモリ (つまり n と m) の正確な構成は、ハードウェアに依存します。たとえば、Nvidia GTX 580 カードまたは ATI HD 5870 カードでは、tile_static メモリには32 のバンク (n = 32) があり、連続する 32 ビット ワード (m = 32) が連続するメモリ バンクにマップされるように構成されています。n はハードウェアによって異なる場合があることに注意してください。通常、m は 32 です。以降の投稿では、m が 32 であると仮定します。
これは、ワープごと、またはスレッドごとに最大 1024 ビットを宣言できるということですか? すべての tile_static 変数はワープ間で共有されていますか、それともワープごとに独自のコピーがありますか?
これらの質問のうち、ハードウェアに依存するものはどれくらいありますか?もしそうなら、実行時の制限をどのように見つけることができますか?
私はc++ AMP の本の表紙から表紙までを読みました。この主題を紹介してくれた著者には感謝していますが、この質問に対処しているようには見えませんでした (または、理解していたとしても理解できませんでした)。
tile_static メモリの使用方法に関する豊富な情報がオンラインにあります (これは良いスタートです: http://www.danielmoth.com/Blog/tilestatic-Tilebarrier-And-Tiled-Matrix-Multiplication-With-C-AMP .aspx ) しかし、どれだけ宣言できるかについて誰も話していないようで、実際にこのようなものを実装することは不可能です! その最後のリンクは、次の例を示しています。
13 行目で 2x 1024 ビットが宣言されていることに注意してください。これにより、私の 4096 ビットは要求するほど多くないことが期待されます....C++ アンプまたは GPU プログラミング全般の経験がある人が私を助けてくれれば、それは素晴らしいことです- これらの質問は、AMP 言語拡張自体よりもハードウェア/実装に依存していると思います...
c++ - array_view.synchronize_asynch は parallel_for_each の完了を待ちますか?
concurrency::array_view
ループで操作されている場合concurrency::parallel_for_each
、ループの実行中に CPU で他のタスクを続行できると理解しています。
しかし、並列 for ループを待つのではなく、できるだけ早くGPU からデータのコピーを開始したい場合はどうすればよいでしょうか。以下は機能しますか?
The Mothでこのトピックについて読みましたが、以下を読んだ後、私は本当に賢明ではありません。
parallel_for_each は呼び出し元のコードと同期しているかのように実行されますが、実際には非同期であることに注意してください。つまり、parallel_for_each 呼び出しが行われ、カーネルがランタイムに渡されると、some_code_B 領域は CPU スレッドによってすぐに実行され続けますが、並行して、カーネルは GPU スレッドによって実行されます。ただし、some_code_B 領域のラムダでキャプチャした (array または array_view) データにアクセスしようとすると、結果が利用可能になるまでコードがブロックされます。したがって、正しいステートメント: parallel_for_each は、目に見える副作用の点ではあたかも同期ですが、実際には非同期です。
c++ - Concurrency::completion_future のステータスを取得するにはどうすればよいですか?
私はちょうどこれを読んだ:
の機能は模倣しているようにConcurrency::completion_future
見えるので、std::future
同様のことができると思いましたが、この比較的単純な例は失敗します。
なぜそのアサートは失敗するのでしょうか?
c++ - キャプチャされた値がスコープ外になっているストアド ラムダを実行できますか?
完了時にラムダを渡して実行したい未来がありますが、ラムダが実行されるまでにスコープが変更されます。取得した値はどうなりますか? 例えば
ラムダが実際に実行されるまでに、関数は終了している可能性があります。それで何が起こるでしょうか?一連の変数をバインドするのと同じように、値でキャプチャしていますか?
c++ - C++ AMP でアクションを実行するスレッドの数を制限する方法
C++ AMP を使用して多数のスレッドで一連の計算を実行しています。ただし、計算の最後のステップは、限られた数のスレッドに対してのみ結果を削除することです。たとえば、計算結果がしきい値を下回る場合、結果を 0 に設定しますが、これは最大 X スレッドに対してのみ行います。基本的に、これは共有カウンターですが、共有条件チェックでもあります。
どんな助けでも大歓迎です!