繁体   English   中英

装配中纯粹的高位乘法?

[英]Pure high-bit multiplication in assembly?

要实现0到1之间的实数,通常使用ANSI浮点数或双精度数。 但是0到1之间的固定精度数(模数为1的小数)可以有效地实现为32位整数或16位字,它们像正常的整数/字一样添加,但是乘以“错误的方式”,这意味着当你乘以X倍时是的,你保留了产品的高位。 这相当于乘以0.X和0.Y,其中X的所有位都在小数点后面。 同样,-1和1之间的带符号数也可以通过一个额外的位和一个移位来实现。

如何在C中实现固定精度mod 1或mod 2(特别是使用MMX或SSE)? 我认为这种表示对于单位矩阵的有效表示非常有用,对于数值密集的物理模拟。 它使更多MMX / SSE具有整数量,但您需要更高级别的PMULHW访问权限。

如果16位定点运算足够且您使用的是x86或类似架构,则可以直接使用SSE。

SSE3指令pmulhrsw直接在硬件中实现带符号的0.15定点算术乘法(在你称之为mod 2,从-1 .. + 1)。 添加与标准16位向量操作没有什么不同,只是使用paddw

因此,一次处理乘法和添加八个带符号的16位定点变量的库可能如下所示:

typedef __v8hi fixed16_t;

fixed16_t mul(fixed16_t a, fixed16_t b) {
    return _mm_mulhrs_epi16(a,b);
}

fixed16_t add(fixed16_t a, fixed16_t b) {
    return _mm_add_epi16(a,b);
}

允许以您喜欢的任何方式使用它;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM