問題タブ [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 - OpenCLを使用してグレースケール画像から完全な白いピクセルをフィルタリングする
私の目標は、値= 255の画像ピクセルを0に変換することです。つまり、すべての真っ白なピクセルを削除します。opencvとopenclを使用したPythonのコードは次のとおりです。
私が直面している問題は、上記のプログラムのようにループを使用すると、ロジックが最初の画像に対してのみ機能することです。つまり、白いピクセルは最初の画像に対してのみ削除されますが、後続の画像には影響がありません。つまり、出力画像は入力画像と同じであり、値=255のピクセルには何の影響もありません。これは単純なはずです。解決策が見つかりません。
この問題の解決にご協力ください。
ありがとうございました。
opencl - OpenCL で特大サイズの画像を処理するにはどうすればよいですか?
私は、OpenCL カーネル (画像フィルターを表す) と画像を取り込み、そのフィルターを適用して出力画像を生成する PyOpenCL プログラムに取り組んできました。問題は、このプログラムを任意のサイズのイメージで実行する必要があることです。
Cloo (http://sourceforge.net/projects/cloo/) フレームワークを使用して C# と OpenCL で同様のプログラムを作成したことがありますが、より移植性の高いものを作成したいと考えていました (Cloo フレームワークは Linux で適切に実行できないため)。 )。
ここで、私の C# 実装では、単純にイメージをチャンクに分割し、各チャンクでカーネルを実行しました。これは、カーネルで画像をプレーンなバイト配列として処理することで実現しました。ただし、私が今抱えている問題は、PyOpenCL 実装で image2d_t データ型を使用しようとしているということです。画像をチャンクに分割してカーネルに渡す方法がわかりません。
image2d_t クラスは、返された画像にパディングを追加しますか (後処理する必要があります)、またはおそらくこれを処理する何らかの自動化された方法論をサポートしていますか?
私を正しい方向に向けるリソースは大歓迎です!
編集:これを行う理由は、現在のビルドでメモリ割り当ての例外が発生したためであることに言及する必要があると考えました(画像が大きすぎるため)。
python - PyOpenCl:セグメンテーション違反をデバッグするには?
OpenCL C カーネル コードを含む PyOpenCL コードがあります。アプリを実行すると、セグメンテーション違反エラーが発生します。デバッガーまたは他の開発ツールでこのようなエラーをデバッグするにはどうすればよいですか? 問題を見つけるために正確に何をすべきかわかりません。または何かのオプションを念頭に置いていますが、printf
より強力なものを使用したいです。
カーネルコードのエラーだと思いますので、まずはカーネルコードをデバッグしたいと思います。
アップデート。私はLinux(Arch Linux、3.6.11)、python 2または3、PyOpenCl 2012.1を使用しています
optimization - OpenCL でオフセット近傍の操作を構造化する高速な方法
OpenCL でより効率的に実行するために、2D 配列の多くの重複しているがオフセットされたブロックに対する操作をどのように構造化できますか?
たとえば、次の OpenCL カーネルがあります。
正しい結果が得られますが、遅いです... 1k x 1k 入力の NVS4200M でわずか 25 GFLOPS です。(ハードウェア仕様は 155 GFLOPS です)。これは、メモリアクセスパターンに関係していると思います。各作業項目は、16x16 領域内のすべての隣接ブロックと同じ 16x16 データ ブロックを 1 つ読み取ります。また、データの別のオフセット ブロックは、ほとんどの場合、すぐ隣のブロックと重複します。すべての読み取りはサンプラーを介して行われます。ホスト プログラムは PyOpenCL (実際には何も変わらないと思います) で、ワーク グループのサイズは 16x16 です。
編集:以下の提案に従ってカーネルの新しいバージョン、作業領域をローカル変数にコピーします:
結果: 出力は正しく、実行時間は56% 遅くなります。(local_src2 ではなく) local_src のみを使用すると、結果は最大 10% 高速になります。
編集: はるかに強力なハードウェアでベンチマークされた、AMD Radeon HD 7850 は 420GFLOPS を取得し、仕様は 1751GFLOPS です。公平を期すために、仕様は乗加算用であり、ここには乗算がないため、予想される値は ~875GFLOPS ですが、理論上のパフォーマンスと比較すると、これはまだかなりずれています。
編集:これを試してみたい人のためにテストを簡単に実行できるように、以下の PyOpenCL のホスト側プログラム:
EDIT : メモリ アクセス パターンを考えると、元の素朴なバージョンはかなり良いかもしれません。ワークグループ内のすべてのワークアイテムを呼び出すとread_imageui(src, sampler, (int2)(pos0.x + i, pos0.y + j))
、同じ場所が読み取られます (つまり、これは 1 つの読み取りに過ぎませんか??)。また、呼び出すとread_imageui(src, sampler, (int2)(pos.x + i, pos.y + j))
、それらは連続した場所を読み取っています (したがって、読み取りを完全に結合できますか??)。
arrays - pyopencl が配列に間違った float3 値を返す
私の pyopencl プログラムは奇妙な動作をしており、opencl カーネルから不正確な値を受け取っていると考えました。
次の例を考えます。
(1, 1, 1) でいっぱいの配列を返すことを期待しています。ただし、出力は次のようになります。
またはこのように
これが OpenCL の問題なのか、PyOpenCL の問題なのか、それとも私がひどく間違ったことをしているのかはわかりません。
どんな助けでも大歓迎です。ありがとうございました。
copy - PyOpenCL、配列フィルター: copy_if と独自のアトミック ベースの実装の比較
私はランダムな整数の配列を持っています。たとえば[132, 2, 31, 49, 15, 6, 70, 18 ... , 99, 1001]
。たとえば、100 を超えるすべての数値の配列を生成し、その配列のサイズを取得したいと考えています。
次の 2 つの方法があります。
- PyOpenCL の新機能
copy_if
。これは、 Prefix SumsGenericScanKernel
をさらに深く掘り下げた場合に基づいてい ます。 - Atomicsを使用した純粋な OpenCL ソリューション
copy_if
常に正しく動作しますか? 私が見ることができるようにcopy_if
、原子を使用していません。を使用してトラブルに直面することは可能copy_if
ですか?
copy_if
アトミックな方法と比較してのパフォーマンスはどうですか?
あなたは何を選びますか、そしてその理由は何ですか?
opencl - 異なるデバイスで実行すると PyOpenCL enqueue_copy がハングする
カーネルを 2 つの異なる OpenCL プラットフォームで実行するのに問題があります。プラットフォームの唯一の違いは、1 つは OpenCL 1.1 で、もう 1 つは 1.2 です。
コードはこのデバイス (OS X 10.8) で動作します:
ターゲット デバイス (Ubuntu 11.04):
次のコードのハングの原因を突き止めました。
2 つのデバイス間でコードの変更はなく、両方のデバイスで PyOpenCL 2013.1 が実行されています。何か不足していますか?どんな提案でも大歓迎です。