問題タブ [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++ - C++ AMP: array_view と index の動作がおかしい (予期しない値が格納される)
思い通りに動作しない小さなテスト関数を作成しました。
基本的に、配列を読み取ってその内容を書き戻す必要があります (後でこれが機能するようになったら、さらに多くのことを行う必要がありますが、今のところこれでも失敗します)。
GPU コードをデバッグすると、最初の数回の反復 (どういうわけか並行して実行されます.. これはおそらく GPU にとっては理にかなっていますが、デバッグすると驚きます) が正常に機能していることがわかりました..しかし、その後、1-2 Debug-Continues (F5)、以前に正しく設定された値の一部が 0 で上書きされます。よくわかりません..再びCPUを使用するまでに、0であってはならないにもかかわらず、多くの値が0になっています(基本的に、単純なテストシーケンスである元のデータが必要です)。
とても簡単な(計画された)手順:
- 配列の初期化
- 配列を GPU に渡します (unsigned int 配列として)
- 各 unsigned int を 4 バイトに分割し、float に格納します
- (いくつかの計算を行いますが、簡単にするためにここでは省略しています)
- フロートに格納されたバイトを元の位置に再び連結します
- (繰り返す)
ご参考までに..これは色の値であるはずです..
結果は次のとおりです。
- 一部の値は予想どおりですが、ほとんどの値は異なります
- 特にバイト0(各unsigned intの)の値が悪いようです
- 最初に unsigned int->byte->float を & 0xFF で変換しようとしましたが、完全に失敗したようです
出力は次のとおりです (ただし、0 から始まる数字が増えるだけである必要があります)。
0、1、2、3、0、5、6、7、0、9、10、11、16、13、14、15、0、17、18、19、32、21、22、23、32、 25, 26, 27, 32, 29, 30, 31, 0, 33, 34, 35, 64, 37, 38, 39, 64, 41, 42, 43, 64, 45, 46, 47, 64, 49,
質問:
- & 0xFF の問題はなぜですか?
- 各 unsigned int のバイト 0 に奇妙な値が割り当てられるのはなぜですか?
- バイトのarray_viewを作成できないと思います.intまたはfloatを使用する必要がありますか?
- 最後に .synchronize をコメントアウトしても何も変わらなかった - どうして?
gpu - ネットワーク (グラフ) データを GPU にコピーするにはどうすればよいですか?
GPU を使用してネットワーク上で並列計算を行いたい場合 (C++ AMP の方が優れています)、GPU のメモリ内のネットワーク データを使用するにはどうすればよいですか?
使用する GPU のメモリに隣接リストをコピーするにはどうすればよいですか?
隣接行列は大規模でまばらなネットワークには大きすぎるため、隣接行列を使用したくありません。
c++ - 反転、QR 分解に適した C++ AMP マトリックス ライブラリ
C++ AMP用の行列ライブラリが必要です。これは、基本的な操作だけでなく、任意のサイズの行列の逆行列と QR 分解も実行できます。
BLAS AMP の実装があることを最初に発見しましたが、 BLASが行列反転を実行できるかどうかを述べている場所を見つけることができませんでした。誰かがその機能について教えてくれたり、AMP に適した並列行列ライブラリを提案したりできますか? ありがとう!
編集:行列反転が可能なLAPACK AMPライブラリを見つけました(と思います)が、まだ開発中です:(
c++ - C++-AMP を使用してソートされていないベクトル検索の実行時間を短縮する
一意の要素のインデックスを見つけるために、並べ替えられていない構造体のベクトルを何度も検索するプログラムを作成しました。この検索は for ループの反復ごとに複数回行われ、ベクトル内のデータは for ループの反復中に複数回変更されます (データは追加されるだけで、何も削除されません)。これで、プログラムはやりたいことを実行しますが、かなり遅いので、VS2012 にプログラムのパフォーマンスを分析させたところ、80% 以上の時間でプログラムがソートされていないベクトルを検索していることがわかりました。検索を最適化したい。O(n) はソートされていないベクトルであるため (すべての要素は一意であり、挿入された要素の順序は変更できません)、取得できる最善の方法はわかっていますが、何らかの方法でランタイムを短縮したいと考えています。
プログラムの実行時間を短縮するために並列処理を使用することを考えていましたが、Microsoft の AMP ライブラリが有望に見えます。一見すると、並列処理を使用して配列を反復処理し、配列内の要素を見つけることができます。しかし、ソートされていないベクター内のデータは大きく変化するため、ボトルネックをベクターの反復処理から CPU から GPU へのデータ転送に移動させたり、これに対処するために AMP 組み込みの最適化を行ったりしないのでしょうか? 覚えておいてください: ベクトル内のデータはベクトルの最後に追加されるだけで、何も削除されません。
念のため、私が使用するベクトルと検索関数を次に示します。
c++ - AMP C++ によるボリューム計算の高速化
- デバイス: テスラ C2050
- OS : Windows 7 エンタープライズ
- IDE: VS 2012
こんにちは、みんな。ボリュームの計算に AMP C++ を使用しています。
(0,0,0) に 1 つのポイントを持つ何百万もの四面体があります。したがって、四面体の体積を簡単な方法で取得できます。
そこで、AMP C++ を使用して計算を高速化したいと考えています。
これがコードです。
そして、主な機能は次のとおりです。
だから、すべての仕事がダウンしています。しかし、興味深いことはです。CPU(シングルコア)コードよりもコストがかかります。
CPU (シングルコア) 上の C++ は、1024 * 1024 * 2 三角形の計算を完了するのに 0.085 秒かかります。しかし、AMP C++ コードのコストは 0.530 秒です。C++ コードよりもはるかに多くの.
インターネットで検索した後、ヒントがあります。最初にデバイスをウォームアップすると、計算で「リアルタイム」コストを取得できます。
そのため、最初に 128 個の三角形を計算してデバイスをウォームアップし (約 0.2 秒かかります)、次に 1024 * 1024 * 2 個の三角形を計算してボリュームを取得します。はるかに高速になりました (約 0.091 秒かかります) が、それでも CPU (シングルコア) コードよりは遅くなります。
理由と、計算を高速化するのを手伝ってくれる人がいれば知りたいです。
どうもありがとう。
c++ - C++ AMPでスレッドを互いに同期させる方法は?
C++ AMP を使用してフィボナッチを計算しようとしていますが、各数値は前の 2 つに依存します。したがって、コードは次のようになります。
3 番目のスレッド ( idx[0] == 2 ) は、次の行で待機します。
ゼロ以外の数値には設定されないため、後続のすべてのスレッドは単純にループ内でスタックします。
抜け道はありますか?
c++ - parallel_for_each 関数と __declspec(dllexport) 属性を同時に使用する方法
最近、次のような関数を書きました。
Visual Studio は次のエラーを報告しました:
エラー C1451: concurrency::parallel_for_each の呼び出しグラフをコンパイルするときにデバッグ情報を生成できませんでした
修飾子を削除するとすぐにDLLEXPORT
エラーは消えましたが、この関数を他のプログラムにエクスポートできなくなりました。
この問題を解決するにはどうすればよいですか?
c++ - タイル内のスレッドのデータを tile_static にコピーする
長時間実行されるプロセスのためにデータを tile_static にコピーしようとしています。私が見たすべての例では、配列が宣言され、データはタイル内のスレッドごとに 1 つずつ埋められています。それらのスレッドはそのデータを共有します。私がやりたいことは、単一のスレッドで使用するために tile_static でいくつかのデータをコピーすることです。共有する必要はありませんが、実行時間の長いスレッドが多いため、パフォーマンスが向上すると理解しています。ただし、これが正しい方法であるかどうかはわかりません。私が行おうとしている tile_static 呼び出しは、parallel_for_each ループの下部近くにあり、次のようになります。
わかりやすくするために追加のコードを含めました。