問題タブ [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 - PyCUDA: デバイス ステータスのクエリ (具体的にはメモリ)
PyCUDA のドキュメントでは、 Driver Interface呼び出しについて触れていますが、ちょっと考えすぎて、コードから 'SHARED_SIZE_BYTES' などの情報を取得する方法がわかりません。
この方法でデバイスをクエリする例を誰か教えてもらえますか?
デバイスの状態 (malloc/memcpy とカーネルの起動の間など) をチェックして、マシンに動的な操作を実装することは可能ですか? (複数のカーネルをサポートするデバイスを「フレンドリーな」方法で処理できるようにしたいと考えています。
debugging - CUDA/PyCUDA: cuda-gdb で消える起動失敗の診断
cuda-gdb で実行すると消えるカーネル起動エラーの調査方法を知っている人はいますか? メモリの割り当ては仕様の範囲内であり、起動は毎回同じカーネルの同じ実行で失敗し、(これまでのところ) デバッガー内で失敗したことはありません。
ああ、偉大な SO 教祖よ、今は何ですか?
python - pycuda.debug は実際に何をしますか?
大規模なプロジェクトの一環として、奇妙に一貫したバグに出くわしました。これは理解できませんが、典型的な「ブラック ボックス」バグです。で実行するとcuda-gdb python -m pycuda.debug prog.py -args
、正常に実行されますが、遅くなります。pycuda.debug をドロップすると壊れます。一貫して、複数カーネル実行のまったく同じ時点で。
説明する; 私は(現在3つの)カーネルを持っており、異なるグリッドとブロックの配置で使用され、より大きな最適化問題の「スライス」を解決しています。これらは厳密に言えば、機能するかどうかのどちらかです。関数自体には「ここにいくつかのデータがあります」としか言われず、データの内容以外には、入力データが分割されているかどうかにかかわらず、反復回数などの何もわからないためです。ではなく、この時点までは完璧に機能します。
基本的に、デバッグ シンボルを GDB に公開する pycuda.debug なしでは何が起こっているのかわかりませんが、pycuda.debug で問題を確認することもできません。
pycuda は実際に何をするので、カーネル コードで何を探すべきかがわかりますか?
python - PyCUDA; ワークロードを複数のデバイスに動的に分散する方法
PyCUDAには、そのすべての欠点がありますが、通常、非常に優れた例が提供されており、wikiからダウンロードできます。しかし、複数のデバイスにワークロードを動的に割り当てるPyCUDAの方法を示す例やドキュメント(または大まかなグーグル検索)には何も見つかりませんでした。
誰かが私が何をすべきかについて私にヒントを与えるか、私に例を示すことができますか?
私の頭に浮かんだアイデアの1つは、マルチプロセッシングを使用して、それぞれが1つのデバイスに関連付けられたN個のプロセスのプールを生成し、クラスが呼び出されたときです(すべてのGPU関数は別のクラスにありますが、おそらく最良のアイデアではありませんが、動作します)それはラウンドロビンのマルチプロセスです。これはどれくらい良い/遅れたアイデアですか?
PS私の開発マシンは1GPUで、テストマシンは4 GPUであるため、動的な数のデバイスを処理できるソリューションが必要です(異なるコンピューティング機能であることも役に立ちませんが、それが寿命です)
python - PyCUDA/CUDA:非決定論的な起動失敗の原因?
CUDA をフォローしている人は、おそらく私が関与しているプロジェクトに関する私の質問をいくつか見たことがあるでしょうが、まだ見ていない人のために要約します。(事前に長い質問で申し訳ありません)
3 つのカーネル、1 つの入力変数に基づいてデータ セットを生成し (ビットの組み合わせを扱うため、指数関数的に大きくなる可能性があります)、別のカーネルはこれらの生成された線形システムを解き、別のリダクション カーネルは最終結果を取得します。これら 3 つのカーネルは、特定のシステムの最適化アルゴリズムの一部として何度も実行されます。
私の開発マシン (Geforce 9800GT、CUDA 4.0 で動作) では、これは常に完璧に動作します。 、CUDA 3.1 の下で使用される 1 つだけ) まったく同じコード (Python ベース、CUDA カーネルへの PyCUDA インターフェイス) は、「小さな」ケースの正確な結果を生成しますが、中程度のケースでは、解決段階はランダムな反復で失敗します。
このコードで私が経験した以前の問題は、問題の数値的な不安定性に関係しており、本質的に決定論的でした (つまり、毎回まったく同じ段階で失敗する) が、これは率直に言って私を怒らせます。いつでも失敗します。
そのため、Python フレームワークから CUDA コードを切り離して適切なデバッグを行うための信頼できる方法がありません。
デバイスの空きメモリのカーネル呼び出し前のチェックなどの通常のことを確認しました。占有計算では、グリッドとブロックの割り当ては問題ないことがわかりました。クレイジーな 4.0 固有のことはしていません。各反復でデバイスに割り当てたものをすべて解放し、すべてのデータ型を float として修正しました。
TL;DR、CUDA 3.1 に関して、リリース ノートで見たことがない落とし穴や、呼び出しを繰り返すと断続的に起動に失敗する原因となる PyCUDA の autoinit メモリ管理環境の問題に遭遇した人はいますか?
python - PyCUDA による Python マルチプロセッシング
複数の CUDA デバイスに分割したいという問題がありますが、現在のシステム アーキテクチャが妨げになっていると思われます。
私がセットアップしたのは、GPU 上で操作を実行する関数を備えた GPU クラスです (奇妙なことです)。これらの操作はスタイルのものです
N個のデバイスに対してN個のgpuインスタンスがあると想像していましたが、これを適用して各デバイスが非同期に割り当てられるようにする最も簡単な方法を確認するには、マルチプロセッシングについて十分に知りません。処理後の照合結果の具体的なデモンストレーション。
誰かがこの分野の指針を教えてもらえますか?
更新 マルチプロセッシング領域に関するガイダンスを提供してくれた Kaloyan に感謝します。CUDA が特に問題になっていなければ、回答済みとしてマークします。ごめん。
以前、この実装で遊んでいた gpuinstance クラスは CUDA デバイスを開始しましたが、(正しくスコープされた) 各スレッドが cuda コマンドに遭遇するとすぐにエラーをimport pycuda.autoinit
スローして、うまくいかなかったようです。次に、クラスinvalid context
のコンストラクターで手動で初期化を試みました...__init__
ここでの私の仮定は、gpuinstances のリストが作成されてからスレッドがそれらを使用するまでの間、コンテキストが保持されているため、各デバイスは独自のコンテキストで適切に配置されているということです。
(pop/detach
クリーンアップを処理するためにデストラクタも実装しました)
問題は、invalid context
スレッドが CUDA に触れようとするとすぐに例外が表示されることです。
アイデアはありますか?そして、ここまで来れたおかげです。回答に「バナナ」を使用している人々に自動的に賛成票を投じます! :P
python - PyCUDA+Threading = カーネル呼び出しの無効なハンドル
これを明確にしようと思います。
2 つのクラスがあります。GPU(Object)
、GPU機能への一般的なアクセス、およびmultifunc(threading.Thread)
特定の機能について、マルチデバイス化しようとしています。GPU
後続のすべてのユースケースに必要な「初めての」処理のほとんどが含まれているため、引数として渡されたインスタンスで (通常のキューなどとともに)からmultifunc
呼び出されます。GPU
self
__init__
残念ながら、次のようにmultifunc
クラップアウトします:
呼び出しの最初のポートはもちろんブロックの寸法でしたが、それらは十分に範囲内にあります (block=(1,1,1)
グリッドと同様に、強制しても同じ動作です。
基本的に、 内multifunc
では、通常の CUDA memalloc などの関数はすべて正常に動作します (コンテキストの問題ではないことを意味します)。したがって、問題SourceModule
はカーネル関数自体の ing にあるに違いありません。
ファイルスコープのすべてのCUDAコードを含むカーネルテンプレートがありjinja2
、初期化でテンプレート化が行われGPU
ます。そのテンプレート化されたSourceModule
オブジェクトが でオブジェクトに変換されてGPU
に渡されるmultifunc
かどうか、またはmultifunc
同じことが起こるかどうかに関係なく。
Google はこの特定の問題に対してほとんど役に立ちませんでしたが、スタックに従って、Invalid Handle
参照されているのはブロック ディメンションで起こっている奇妙なことではなく、カーネル関数ハンドルであると想定しています。
これが非常にまれな状況であることは承知していますが、私が見逃した問題を誰かが見ることができると確信しています。
cuda - 「Cuda/PyCuda for Dummies」チュートリアルはどこにありますか
夏の間、GPU プログラミングの方法を学びたいと思っています。私はすべての言語/ライブラリを受け入れていますが、PyCuda に最も興味があります。
私は強いプログラマーではありません。必要なほとんどのプログラムを Java で作成し、C の基本を理解できますが、後者で複雑なことをしようとすると、segfault または malloc エラーがほぼ確実に発生します。
したがって、「ダミー用」のチュートリアル/ガイド/ドキュメントが本当に必要です。理想的には、ガイドは GPU プログラミングの基本からかなり複雑な科学的/数値的プログラミングに至るまで機能し、事前の知識を当然のこととは思わない明快さと深さで各詳細を説明します。
linux - CUDA / PyCUDA:どのGPUがX11を実行していますか?
複数のGPUを備えたLinuxシステムで、X11を実行しているGPUと、CUDAカーネルを完全に無料で実行できるGPUをどのように判断できますか?X11を実行するための低電力GPUとカーネルを実行するための高電力GPUを備えたシステムでは、これは、より高速なカードを使用するためのいくつかのヒューリスティックで決定できます。ただし、2枚の等しいカードがあるシステムでは、この方法は使用できません。これを決定するためのCUDAおよび/またはX11APIはありますか?
更新:コマンド'nvidia-smi -a'は、「ディスプレイ」が接続されているかどうかを示します。これが物理的に接続されているのか、論理的に接続されている(X11を実行している)のか、またはその両方を意味するのかはまだわかりません。このコマンドでstraceを実行すると、多くのioctlが呼び出され、X11が呼び出されないことが示されるため、カードがディスプレイが物理的に接続されていることを報告していると想定します。
cuda - PyOpenCL のようにテンプレートなしで共有メモリに配列を作成する
公式の例に見られるように、テンプレートを使用してカーネルを変更せずに共有メモリに配列を作成するにはどうすればよいですか。または、テンプレートを使用するのが公式の方法ですか?
PyOpenCL では、カーネル引数を設定してローカル メモリに配列を作成できます