1

私は最近OpenCLをいじっていますが、深刻な制限に遭遇しました。カーネルにポインターの配列を渡すことはできません。これにより、たとえば画像の任意のサイズのリストをカーネルに渡すことが困難になります。私はこれについていくつか考えましたが、誰かが彼らがうまくいくかどうかを確実に言うことができるか、またはより良い提案を提供できるかどうか疑問に思いました。

カーネルに渡したいx個の画像オブジェクトがあるとしましょう。それらがすべて2Dのみである場合、1つの解決策は、それらすべてを3D画像にパックし、スライスにインデックスを付けることです。これに伴う問題は、画像のサイズが異なる場合、3D画像は最も広い画像の幅、最も高い画像の高さ、および深さが画像の数になる必要があるため、スペースが無駄になることです。

ただし、バッファオブジェクトをカーネルに渡すと、カーネルにポインタとして表示されることも考えていました。任意のデータバッファを取得するカーネルと、ポインタを格納するためだけに指定されたバッファがあり、最初のバッファへのポインタを2番目のバッファの最後に追加した場合(もちろん十分な割り当てスペースがある場合)、デバイス上の他のバッファへのポインタのバッファを保持できます。次に、このバッファを他のカーネルに渡すことができます。他のカーネルは、興味深いキャストを使用して、デバイス上のこれらの任意のバッファにアクセスできます。唯一の問題は、特定のバッファポインタがバッファの存続期間を通じて同じままであるかどうかです。また、画像を渡すと、引数として構造体を取得します。今、この構造体は実際にデバイスメモリにホームを持っていますか?それとも、カーネルに渡されるのに十分な長さですか?これらのことは、ポインタバッファトリックが画像でも機能するかどうかを判断するという点で重要です。

バッファトリックが機能するかどうか誰かが知っていますか?任意のサイズのリストをカーネルに渡すために誰かが考えることができる他の方法はありますか?

編集:バッファトリックは機能しません。私はそれをテストしました。正確な理由はわかりませんが、デバイス上のポインターは、呼び出しごとに同じままではないようです。

4

2 に答える 2

1

ポインタの配列をカーネルに渡すことは意味がありません。ポインタはホストメモリを指しているため、OpenCLデバイスはそれについて何も知りません。データをデバイスバッファに転送してから、バッファポインタをカーネルに渡す必要があります。(マップ/ピン留めされたメモリには、特にAPUの場合、より複雑なオプションがいくつかありますが、ホストポインターがデバイス上で無効であるという主な事実は変わりません)。

私は実際にそれを自分で使用したことはありませんが、1つのアプローチを提案することができます。大きなデバイスバッファが事前に割り当てられている場合は、ホストから連続して画像でいっぱいにすることができます。次に、バッファとオフセットのリストを引数としてカーネルを呼び出します。

于 2012-08-21T19:30:13.553 に答える
0

これは簡単です。参照ほどポインタを使用せず、このようにします。カーネルでは、次の 2 つの引数を指定できます。

kernel void(
   global float *rowoffsets,
   global float *data
) {

ホストでは、単純に 2 次元データを取得して 1 次元配列にコピーし、各行の開始位置のインデックスをrowoffsets

最後の行については、追加の rowoffset を追加して、データの終わりの 1 つ後ろを指します。

次に、カーネルで行からデータを読み取るために、次のようなことができます。

kernel void(
   global float *rowoffsets,
   global float *data,
   const int N
) {
    for( int n = 0; n < N; n++ ) {
        const int rowoffset = rowoffsets[n];
        const int rowlen = rowoffsets[n+1] - rowoffset;
        for( int col = 0; col < rowlen; col++ ) {
            // do stuff with data[rowoffset + col] here
        }
    }
}

明らかに、実際にデータを各ワークアイテムに割り当てる方法はユーザー次第です。そのため、実際のループを使用するか、各ワークアイテムに単一の行と列を与えるかは、独自のアプリケーション設計の一部です。

于 2013-01-23T02:58:17.513 に答える