問題タブ [opencl-c]

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

c# - OpenCL を使用してビットマップを純粋な白黒に変換するにはどうすればよいですか

私は WPF - C# プロジェクトを持っており、そこで行っている画像処理を高速化しようとしています。OpenCL と Cloo を使用して実行します。

ビットマップをグレースケールに変更できるカーネルを動作させることができましたが、何らかの理由で、作成した白黒カーネルは完全に黒の画像しか出力しません。

ここに私のカーネル.clコードがあります:

どこが間違っていますか?

ヘルプやヒントをいただければ幸いです。

@ProjectPhysX の役立つアドバイスに基づいて、カーネル コードを更新しました。

画像を OpenCL 画像メモリ バッファーに追加する C# は次のとおりです。

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

opencl - OpenCLのcudaSetDeviceに相当しますか?

1 gpu 用に作成した関数があり、1 セットの引数で 10 秒間実行され、通過する引数の非常に長いリストがあります。AMD gpu の両方を使用したいので、2 つのスレッドを起動し、引数 gpu_idx 0 を持つスレッド 0 と引数 gpu_idx 1 を持つスレッド 1 で関数を実行するラッパー コードがあります。

別のマシン用のcudaバージョンがあり、実行checkCudaErrors(cudaSetDevice((unsigned int)device_id));して目的の動作を取得するだけです。

openCL を使用して、次のことを試みました。

context は *c ファイル内の静的変数であり、後でカーネルを作成するときに再度使用します。

このコードは、device_idx 0 のみ、または device_idx 1 のみで実行した場合に機能し、2 つのターミナル ウィンドウで手動で実行可能ファイルを device_idx 0 と device_idx 1 で「同時に」実行した場合でも機能します。

しかし、スレッドが「あまりにも」同時実行されているため、このコードが機能しません。実際、スリープの量 (上記のコメント) に応じて、異なる動作が得られます (両方のスレッドが gpu 0 で動作する場合もあれば、両方のスレッドが gpu 1 で動作する場合もあり、両方のスレッドが両方の gpu でバランスが取れている場合もあります)。睡眠時間が短すぎるCL_INVALID_CONTEXTと、次のようになります。まったく眠らないと、次のようになりますCL_INVALID_KERNEL_NAME

私が言ったように、gpu 0 または gpu 1 だけで実行している場合はエラーは発生しません。スレッド 0 の device_idx 0 と同時に、このコードを呼び出す複数のスレッドを (go から extern C 関数を使用して *so として) 生成する場合のみです。スレッド 1 の device_idx 1。

どうすれば問題を解決できますか? 私は、1 つの GPU で動作する実行可能ファイルがあり、そのためにどの GPU を指定するかという考えに執着しており、その仕様を尊重する必要があります。

両方のデバイスを使用する必要があり、一方が他方から完全に分離されている場合、デバイスを選択する適切な方法は何ですか?