問題タブ [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.
python - 2 gpu で Pycuda を Mpi4py と連携させる
2 つの gpu で pycuda プログラムを実行しようとしています。Talonmies によるスレッド ライブラリを使用した方法を説明したすばらしい投稿を読みました。この投稿では、mpi4py でこれが可能であると述べられています。
pycuda で mpi4py を実行すると、プログラムで次のエラーが表示されます:
おそらくこれは、2 つの GPU デバイスを同時に初期化しようとしたことが原因です。2 つの gpu を mpi4py で動作させる方法の非常に短い例はありますか?
python - Python での自動 CudaMat 変換
ある種の CUDA を使用して、すべて行列演算である Python コードの高速化を検討しています。現在、私のコードは Python と Numpy を使用しているため、PyCUDA や CudaMat などを使用してコードを書き直すことはそれほど難しくないようです。
しかし、CudaMat を使用した最初の試みで、すべての操作を GPU に保持するために、多くの方程式を再配置する必要があることに気付きました。これには、多くの一時変数の作成が含まれていたため、操作の結果を保存できました。
なぜこれが必要なのかは理解できますが、かつては読みやすかった方程式が、正しいかどうかを調べるのが困難なややこしいものになります。さらに、変換された形式ではない方程式を後で簡単に変更できるようにしたいと考えています。
パッケージ Theano は、最初に操作のシンボリック表現を作成し、次にそれらを CUDA にコンパイルすることでこれを実現しています。しかし、Theano を少し試してみたところ、すべてが不透明であることに不満を感じていました。たとえば、myvar.shape[0] の実際の値を取得するだけでは、かなり後になるまでツリーが評価されないため、困難になります。また、Numpy の代わりに目に見えない形で動作するライブラリにコードが準拠しているフレームワークをあまり好まないでしょう。
したがって、私が本当に欲しいのは、もっと単純なものです。自動微分 (必要に応じて OpenOpt のような他のパッケージがあります)、またはツリーの最適化は必要ありませんが、標準の Numpy 表記から CudaMat/PyCUDA/somethingCUDA への変換だけが必要です。実際、テスト用の CUDA コードなしで Numpy として評価できるようにしたいと考えています。
私は現在、これを自分で書くことを検討していますが、そのようなベンチャーを検討する前に、他の誰かが同様のプロジェクトや良い出発点を知っているかどうかを知りたいと思っていました. これに近い可能性があると私が知っている他のプロジェクトは SymPy だけですが、この目的に適応するのがどれほど簡単かはわかりません。
私の現在の考えは、Numpy.array クラスのように見える配列クラスを作成することです。唯一の機能は、ツリーを構築することです。いつでも、そのシンボリック配列クラスを Numpy 配列クラスに変換して評価できます (1 対 1 のパリティもあります)。あるいは、配列クラスをトラバースして、CudaMat コマンドを生成することもできます。最適化が必要な場合は、その段階で実行できます (たとえば、操作の並べ替え、一時変数の作成など)。何が起こっているのかを調べるのを邪魔することはありません。
ご意見/ご感想/その他 これで大歓迎です!
アップデート
使用例は次のようになります (ここで、sym は理論上のモジュールです)。ここでは、勾配の計算などを行っている可能性があります。
この場合、grad_W
実際には、実行する必要のある操作を含む単なるツリーになります。式を通常どおり (つまり Numpy 経由で) 評価したい場合は、次のようにすることができます。
これは、ツリーが表す Numpy コマンドを実行するだけです。一方、CUDA を使用したい場合は、次のようにします。
これにより、ツリーが CUDA を介して実行できる式に変換されます (これは、いくつかの異なる方法で発生する可能性があります)。
そうすれば、(1) test grad_W.asNumpy() == grad_W.asCUDA()
、および (2) 既存のコードを CUDA を使用するように変換するのは簡単です。
python - Visual Profiler を使用して PyCuda コードをプロファイリングする方法は?
新しいセッションを作成し、Visual Profiler に python/pycuda スクリプトを起動するように指示すると、次のエラー メッセージが表示されます。Execution run #1 of program '' failed, exit code: 255
これらは私の好みです:
- 発売:
python "/pathtopycudafile/mysuperkernel.py"
- 作業ディレクトリ:
"/pathtopycudafile/mysuperkernel.py"
- 引数:
[empty]
Ubuntu 10.10 で CUDA 4.0 を使用しています。64ビット。コンパイルされた例のプロファイリングは機能します。
ps私はSOの質問を知っていますLinuxでPyCudaコードをプロファイリングする方法は? 、しかし、無関係な問題のようです。
最小限の例
pycudaexample.py:
設定例
エラーメッセージ
cuda - リソース不足による CUDA 起動の失敗を診断するにはどうすればよいですか?
(PyCUDA を介して) CUDA カーネルを起動しようとすると、リソース不足のエラーが発生します。不足しているリソースをシステムに教えてもらうことができるかどうか疑問に思っています。明らかに、システムはどのリソースが使い果たされているかを知っています。それも照会したいだけです。
占有計算機を使用しましたが、すべて問題ないように見えます。カバーされていないコーナーケースがあるか、間違った使い方をしています。私は<= 63を使用していて、CC 2.1デバイスの1x1x1ブロックと1x1グリッドでまだ失敗しているため、レジスタではないことを知っています(これは通常の原因のようです)。
助けてくれてありがとう。NVidia ボードにスレッドを投稿しました。
http://forums.nvidia.com/index.php?showtopic=206261&st=0
しかし、応答がありませんでした。答えが「システムにその情報を要求することはできません」である場合、それも知っておくとよいでしょう (一種の... ;)。
編集:
私が見た中で最も多くのレジスタの使用は 63 でした。それを反映するために上記を編集しました。
numpy - Pycudaがnumpy行列転置を台無しにする
に変換すると、転置行列が異なって見えるのはなぜpycuda.gpuarray
ですか?
これを再現できますか?何が原因でしょうか? 間違ったアプローチを使用していますか?
サンプルコード
出力
cuda - PyCUDA から `prepare` 関数を使用する方法
PyCUDA で共有メモリを割り当てるために、正しいパラメータをprepare
関数(およびprepared_call)に渡すのに問題があります。PyCUDA に渡す変数の 1 つが意図したものではなく、このようにエラー メッセージを理解しています。しかし、変数がどこから来たのかわかりません。long
float32
さらに、公式の例とドキュメントはprepare
block
、必要かどうかに関して互いに矛盾しているように思えますNone
。
出力
matrix - PyCUDA-PythonからC++CUDAコードへの参照による行列の受け渡し
2つの行列Nx3とMx3を取得し、行列NxMを返すPyCUDA関数を作成する必要がありますが、列の数がわからないと、参照によって行列を渡す方法がわかりません。
私のコードは基本的に次のようなものです。
これをコンパイルすると、エラーが発生します。
つまり、関数の宣言でres[][]の列数としてMを使用することはできません。列数を宣言しないままにすることもできません...
出力として行列NxMが必要ですが、これを行う方法がわかりません。手伝って頂けますか?
cuda - ループ展開中に「リソース不足」エラーが発生しました
カーネルで展開ループを 8 から 9 に増やすと、out of resources
エラーで中断します。
リソース不足による CUDA の起動失敗を診断するにはどうすればよいですか?を読みました。パラメータの不一致とレジスタの使いすぎが問題になる可能性がありますが、ここではそうではないようです。
n
私のカーネルは、点と重心の間の距離を計算し、m
各点について最も近い重心を選択します。8 次元では機能しますが、9 次元では機能しません。dimensions=9
距離計算のために 2 行を設定してコメントを外すと、pycuda._driver.LaunchError: cuLaunchGrid failed: launch out of resources
.
この動作の原因は何だと思いますか? out of resources
*の原因となるその他の iusses は何ですか?
Quadro FX580 を使用しています。これが最小限の(っぽい)例です。実際のコードで展開するには、テンプレートを使用します。
pycuda - PyCUDAの既存のnumpy配列からページロックされたメモリを作成するには?
PyCUDAのヘルプでは、空またはゼロの配列を作成する方法は説明されていますが、既存の numpy 配列をページロック メモリに移動 (?) する方法は説明されていません。numpy 配列のポインターを取得してに渡す必要がありpycuda.driver.PagelockedHostAllocation
ますか? そして、どうすればそれを行うことができますか?
アップデート
<--狙撃 -->
更新 2
助けてくれてありがとうタロンミー。現在、メモリ転送はページロックされていますが、プログラムは次のエラーで終了します。
これは更新されたコードです:
c - pyCUDA vs C performance differences?
I'm new to CUDA programming and I was wondering how the performance of pyCUDA is compared to programs implemented in plain C. Will the performance be roughly the same? Are there any bottle necks that I should be aware of?
EDIT: I obviously tried to google this issue first, and was surprised to not find any information. i.e. I would have excepted that the pyCUDA people have this question answered in their FAQ.