問題タブ [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.

0 投票する
1 に答える
328 参照

c++ - C++AMP 16 ビット イメージのテクスチャを使用したグラデーションの計算

kinect から取得した 16 ビットの深度画像を使用しています。インデックスや画像のサイズが原因で、独自のフィルターを作成するのが難しいことがわかりました。任意のビットサイズの画像を操作できるため、テクスチャを使用しています。

そのため、何が間違っているのか、なぜ期待どおりに機能しないのかを理解するために、簡単な勾配を計算しようとしています。

y dir を使用すると、何か問題があることがわかります。

x の場合:

Yについて:

それが私のコードです:

どんな助けでも大歓迎です。

0 投票する
1 に答える
928 参照

c++ - C++Amp テクスチャからテクスチャへの 16 ビットのイメージのコピー (openCV Mat から)

この問題は、この 1 つのリンクからの次のステップです。

簡単に言えば、16 ビットの画像を取得する kinect からの深度画像を使用しています。C++Amp では、データのビット サイズにいくつかの制限があります。そのため、テクスチャを使用して対処しようとしています。

今、私は適切なピクセルに書いていると確信しています。ただし、テクスチャの元のデータから取得する際に問題があるようです。

それがコードです:

そして結果:

GPUを使用してコピーした後:

また、kinect 画像を使用して何が起こるかを確認してみました。結果は私を驚かせます:

オリジナル:

結果:

何が起こっているか知っている人はいますか?

これは、16 ビットのイメージを直接操作するために行った変更です (役立つかもしれません)。

いつものように、どんな助けも非常に感謝しています。あなたが私を助けることができると思うなら、私に詳細を尋ねることを躊躇しないでください.

ありがとう、デビッド

0 投票する
1 に答える
242 参照

random - C++ AMP の乱数ライブラリを含むリンク エラー

CodeplexのC++ AMP tinymt ライブラリ使用して乱数を生成しています。ライブラリは正常に動作#include <amp_tinymt_rng.h>しますが、同じプロジェクト内の 2 つの異なるファイルで、特定の変数tinymt_lib::tinymt_dc_dataおよびtinymt_dc_data_32の再定義に言及するリンク エラーが発生することを除きます。

#pragma onceすべてのヘッダーで既に使用していることを考えると、この問題を解決するための良い修正は何でしょうか? Visual Studio 2013 Professional を使用しています。

副次的な提案として、特別なライブラリのオーバーヘッドなしで乱数を生成するより簡単な方法は何でしょうか? random()シーケンスが安全にランダムでないか、単純であるかrand()、十分ではないかについては心配していません。

0 投票する
1 に答える
730 参照

c++ - Visual Studio 2013 で FFTW または AMPFFT を使用して 2-D FFT を実行できないのはなぜですか?

私は私のプロジェクトで 2D FFT を使用してきましたが、2 つの異なる FFT ライブラリを使用して正しい結果を得ることができませんでした。最初は間違った使い方をしていると思っていましたが、MATLAB や Linux の GCC 参照実装と比較すると、私のコンパイラ (MSVC 2013 Express) で何か不吉なことが起こっているようです。

私のテスト ケースは次のとおりです: 256x256 複素数から実際の IFFT へ、10000 に設定された 255 (X、Y 表記では 0,255) の単一ビン。

AMPFFT を使用して、次の 2D 変換を取得します。

壊れた AMPFFT の例

FFTW を使用すると、次の 2D 変換が得られます。

壊れた FFTW の例

ご覧のとおり、AMPFFT バージョンは「ほぼ」正しいですが、この奇妙なサンプルのバンディングがすべて含まれており、FFTW バージョンはいたるところにあり、ランチに出かけています。

2 つの異なるテスト バージョンの出力を取得し、それらを MATLAB (技術的には FFTW を内部で使用するオクターブ) と比較しました。また、GCC を使用する Linux で FFTW に対して同じテスト ケースを実行しました。これは、127 番目の行の一連のテストからのスライスです (ビンの選択では、すべての行が同一である必要があるため、行番号は技術的には問題ではありません)。

FFT比較

この例では、オクターブと Linux の実装は正しい結果を表し、赤い線に従っています (オクターブは黒でプロットされ、Linux は赤でプロットされ、オクターブと完全に一致しました)。MSVC の下の FFTW は青色でプロットされ、AMP FFT 出力はマゼンタでプロットされます。ご覧のとおり、やはり AMPFFT バージョンはほぼ近いように見えますが、この奇妙な高周波リップルが含まれており、MSVC での FFTW は、この奇妙な「パケット化された」外観で混乱しています。

この段階では、Visual Studio に指を向けることしかできませんが、何が起こっているのか、それを修正する方法はわかりません。

ここに私の2つのテストプログラムがあります:

FFTW テスト:

AMPFFT テスト:

これらは両方とも、win32 コンソール アプリ用に MSVC 2013 のストック設定でコンパイルされ、FFTW テストも GCC 4.4.7 を使用する Centos 6.4 で実行されました。どちらの FFTW テストも FFTW バージョン 3.3.4 を使用します。

この問題を解決しようとする Visual Studio コンパイラの設定について、少しでも手がかりを持っている人はいますか?

0 投票する
3 に答える
743 参照

c++ - C++ amp アトミック

私は C++ AMP でアルゴリズムを書き直していますが、アトミックな書き込み、より具体的にはatomic_fetch_addの問題に遭遇しました。これはどうやら整数専用ですか?

アトミックな方法で double_4 (または必要に応じて float_4) を追加する必要があります。C++ AMP のアトミックでそれを達成するにはどうすればよいですか?

私のコードが書き込みを制御するために使用できるロック変数を持つことは、本当に最善/唯一の解決策ですか? 実際には、出力 double の長いリストに対してアトミックな書き込みを行う必要があるため、基本的にすべての出力に対してロックが必要になります。

パフォーマンスを向上させるためにこれをタイル化することを既に検討しましたが、今は最初の繰り返しに過ぎません。

編集:すでに与えられた素早い回答に感謝します。ただし、質問を簡単に更新します。

次のロックを試みましたが、ワープ内の 1 つのスレッドがロックを通過すると、同じワープ内の他のすべてのスレッドがタグ付けされるようです。最初のワープスレッドがロックを取得することを期待していましたが、何かが欠けているに違いありません (cuda の時代からかなりの年月が経過しているため、私はばかになってしまったことに注意してください)。

最初は共有変数に書き込み、タイル内のすべてのスレッドが完了した後にのみグローバル メモリに書き込む必要があるため、それほど大きな問題ではありませんが、この動作がわかりません。

0 投票する
1 に答える
325 参照

gpgpu - C++ AMP (GPU) グローバル書き込みは、すべてのタイルが表示されるほど速く更新されませんか?

これは C++ AP の問題というよりも GPU の問題であると想定しているため、広くタグ付けします。

作業をいくつかのタイルに分割して作業を行い、その結果をグローバルメモリの既存の値に追加する計算の実装があります。最初に、タイル内のすべてのスレッドが、部分結果を tile_static メモリに計算します。各スレッドには、書き込み先のインデックスがあります。その後、タイルの最初のスレッドがすべてのパーツ結果を合計し、その合計をグローバル メモリ内の位置に追加します。

タイル (タイル内のスレッド 0) は同じ場所に書き込みたい場合があるため、単純なロックを追加しました。

ロックとロック解除に渡すロック変数は、タイルが書き込む競合するメモリ位置ごとに 1 つの整数を持つ整数のグローバル配列にあります。

タイルの最初のスレッドによって行われる、タイル結果の実際の書き込みは、次のように行われます。

これはほとんど問題なく動作しますが、常にではありません。書き込むメモリ位置の数に対してタイルが多すぎる (ロックをめぐる争いが多すぎる) 場合、タイルの結果を適切に追加できないことがあるため、何らかの競合状態が存在する必要があります。

めったにありませんが、ロック/ロック解除のセットアップで正しい追加が保証されない場合があります。

これは、合計の前にロックを上に移動することで「修正」できるため、ロックが取得されてからスレッド0が実際の書き込みを行うまでに時間がかかります。合計に 5 つの要素が残っている場合は、ロックを取得して「修正」することもできます。両方を以下に示します

最初の修正は非常に遅い (ブロックが長すぎる)

2 番目の修正で、少し高速です

これらの「修正」がどのように機能するかを見ると、一部のメモリ書き込みがシステム全体で十分な速さで更新されていないことが明らかです。1 つのタイルで場所のロック、書き込み、ロック解除を行うことができます。次に、別のタイルがロックを取得し、追加を行い (ただし、更新されていない古いデータを参照)、ロックを解除します。

ロックは int であり、データは double_4 であるため、ロックはすぐに解放され、データがまだ転送中に他のタイルが確認できるように更新されているようです。別のタイルは、最初のタイルの書き込みがまだ完全にコミットされていなくても、ロックが解放されていると見なすことができます。したがって、2 番目のタイルは、更新されていないデータ値をキャッシュから読み取り、それに追加して書き込みます...

最初のタイルが書き込みを行ったときにデータが (キャッシュ内で) 無効化されなかった理由を正確に理解するのを手伝ってもらえますか? また、誰かがこの問題の適切な解決策を見つけるのを手伝ってくれますか?

0 投票する
0 に答える
121 参照

debugging - C# Windows ストア アプリの GPU デバッグ タイプの選択

C# XAML Windows ストア アプリと、C++ AMP コードを公開する WinRT コンポーネントを使用したソリューションがあります。アプリからコンポーネントへの参照が設定され、これを実行できます。混合モードのデバッグで、win rt コンポーネントにステップインできます。

ただし、ソフトウェア エミュレーション gpu デバッガーでデバッグを開始する「gpu のみ」の「デバッガー タイプ」を選択できません。混合モードを選択して、c# アプリと c++ rt コンポーネントの両方をデバッグできますが、gpu を使用できないため、カーネルの実際の parallel_for_each コード ブロックにステップ インできません。

C++ XAML Windows ストア アプリをホストとして使用する場合、デバッガーの種類として "gpu のみ" を簡単に選択できます。

1 つの解決策は、ソリューション (C# アプリ + C++ コンポーネント) をデバッグせずにビルドして起動し、手動でデバッグ/アタッチしてプロセスに移動し、実行中のプロセスを見つけ、gpu degbugger を選択してアタッチすることです。手動で正しいアクセラレータを使用することを確認している限り、これは実際に機能します。

このデバッグは手動でアタッチすることで回りくどい方法で実行できるため、通常の F5 の実行とデバッグで機能することは明らかであり、基本的に同じことをより簡単な方法で実行できます。

これがどのようにセットアップされて通常どおりに機能するのか、そして私の困難の理由は何かについて、非常に興味があります。

注意 問題と回避策がよくわからなかったので、別の表現とタグでこれについて投稿しました。私はその投稿を削除し、代わりにこれを書きました。

0 投票する
3 に答える
1134 参照

c++ - C++AMP の parallel_for_each でユーザー指定の関数を使用する

私は現在、ライブラリを作成中です。ユーザーが関数 ( として宣言restrict( amp )) を定義できるようにし、この関数をライブラリ関数の 1 つに渡してconcurrency::parallel_for_eachループ内で使用できるようにしたいと考えています。例えば:

関数ポインターをカーネル内の関数自体に直接f置き換えるかのように、有効な AMP 互換関数として宣言されている場合、これが機能することを期待します。fすべてが期待どおりに機能します。ただし、使用fすると次のエラーが発生します。

関数ポインター、関数参照、またはメンバー関数へのポインターはサポートされていません。

ユーザーがラムダ以外のファンクターを使用できないようにすることなく、目的の動作を得る方法はありますか?

0 投票する
2 に答える
595 参照

c++ - parallel_for_each コンテキストでの配列コピー

私はAMP C++ の初心者です。「parallel_for_each」関数内で「memcpy」を使用するとすべて正常に動作しますが、それがベスト プラクティスではないことはわかっています。「copy_to」を使用しようとしましたが、例外が発生します。以下は、私が問題を抱えているという問題に焦点を当てた単純化されたコードに従います。前もって感謝します。

0 投票する
1 に答える
587 参照

c++-amp - ポインター配列 GPU のデータを削除した後、C++ Amp GPU データが解放されない (動的割り当て)

バイナリ コードは、Microsoft Process Explorer v16.04 でテストされています。

C++ AMP での配列 (または array_view) の動的割り当ての問題をテストしました. P_GPU ポインターを削除した後、GPU メモリが解放されないことがわかりました!!

このプログラムは Matlab でテストされました ... (mexFunction)-> 同じ問題があります... .. P_GPU を削除します。

matlab で行列の動的割り当て (GPU C++AMP) を行う必要があります。トリックは見つかりましたが、GPU メモリで行列の割り当て解除 (削除) を行うと複雑になります.... ???? GPU メモリの割り当てを解除します ...