(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 范围内的无符号值(混合因子)

我认为我的问题是我不确定 pmullwpmulhw 如何(或是否)帮助我完成这项任务。

【问题讨论】:

是否必须仅使用 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的主要内容,如果未能解决你的问题,请参考以下文章

MMX 内部函数和 Microsoft C++ 的堆栈使用

MMX SSE 到 C 代码转换时图像质量下降

将 MMX/SSE 指令移植到 AltiVec

为啥 MMX 中没有 pmulluw、pslad 和 pslaw 命令?

Codeforces Round 256 (Div. 2)

Intel的AVX2指令集解读