問題タブ [pycuda]

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 投票する
2 に答える
411 参照

cuda - CUDAでマトリックスの安定性をチェックするための効率的な方法

多くのアルゴリズムは、特定の収束基準に達するまで繰り返されます(たとえば、特定のマトリックスの安定性)。多くの場合、反復ごとに1つのCUDAカーネルを起動する必要があります。私の質問は、最後のカーネル呼び出しの過程で行列が変更されたかどうかを効率的かつ正確に判断するにはどうすればよいでしょうか。同様に満足できないと思われる3つの可能性があります。

  • カーネル内でマトリックスが変更されるたびにグローバルフラグを書き込みます。これは機能しますが、非常に非効率的であり、技術的にスレッドセーフではありません。
  • アトミック操作を使用して上記と同じことを行います。繰り返しますが、最悪のシナリオではスレッドごとに1つのグローバル書き込みが発生するため、これは非効率的です。
  • 削減カーネルを使用して、行列のパラメーター(合計、平均、分散など)を計算します。これは場合によっては高速かもしれませんが、それでもやり過ぎのようです。また、行列が変更されたが、合計/平均/分散が変更されていない(たとえば、2つの要素が交換された)場合を想像することもできます。

上記の3つのオプションのいずれか、またはベストプラクティスと見なされる、および/または一般的により効率的な代替手段はありますか?

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

cuda - カーネルパラメータを変更するとリソースが枯渇するのはなぜですか?

CUDAを練習するために、以下の非常に単純なカーネルを作成しました。

現在、上記のコードを実行すると、forループの最初の反復が正常に実行されます。ただし、ループの2回目の反復中に、次のエラーが発生します。

行を削除するwidth -= 1と、エラーはなくなります。何故ですか?カーネルのパラメータを2回変更することはできませんか?参考までに、こちらをご覧くださいclouds.jpg

ここに画像の説明を入力してください

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

python - PyCuda の cudaBindTextureToArray

PyCuda を使用して GPU に既にある配列をテクスチャにバインドする方法はありますか?

cuda.bind_array_to_texref(cuda.make_multichannel_2d_array(...), texref)CPU 上の配列をテクスチャにバインドするは既にありますがcudaBindTextureToArray、配列が既にデバイス上にある場合、PyCuda で同等のものを見つけることができませんでした。たとえば、次のようにします。

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

python - CUDA で同等の scipy.interpolate.griddata

Python で Fitted Value Iteration (FVI) を実行しようとしています (区分的線形補間を使用して 5 次元関数を近似することを含む)。

scipy.interpolate.griddata はこれに最適です。ただし、補間ルーチンを数千回呼び出す必要があります (FVI は MC ベースのアルゴリズムであるため)。

したがって、基本的に、関数が既知のポイントのセットは静的です (そして大きい - たとえば 32k) が、近似する必要があるポイント (元のセットの小さな摂動) は非常に大きい (32k x 5000 と言います)。

CUDA に移植された scipy.interpolate.griddata の実装はありますか? あるいは、何らかの方法で計算を高速化する方法はありますか?

ありがとう。

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

python - Nポイント間の距離計算のpyCUDAベンチマークでの残念な結果

次のスクリプトは、ベンチマーク用に設定されています。ユークリッド L2 ノルムを使用して N ポイント間の距離を計算します。3 つの異なるルーチンが実装されています。

  1. scipy.spatial.distance.pdist関数を使用した高度なソリューション。
  2. かなり低レベルの OpenMP を利用したscipy.weave.inlineソリューション。
  3. pyCUDA を利用した GPGPU ソリューション。

GTX660 (2GB RAM) を使用した i5-3470 (16GB RAM) でのベンチマーク結果は次のとおりです。

pyCUDA のパフォーマンスには少しがっかりしています。私は CUDA を初めて使用するので、ここで何かが欠けている可能性があります。では、問題の核心はどこにあるのでしょうか? グローバル メモリ帯域幅の限界に達していますか? ブロックサイズとグリッドサイズの選択が悪い?

編集:

ハッシュバン行を追加しました

ファイルの先頭に追加し、実行可能にしました。weave.inlineとを使用して計算をコメントアウトした後scipy.spatial.distance.pdist、NVIDIA Visual Profiler は次の結果を表示します。

NVIDIA ビジュアル プロファイラー

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

c++ - 2次元行列を乗算します。

2つの配列で反復するにはどうすればよいですか?

入力: X = [[1,2], [3,4], [5,6], [7,8], [9,10]]およびY = [[0,0], [1,1]]

期待される出力: [[0, 3], [0, 7], [0, 11], [0, 15]. [0, 19]]

これどうやってするの?私の難しさは、XとYを繰り返すことです。

期待される:

[idx:0 idy:0 = 0] [idx:1 idy:0 = 3] [idx:2 idy:0 = 0] [idx:3 idy:0 = 7] [idx:4 idy:0 = 0] [idx:0 idy:1 = 11] [idx:1 idy:1 = 0] [idx:2 idy:1 = 15] [idx:3 idy:1 = 0] [idx:4 idy:1 = 19]

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

pycuda - PyCUDA + CURAND で多数のランダム シミュレーションを生成する

100000 (1M) までの numDraws の場合、次のことを簡単に行うことができます

ただし、N = 10000000 (10M) の場合、ランダムな値を GPU に転送するときに GPU メモリが不足します。一度に 2 つの問題を解決したいと考えています。(1) GPU を効率的に使用して乱数を生成し、(2) サイズ制限を取り除きます。

今、私はそれを行う最善の方法がわかりません。ここのコードは、「生の」PyCUDA を使用して、CPU で生成された一様乱数から Box-Muller を実行するカスタム通常乱数ジェネレーターを作成する方法を示していますが、CURAND を使用する方が理にかなっていると思います。ただし、PyCuda の CURAND インターフェイスを使用すると、同じサイズ制限が課せられるようです (そして、多くの乱数ジェネレーターが作成され、オーバーヘッドが高くなると思います。これは、PyCUDA CURAND API ドキュメントの警告hereからのものです。したがって、使用する可能性があると思います基礎となる CURAND へのカスタム呼び出しを含む PyCUDA これはすべて推測作業です。

しかし、私の本当の質問は、上記の 2 つの問題を解決する最善の方法です。

例、ポインタ、および提案は大歓迎です。

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

python - pycuda.driver の pycuda ImportError

GPU を操作するためのソースをいくつかコンパイルしようとしています。これにはpycudaを使用します。ソース コードをコンパイルすると、Python からいくつかのエラーが表示されます。

誰かが同様の問題に遭遇しましたか? どうすればこれを解決できますか? GPU (NVIDIA GT520M) と CUDA ツールキット v.5.0 には、Windows 7 64 ビットの最後のドライバーを使用しています。

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

python - ビッグデータを処理するためのPycudaブロックとグリッド

ブロックとグリッドのサイズを知るために助けが必要です。ユークリッド距離、マンハッタン、ピアソン、コサインなど、scipyに基づいてメトリック計算を実行するPythonアプリを構築しています。

プロジェクトはPycudaDistancesです。

小さなアレイで非常にうまく機能するようです。もっと徹底的なテストを行ったところ、残念ながらうまくいきませんでした。movielens set(http://www.grouplens.org/node/73)をダウンロードしました。

100kを使用Movielensして、形状(943、1682)の配列を宣言しました。つまり、ユーザーは943本と1682本の映画が評価されます。分類子ユーザーによるものではないフィルムは、値を0に構成しました。

はるかに大きな配列アルゴリズムでは、機能しなくなります。次のエラーが発生します。

pycuda._driver.LogicError:cuFuncSetBlockShapeが失敗しました:値が無効です。

このエラーを調べて、512スレッドをサポートするAndrewに、ブロックとグリッドを操作する必要がある、より大きなブロックを結合して操作するように指示する説明を見つけました。

アルゴリズムのユークリッド距離配列を小さな配列から巨大な配列まで機能するように適合させるための助けが必要でした。

詳細については、https ://github.com/vinigracindo/pycudaDistances/blob/master/distances.pyを参照してください。

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

python - OS X 10.8 での PyCuda / マルチプロセッシングの問題

私は、それぞれが独自の CUDA デバイスに関連付けられている複数の python プロセスに計算タスクを分散するプロジェクトに取り組んでいます。

サブプロセスを生成するときは、次のコードを使用します。

CudaWorker は別のファイルで次のように定義されています。

このコードを Windows 7 または Linux で実行しても問題はありません。OSX 10.8.2、Cuda 5.0、および PyCuda 2012.1 を搭載した MacBook Pro でコードを実行すると、次のエラーが発生します。

Mac で新しいプロセスをフォークしなくても、PyCuda スクリプトを実行しても問題はありません。この問題は、新しいプロセスを生成するときにのみ発生します。

以前にこの問題に遭遇した人はいますか?