0

CL_FLOAT 形式の画像があり、すべての RGBA チャンネルを保存しています。これで、画像の 4 番目のピクセルごとに整数が格納され、次のように古典的に格納されます。

image[i * 4 + 3].x = *(float*)(&someInt);
image[i * 4 + 3].y = *(float*)(&someInt2);
etc.

そして、これらを整数 (フロートではなく) にする必要があるため、残りのピクセルはフロートを格納する必要があるため、ここには多くのオプションがありません。

OpenCL から画像を読み取ると、値が正しく取得されますが、OpenCL カーネルで問題が発生します。

このような画像を読むときはいつでも(サンプラーは最も近いフィルタリングに設定されています):

float4 fourthPixel = read_imagef(img, sampler, coords);

そして、私はそれを整数に変換しようとします

int id = as_int(fourthPixel.x);

正しい数値を読み取れません (数値が整数形式で非常に大きい場合を除き、常に 0 を返します)。

これまでのところ、ほとんどポイントを獲得していません.1505353234のような番号を保存すると、6539629947781120.000000が返されます.これは正しいです. 小さい数値を格納すると、read_imagef はクランプしてから 0 に下げるようです。

したがって、すべての非正規化数がゼロに抑えられることは明らかです。したがって、さらに命令を追加せずに、実際に read_imagef に非正規化された数値をゼロに固定しないようにする良い方法はありますか (0x7f000000 などを追加することもできますが、コードにパフォーマンスが必要なため、この解決策は受け入れられません)。

4

1 に答える 1

0

したがって、 read_imagei を介した画像の読み取りは正常に機能するようです。また、仕様を調べたところ、デバイスが非正規化された浮動小数点数をゼロにクランプできることがわかりました。

于 2013-03-29T03:07:44.183 に答える