【问题标题】:Most efficient small-word-size multiply for processors without a hardware multiplier没有硬件乘法器的处理器最有效的小字长乘法
【发布时间】:2023-02-02 09:44:05
【问题描述】:

我希望使用 CH32V003(一个 RV32EC 处理器)来执行 ColorChord,它广泛使用乘加来执行 DFT。但它可以在非常低的位深度、16 位甚至 8 位乘法下运行。但是,CH32V003 中的RV32EC 不支持RV32 乘法扩展。

我已经尝试探索 godbolt 中的选项,请参阅 https://godbolt.org/z/zqTEaeecr 以查看编译器在这些情况下会做什么,但它似乎只调用 __mulsi3,它执行一个简单的 32 位乘法。 https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/epiphany/mulsi3.c

我所希望的是,有一些超高效的途径可以针对不同情况执行诸如组合乘法和移位之类的操作。

对于没有硬件乘法的体系结构,是否有很好的指南或讨论来执行位宽和符号性的特殊组合的极其有效的乘法?

【问题讨论】:

  • 太糟糕了,硬件没有将一些 8 位 x 8 位 -> 16 位乘法指令(甚至更小)作为基线,这些指令可以按原样使用或构建更大的乘法宽度。
  • 也许使用乘法表,例如8x8 或 8x4 位。当然,如果 RAM 大小足够。
  • @rcgldr 你是怎么得到 16 个字节的?我得到 4x4 位 = 16*16 = 256 字节。
  • 您是将任意两个数字相乘还是其中一个数字很小或设置了几个位数?
  • 由于 libgcc 的 __mulsi3a>>=1 变为零时结束其移位和添加循环,因此对于小输入它会自动更快,除非它们是符号扩展到 32 位的小负数。对于足够小的固定迭代计数,您可能会在没有提前退出的情况下展开,这可能取决于分支错误预测成本与流水线深度 * 宽度。

标签: assembly embedded multiplication riscv


【解决方案1】:

您有 16kB 的可用闪存。为什么不使用 1kB 来存储“squares/4”表,例如...

const uint16_t  Sqr_4[511]={0/4,1/4, 4/4, 9/4, 16/4, 25/4, ..., 260100/4};

uint16_t umul8b( uint8_t x, uint8_t y){

   return Sqr_4[(uint16_t)x+y]-((x>y)?Sqr_4[x-y]:Sqrt_4[y-x]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多