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 回答