【问题标题】:Is there a way to force PMULHRSW to treat 0x8000 as 1.0 instead of -1.0?有没有办法强制 PMULHRSW 将 0x8000 视为 1.0 而不是 -1.0?
【发布时间】:2012-08-29 15:14:17
【问题描述】:

为了处理 8 位像素,在不丢失信息的情况下进行伽马校正等操作,我们通常对值进行上采样,以 16 位或其他方式工作,然后将它们下采样到 8 位。

现在,这对我来说是一个新领域,所以请原谅不正确的术语等。

出于我的需要,我选择在“非标准”Q15 中工作,我只使用范围的上半部分 (0.0-1.0),并且 0x8000 代表 1.0 而不是 -1.0。这使得在 C 中计算事物变得更加容易。

但是我遇到了 SSSE3 的问题。它具有将 Q15 数字相乘的 PMULHRSW 指令,但它使用 Q15 的“标准”范围是 [-1,1-2⁻¹⁵],因此将(我的)0x8000(1.0)乘以 0x4000(0.5)得到 0xC000(- 0.5),因为它认为 0x8000 是 -1。这很烦人。

我做错了什么?我应该将像素值保持在 0000-7FFF 范围内吗?这不是违背了它作为定点格式的目的吗?有没有解决的办法?也许有什么技巧?

关于 Q15 是否有某种明确的论文讨论了所有这些?

【问题讨论】:

  • 好吧,你总是可以抛出一个特殊情况来处理 0x8000.. 除此之外,我不知道。
  • 我知道,但是在紧密的内循环中的特殊情况会扼杀速度优势,而且同时为 4 个通道执行此操作更麻烦。
  • 它可能仍然比 C 代码快。它只需要一个转变和一个 pblendvb。或者总是与 0x7FFF 进行 AND 真的是正确的吗?
  • 我也遇到过这个问题,我同意这很烦人。这是 AltiVec 做对但 SSE 损坏 (IMNVHO) 的众多案例之一。
  • 我在加权平均方案中成功使用了预乘值。左侧有在00x7fff 范围内的值,表示从0.01.0 的权重(精确),另一侧是要加权的值,它们是任意数字一般低于1.0。我将这些值乘以 32768.0/32767.0 的因子(这基本上相当于将每个大于 2^14 的值加 1),实际上由于 PMULHRSW 所做的舍入,整个范围内的精度没有损失。跨度>

标签: image-processing assembly sse fixed-point


【解决方案1】:

就我个人而言,我会采用将最大值限制为 0x7FFF(~0.99something)的解决方案。

  • 您不必费尽心思让处理器按照您想要的方式工作
  • 您不必花很长时间记录“奇怪”代码的来龙去脉,因为代码的读者可以立即识别出超过 0-0x7FFF 的操作 - Q-format 已被理解(在我的经验)从-1.0 运行到+1.0-one lsb。否则算术不会那么好,因为 1 lsb 的值在 0 的每一侧都是不同的!

除非您可以想象自己成功地向一群争论不休的代码审查者辩称,那额外的一点对算法的运行至关重要,而不仅仅是“最后 0.01% 的性能”,坚持每个人都能理解的代码,以及哪些映射到您可用的硬件。


或者,重新安排您之前的操作,以便所有像素都与您最初的操作相反。或者下面的操作来接受你之前发送的否定。然后以 Q15 格式使用从 -1.00.0 的值。

【讨论】:

  • 这就是我可能最终会做的事情。这意味着 PMULHRSW 不能乘以 1.0,因此结果总是偏向黑色 (bourt.com/blog/?p=448)。
  • 我刚刚发现了这个并且正要建议第二个选项。为此 +1。
【解决方案2】:

如果您确定不会使用任何比$8000“更大”的数字,那么唯一的问题是至少有一个乘数是$8000(–1,尽管您希望它是 1) .

在这种情况下,解决方案相当简单:

pmulhrsw xmm0, xmm1
psignw xmm0, xmm0

或者,在我们的例子中绝对等价(谢谢,Peter Cordes!):

pmulhrsw xmm0, xmm1
pabsw xmm0, xmm0

这会将负值从乘以 –1 恢复为正值。

【讨论】:

  • SSSE3 pabsw 也可以工作(作为复制和绝对)。它将结果格式化为无符号整数,因此 0x8000 极端情况将保持为 0x8000pabswpsignw 如果它出现为乘法的 结果。 (如果可能的话)。
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2010-12-11
相关资源
最近更新 更多