画像マッピングのGPU実装(opencl)を実行する必要があります。
フォワードマッピングが並列実装に適していることをどこかで読んだことを覚えているようですが、それはなぜですか?
そして、これらのマッピング(できればGPUで)を行う方法に関するサンプルコードを誰かが持っていますか?
画像マッピングのGPU実装(opencl)を実行する必要があります。
フォワードマッピングが並列実装に適していることをどこかで読んだことを覚えているようですが、それはなぜですか?
そして、これらのマッピング(できればGPUで)を行う方法に関するサンプルコードを誰かが持っていますか?
私にとって、並列実装の直感的な選択は、順方向ではなく逆方向のマッピングです。
複数のソースピクセルが単一の宛先ピクセルにマッピングされる場合を考えてみます。フォワードマッピングでは、各ソースピクセルが個別の作業項目として評価された場合、複数の書き込みを調整するために、宛先ピクセルに何らかの同期を実装する必要があります。逆マッピングでは、各ピクセルに1つの作業項目のみが書き込まれることが保証されているため、同期のオーバーヘッドはありません。
OpenCLのimage2d_tおよびsampler_tの概念を画像操作に活用した逆マッピングカーネルコードの例:
__kernel void warp(__read_only image2d_t srcImage,
__write_only image2d_t dstImage,
sample_r sampler)
{
int2 dstCoords = (int2){ get_global_id(0), get_global_id(1)};
int2 srcCoords = my_warp_func_inverse(dstCoords);
float4 srcPixel = read_imagef(srcImage, sampler, srcCoords);
write_imagef(dstImage, dstCoords, srcPixel);
}
もちろん、フォワードマッピングが望ましい場合もあります。たとえば、ソースイメージが非常に大きく、宛先イメージが小さい場合、フォワードマッピングを使用すると、ソースイメージをセグメントに分割し、セグメントデータを__privateまたは__localにキャッシュしてワークアイテムまたはワークグループに分割できます。アドレス空間。マッピング関数の予備知識がないと、逆マッピングでソースイメージの任意の部分にアクセスする必要があり、__グローバルメモリに制限される可能性があります。