【问题标题】:Pure high-bit multiplication in assembly?汇编中的纯高位乘法?
【发布时间】:2012-05-07 07:25:10
【问题描述】:

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

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

【问题讨论】:

    标签: c assembly x86


    【解决方案1】:

    如果 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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2017-03-11
      • 2012-04-05
      • 2016-05-12
      • 2013-09-01
      • 1970-01-01
      相关资源
      最近更新 更多