【发布时间】:2021-05-06 16:54:36
【问题描述】:
我正在尝试在 C 代码中实现非常高效的 2x2 矩阵乘法,以便在 ARM Cortex-M4 中进行操作。该函数接受 3 个指向 2x2 数组的指针,2 个用于相乘的输入和一个由 using 函数传递的输出缓冲区。这是我到目前为止所拥有的......
static inline void multiply_2x2_2x2(int16_t a[2][2], int16_t b[2][2], int32_t c[2][2])
{
int32_t a00a01, a10a11, b00b01, b01b11;
a00a01 = a[0][0] | a[0][1]<<16;
b00b10 = b[0][0] | b[1][0]<<16;
b01b11 = b[0][1] | b[1][1]<<16;
c[0][0] = __SMUAD(a00a01, b00b10);
c[0][1] = __SMUAD(a00a01, b01b11);
a10a11 = a[1][0] | a[1][1]<<16;
c[1][0] = __SMUAD(a10a11, b00b10);
c[1][1] = __SMUAD(a10a11, b01b11);
}
基本上,我的策略是使用 ARM Cortex-M4 __SMUAD() 函数来进行实际的乘法累加。但这需要我提前构建输入 a00a01、a10a11、b00b10 和 b01b11。我的问题是,鉴于 C 数组在内存中应该是连续的,是否有更有效的方式将数据直接传递给函数而无需中间变量?第二个问题,我是不是想多了,我应该让编译器完成它的工作,因为它比我更聪明吗?我经常这样做。
谢谢!
【问题讨论】:
-
我非常怀疑没有
static的void inline是你想要的。而不要使用inline。我认为函数是small enough,你可以在汇编中编写它。 -
这些 CMSIS 例程会有帮助吗? keil.com/pack/doc/CMSIS/DSP/html/group__MatrixMult.html 另外,因为你有一个 M4 - FPU 有很多寄存器......将两个源加载到寄存器中并使用 FPU,然后保存。我不知道转换是否会影响您的时间安排。我不会为 2D 索引而烦恼...只要抓住你想要的 int。
-
@aMike:并非每个 Cortex-M4 都有 FPU。