(a*b)/256 和 MMX
Posted
技术标签:
【中文标题】(a*b)/256 和 MMX【英文标题】:(a*b)/256 and MMX 【发布时间】:2012-06-22 13:44:40 【问题描述】:我想知道是否可以在 MMX 寄存器中使用四个并行值进行以下计算:
(a*b)/256
其中 a 是有符号字,b 是 0-256 范围内的无符号值(混合因子)
我认为我的问题是我不确定 pmullw 和 pmulhw 如何(或是否)帮助我完成这项任务。
【问题讨论】:
是否必须仅使用 MMX 来完成?它已经过时了。 那怎样才能做得更快呢? 您可以使用 SSE2 并行处理 8 个值,而不仅仅是使用 MMX 的 4 个。 【参考方案1】:如果您知道 a*b 不会溢出有符号的 16 位字段,那么您可以使用 pmullw(内在 _mm_mullo_pi16
,或 SSE 内在 _mm_mullo_epi16
)然后右移 8 来进行除法256.
在哪里
MMX:
__m64 a, b;
...
a = _mm_mullo_pi16 (a, b);
a = _mm_srli_pi16 (a, 8);
SSE2:
__m128i a, b;
...
a = _mm_mullo_epi16 (a, b);
a = _mm_srli_epi16 (a, 8);
【讨论】:
问题是,a*b 将溢出一个 16 位字段。有没有办法得到管理呢?我将仔细研究 SSE2。谢谢 mattst88! 如果 a*b 溢出 16 位,则可以将 a 或 b 左移 8 位,然后执行 pmulhw。 结果将是正确的,因为结果的那些位只取决于 a 和 b 的低位以上是关于(a*b)/256 和 MMX的主要内容,如果未能解决你的问题,请参考以下文章