問題タブ [cub]
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.
arrays - 多くの小さい、不均等なサイズのアレイのCUDA削減
CUDAで比較的小さいがサイズが異なる多数のアレイの平均/標準偏差を計算するための最良のアプローチを誰かが提案できるかどうか疑問に思っていますか?
SDKの並列削減の例は、単一の非常に大きなアレイで機能し、サイズはブロックあたりのスレッド数の倍数であると便利なようですが、私の場合はかなり異なります。
ただし、概念的には、それぞれに2つのコンポーネントが含まれるオブジェクトが多数あり、これらの各コンポーネントにはupper
と座標があります。すなわちlower
x
y
これらの配列のそれぞれの800
長さはおおよそですが、オブジェクト間で異なります(オブジェクト内ではありません)。
上記は配列を表すための私の方法であり、私のデータはC
構造体などに格納されていないことに注意してください。データは必要な方法で整理できます。重要なのは、各配列について、平均、標準偏差、そして最終的にはヒストグラムを計算する必要があり、1つの特定のオブジェクト内で、配列間の比率と差を計算する必要があるということです。
このデータをGPUデバイスに送信し、スレッドブロック階層を整理するにはどうすればよいですか?私が持っていたアイデアの1つは、すべての配列をゼロパッドして同じ長さにし、各オブジェクトでブロックのグループが機能するようにすることでしたが、このメソッドが機能する場合は、さまざまな問題があるようです。
前もって感謝します
optimization - CUDA におけるグローバル最適化のための費用関数計算
パラメータ( )を使用して関数を最適化しようとしています(最小値を見つけるなど)。すべての は特定の範囲 (たとえば ) にバインドされており、いずれかのパラメーターがこの範囲を離れると、関数は非常に高速に無限大になります。ただし、大きくなる可能性があり ( から約 まで)、その値の計算には長い時間がかかります。n
Xn
Xi
-200
200
n
20
60-70
関数の詳細はあまり重要ではないと思いますが、ここにいくつかを示します。これは、20-30
小さな関数 (すべて異なる) の加重和で構成されており、逆関数の符号の下の内積の和で構成されています。正弦関数 ( arcsin
、arccos
、arctan
など)。のようなものarcsin(X1 . X2) + arcsin(X4 . X7) + ...
。
関数には一般に多くの極小値があるため、(単純な) 共役勾配や準ニュートンなどのアプローチは役に立ちません。ドメイン全体を力ずくで検索するのは遅すぎます。
私の最初のアイデアは、遺伝的アルゴリズムと組み合わせてある種の大規模な並列化を使用することでした。これは、関数のドメイン内のさまざまな場所で多くの検索を実行し、検索の一部が極小値に達したかどうかを定期的にチェックします。はいの場合、それらを比較し、最小のものを除くすべての結果を破棄し、適度に小さい値が見つかるまで検索を続けます。
私の2つの質問は次のとおりです。
1) この問題を CUDA または同様の技術で実装することは可能ですか? CUDA はこのような関数の値を十分に高速に計算できますか?
2) マルチコア PC (12 コア以上) で問題を実装する方が良い/速いですか?
sorting - CUDAのキーによる(小さな)配列のソート
次のようなソートされていないキーと値のペアのブロックを取る関数を作成しようとしています
同じキーを持つペアの値を減らしながら、キーで並べ替えます。
現在、私は__device__
以下のような関数を使用しています。これは基本的に、同じキーの値を結合し、古いデータを無限に大きな値に設定するビットニックソートであり(99
今のところ使用しています)、後続のビットニックソートがふるいにかけられますそれらを一番下に移動し、配列を の値で切り取りますint *
。
これは、データの小さなセットでは問題なく機能しますが、大きなセット (ただし、1 つのブロックのサイズ内) では、1 回の呼び出しでは機能しません。
同じ関数でソートとリダクションを組み合わせようとするのは賢明ですか? 明らかに、関数は複数回呼び出す必要がありますが、そのサイズに基づいてすべてのデータを使い果たすために呼び出す必要がある回数を正確に判断することは可能ですか?
または、次のような方法で個別に削減を実行する必要があります。
最も効率的なソリューションを考え出そうとしていますが、CUDA と並列アルゴリズムの経験は限られています。
cuda - CUDAの削減
私はCUDAプログラミングを学び始めたばかりで、リダクションについて混乱しています。
グローバル メモリは共有メモリに比べてアクセス遅延が大きいことはわかっていますが、共有メモリと同様の動作を (少なくとも) シミュレートするためにグローバル メモリを使用できますか?
たとえば、長さが正確にある大きな配列の要素を合計したいBLOCK_SIZE * THREAD_SIZE
(グリッドとブロックの次元はどちらも のべき乗です2
)。以下のコードを使用しようとしました:
このコードの結果と、ホスト上で連続して生成された結果を比較したところ、奇妙なことに、結果が同じ場合もあれば、明らかに異なる場合もあります。ここでグローバルメモリを使用することに関連する理由はありますか?
cuda - 複数の k-selection の cuda および cub 実装
複数の上位 k 選択を並行して実装しようとしています。各選択では、n 要素のリストから k 要素が選択され、そのようなタスクが並行して実行されます。私はそれを行うために cub を使用します。奇妙なエラーが発生し、どこが間違っていたのかわかりません。私の理解に明らかな誤りがあるように感じます。誰かが私を確認するのを手伝ってくれますか?
編集:
cudaDeviceSynchronize()
を含む2つのコードセクションのそれぞれの前に、2つの呼び出しを追加して機能させましたfree()
。だから今私の質問は、私がここで尋ねた別の質問とは対照的に、非同期呼び出しが許可されていないという点で、 とfree
は異なる動作をしますか?cudaFree
sorting - cub BlockRadixSort: 大きなタイル サイズを処理する方法、または複数のタイルを並べ替える方法は?
cub::BlockRadixSort を使用してブロック内の並べ替えを行う場合、要素の数が多すぎる場合、どのように対処すればよいでしょうか? タイル サイズを大きくしすぎると、一時ストレージ用の共有メモリがすぐにそれを保持できなくなります。複数のタイルに分割した場合、各タイルを並べ替えた後、どのように後処理するのでしょうか?