arrays - 如何在ARM汇编中转置矩阵

标签 arrays algorithm assembly matrix arm

我正在尝试将特定 8 个 n 位数组(每个数组有 n 位(大约 70,000))执行到 n 个元素的字节数组的矩阵置换。

上下文信息:8个n位数组是8个 channel 的RGB数据。我需要一个字节代表 8 个数组的第 n 位位置。这将在 ARM Cortex-M3 处理器上运行,并且需要尽可能快地执行,因为我正在使用生成的数组生成 8 个同步信号。

我想出了一个伪算法(在链接中)来执行此操作,但我担心它对处理器来说可能成本太高。

Pseudo Algorithm

我正在寻找执行速度最快的代码。大小是次要的。 我将不胜感激。

这是我实现的,但结果不是很好。

do{
    for(b=0;b<24;b++){ //Optimize to for(b=24;b!=0;b--)
        m = 1 << b;
        *dataBytes = *dataBytes + __ROR((*s0 & m),32+b-0); //strip 0 data       
        *dataBytes = *dataBytes + __ROR((*s1 & m),32+b-1); //strip 1 data
        *dataBytes = *dataBytes + __ROR((*s2 & m),32+b-2); //strip 2 data
        *dataBytes = *dataBytes + __ROR((*s3 & m),32+b-3); //strip 3 data
        *dataBytes = *dataBytes + __ROR((*s4 & m),32+b-4); //strip 4 data
        *dataBytes = *dataBytes + __ROR((*s5 & m),32+b-5); //strip 5 data
        *dataBytes = *dataBytes + __ROR((*s6 & m),32+b-6); //strip 6 data
        *dataBytes = *dataBytes + __ROR((*s7 & m),32+b-7); //strip 7 data
        dataBytes++;
    }       
    s0 += 3;
    s1 += 3;
    s2 += 3;
    s3 += 3;
    s4 += 3;
    s5 += 3;
    s6 += 3;
    s7 += 3;
}while(n--);

S0 到 7 是 8 个单独的向量,其中的位以 24 个为一组。 N 是组数,m 是掩码,b 是掩码位置。 dataBytes 是结果数组。

最佳答案

优化时有两件事总是存在的,

  1. 内存带宽
  2. CPU 时钟

带宽

您当前的算法是一次加载一个字节。您可以通过一次至少加载 32 位来更有效地执行此操作。这将优化 ARM 总线。可以肯定的是,最终算法不会受 BUS 限制,如果受限制,则您已为此进行了优化。

针对不同的ARM CPU,有pld等指令可以尝试通过提前预取下一个数据元素来优化BUS。这可能适用于也可能不适用于您的 Cortex-M。另一种技术是在可能的情况下将数据重新定位到更快的内存,例如 TCM。

CPU 速度

像素处理几乎总是加速 SIMD类型说明。 Cortex-M 具有标记为 SIMD 的指令。不要卡在 SIMD 标签上;使用这个概念。如果您已将多个字节加载到一个字中,那么您可以使用一个表。

 const unsigned long bits[16] = {
              0,          1,      0x100,      0x101,
        0x10000,    0x10001,    0x10100,    0x10101,
      0x1000000,  0x1000001,  0x1000100,  0x1000101,
      0x1010000,  0x1010001,  0x1010100,  0x1010101
 }

互联网上的许多 CRC 算法中都使用了类似的概念。处理每个半字节(4 位)并一次形成接下来的四个字节输出。可能有一个可以代替表格的乘法值,但这取决于你乘法的速度,这取决于 Cortex-M 和/或 ARM 的类型。

一定要使用“C”原型(prototype),然后转换为汇编程序或尽可能使用内联汇编程序。如果您的算法中有许多 mov 语句,则表明编译器可能比您更好地分配寄存器。许多复杂的算法使用代码生成器(在 phython、perl 等中编写脚本),它可以展开您最终得到的任何最佳循环,并以算法方式跟踪寄存器。

注意:仔细检查我的表格;这只是第一次破解,我还没有真正编写过这个特定的算法。可能有更灵活的方法来一次处理多个位,但这个想法可能是富有成效的。

关于arrays - 如何在ARM汇编中转置矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216689/

相关文章:

javascript - JavaScript 中的剩余语法

python - 为覆盖所有二维矩阵生成三个不重叠的掩模

iphone - UITableView 分组数组

确定矩形是否完全被一组多边形覆盖所需的算法

linux - 在 nasm 汇编 intel x86 中获取数字而不是 Ascii

assembly - 布置堆栈变量开始比 rbp 更接近 rsp 的意义

php将mysql数据解析为多维json数组

javascript - 如何只访问数组中的一对元素一次?

c++ - 有什么方法可以降低求这个矩阵的n次方的时间复杂度吗?

c - 在澄清简单的汇编代码和有关我的分析的反馈方面需要帮助