問題タブ [pyopencl]
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 - pyopenclで可変サイズの__localメモリを作成するには?
私のC OpenCLコードでは、カーネルで使用clSetKernelArg
する「可変サイズ」__local
メモリを作成するために使用しますが、これはOpenCL自体では利用できません。私の例を見てください:
私の質問は今、pyopenclで同じことをする方法ですか?
pyopencl に付属の例を調べたのですが、テンプレートを使用したアプローチしか見つかりませんでした。例を参照してください。
おすすめは何ですか?
python - PyOpenCLとの構造アライメント
更新:int4
私のカーネルのが間違っていました。
pyopenclを使用していますが、構造体のアライメントを正しく機能させることができません。カーネルを2回呼び出す以下のコードでは、b
値は正しく(1として)返されますが、c
値には「ランダムな」値があります。
言い換えると、構造体の2つのメンバーを読み取ろうとしています。最初は読めますが、2番目は読めません。なんで?
numpy構造体配列を使用する場合でも、structを使用してパックする場合でも、同じ問題が発生します。また、_-attribute__
コメントの設定も役に立ちません。
コードの他の場所で愚かなことをしているのではないかと思いますが、それを見ることができません。助けていただければ幸いです。
出力(切り取り+貼り付け中に再フォーマットする必要があったため、改行が少し混乱した可能性があります。さまざまな印刷値を示すコメントも追加しました):
coding-style - 大規模な OpenCL カーネルを構築する方法
私はいくつかのプロジェクトで OpenCL を使用してきましたが、常にカーネルを 1 つの (場合によってはかなり大きな) 関数として記述してきました。現在、より複雑なプロジェクトに取り組んでおり、複数のカーネルで機能を共有したいと考えています。
しかし、私が見つけることができる例はすべて、カーネルを単一のファイルとして示しています (二次関数を呼び出すものはほとんどありません)。複数のファイルを使用できるように思われます-clCreateProgramWithSource()
複数の文字列を受け入れます(そしてそれらを結合すると思います)-pyopenclProgram()
は単一のソースしか取りません。
ですから、これを行った経験のある人から聞きたいです:
- 複数のソース ファイルに関連する問題はありますか?
- pyopencl が単純にファイルを連結するための最善の回避策はありますか?
- 関数のライブラリをコンパイルする方法はありますか (すべてが使用されていなくても、各カーネルでライブラリ ソースを渡す代わりに)?
- 毎回ライブラリ ソースを渡す必要がある場合、未使用の関数は破棄されますか (オーバーヘッドなし)?
- その他のベストプラクティス/提案はありますか?
ありがとう。
python - C++ グラフ構造を Python/Numpy グラフ構造に変換するには?
免責事項: この投稿の著者は、C++ と Python についての知識は限られていますが、Java と Ruby については十分な知識を持っています。
「OpenCL プログラミング ガイド」ブックの例では、ダイクストラのアルゴリズムを OpenCL デバイスで実行するために、次の OpenCL でカスタマイズされたグラフ データ構造を使用しています。
このデータ構造は、Pawan Harish と PJ Narayanan による論文「CUDA を使用した GPU での大規模なグラフ アルゴリズムの高速化」の例に基づいています。
基本的に、これには 3 つの配列があります。V
各頂点がエッジ配列内の隣接頂点を指す頂点配列E
(頂点の隣接は、配列内の頂点の隣接の直後にi+1
続きます)。3 番目の配列はエッジ ウェイト用です (さらに 2 つの特定の OpenCL 関連の配列があります)。i
E
このデータ構造を Python/Numpy で表現するにはどうすればよいですか? PyOpenCL で使用したいと思います。
python - PyOpenCL vs Clyther vs純粋なOpenCLおよびC99:初心者に最適なものは何ですか?
私には問題があります:高速線形システムの解決(私はそのようなシステムをたくさん持っています)。GPUとOpenCLを使用して解決します。
私はRubyやPythonなどの動的言語が大好きで、Cなどの低水準言語を使用する習慣から抜け出しました。
だから私は2つの同時の目的を持っています:
- できるだけ少ない労力でできるだけ速く線形システムを解くためのこのようなOpenCLソリューションを開発します。
- パフォーマンスを大幅に低下させないでください。利便性のために2〜10倍の減速を支払いたくありませんが、高級言語での作業に30〜50%を支払う準備ができています。
私にとっての最良のケースは次のとおりです。ほとんどPythonコードはOpenCLCでほとんど無駄なくコンパイルされます。
私はそのような解決策を見つけました:純粋なOpenCL C、PyOpenCL、Clyther。
何から始めればいいですか?
python - PyOpenCL-'ビルドは成功しましたが、ログが空ではなくなりました'
PyOpenCLとOpenCL全般(CUDAから)を使い始めたばかりです。この非常に単純なダミーカーネルを使用している場合、次のようになります。
これはビルドステップで取得します。
C:\ Python27 \ lib \ site-packages \ pyopencl \ cache.py:338:UserWarning:ビルドは成功しましたが、ログが空になりませんでした:pyopencl.Deviceでビルド'Intel(R)Core(TM)i5-2410M CPU @ 2.30GHzC:\ Python27 \ lib \ site-packages \ pyopencl__init __。py:173:UserWarning:ビルドは成功しましたが、ログが空になりませんでした:pyopencl.Deviceでビルド'Intel(R)Core(TM)i5-2410M CPU @ 2.30GHz
そして、ここではインタプリタコマンドプロンプトも返されません。プロンプトに戻るにはEnterキーを押す必要があります。実際のメッセージがあるはずなのに、表示されません。ところで、カーネルは正常に動作するので、問題はありません。これはかなり面倒です。これが何であるかについて何か考えはありますか?
opencl - このOpenCLコードを最適化できますか?
私は特殊な行列関数のOpencLコードの一部に取り組んでいます:Dx1
ベクトルv
の場合、2つのDxD
行列A
とB
定数の場合、ベクトルc
を返します。1xD
r
r[i] = c * sum_over_j (v[j] * A[i][j] * B[i][j])
以下は私がこれまでに持っているものですが、それは異常に遅いです。行列を返す合計なしのバージョンDxD
は、約10倍高速です。違いがある場合は、PyOpenCLから呼び出されます。
何か間違ったことはありますか?最適化できますか?
乾杯!
wait - PyOpenCL:Event.wait()とは何ですか?
この関数は、PyOpenCLドキュメントではコメントされていません:http ://documen.tician.de/pyopencl/runtime.html?highlight = enqueue#pyopencl.Event.wait
私の問題は次のとおりです。forループでカーネルを呼び出す必要があり、各呼び出しの後に、を使用してコピー操作をキューに入れますpyopencl.enqueue_copy_buffer(dest, src, size)
。例でこれを見つけたので、最初にこれを.wait()
追加(つまり)で行いました。pyopencl.enqueue_copy_buffer(dest, src, size).wait()
それから私は削除.wait()
し、非常に大幅なスピードアップを得ました。
では、この機能は何のために、そしてどのような条件下でそれを放棄することができるのでしょうか?ありがとう。
python - OpenCL: パラメーターを削除しないと、カーネルが永久にハングする
これは OpenCL 1.1 で、Intel SDK (1.5 x64) を使用しています。PyOpenCL 2011.2。私はLinux(Fedora)を使用しています。
次のコードは を出力します"DERP1"
が、それ以外は何も出力しません。
印刷"DERP1"
してから作業を続けます。
ただし、最初または 2 番目のパラメーター (board
またはboard_size
) を削除すると、プログラムが停止し、[1]
期待どおりに出力されます。
何が起こっている?これを意図したとおりに機能させるにはどうすればよいですか?
編集: top
350% を超える CPU 使用率を一貫して報告します。global_size をboard.shape
(つまり(10, 24)
) から(1,)
(つまり、1 つの次元で 1 つのタスクのみ) に置き換えると、約 100% の CPU 使用率が得られます。私には、これは、この 1 つのタスクが停止せずに永遠にビジー ループを実行していることを示していますが、その理由はわかりません。この 1 つのタスクでは、10*24 タスクと同様に、最初または 2 番目のパラメーターを削除すると停止します。
edit2::これは PyOpenCL の問題だと思いますか? この例をできる限り C に移植しました。その結果はここにありますが、C の例はハングしません。誰かが違いを見つけたり、問題を解決したりできますか?
opencl - clGetDeviceIDsがOpenCLでエラーコード-30で失敗する
ATIFireproV8750を搭載した私のマシンでの次のプログラムの出力は次のとおりです。
(これは、最初のclGetDeviceIDの呼び出しで発生します)。返されるエラーコードは-30です。どういう意味ですか?
デバイスが見つからない理由がわかりません。CLinfo.exeがGPUと使用しているIntelCPUを一覧表示していることを確認しました。ここで何が悪いのかについて、誰かが私のいくつかの指針を与えることができますか?
追加情報:
AMD APP SK 2.4
Fireproドライバー:8.911.3.3_VistaWin7_X32X64_135673
12-4_vista_win7_32_dd_ccc
Windows 7また、fireProDriverの一部のコンポーネントがインストールに失敗したことにも言及する必要があります。
CLINFOの出力は次のとおりです。GPU:
CPU:
ハイライトされた2つのバージョンが異なるのはなぜですか?