簡體   English   中英

如何在ARM匯編中轉置矩陣

[英]How to transpose a matrix in ARM assembly

我正在嘗試對每個n個元素的字節數組執行特定的8個n位數組的矩陣轉置,每個數組具有n位(大約70,000)。

上下文信息:8個n位數組是8個通道的RGB數據。 我需要一個字節代表8個數組的第n位位置。 這將在ARM Cortex-M3處理器上運行,並且需要盡快執行,因為我正在使用結果數組生成8個同時信號。

我想出了一個偽算法(在鏈接中)來做到這一點,但恐怕對於處理器而言可能太昂貴了。

偽算法

我正在尋找執行速度最快的代碼。 大小是次要的。 我將不勝感激建議。

這是我實施的,但效果不是很好。

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。 可以肯定的是,最終算法將不受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'中進行原型制作,然后轉換為匯編器,或者盡可能使用內聯匯編器。 如果算法中有許多mov語句,則表明編譯器可能比您更好地分配寄存器。 許多復雜的算法都使用代碼生成器(用phython,perl等編寫),可以展開最終遇到的任何最佳循環,並以算法方式跟蹤寄存器。

注意:仔細檢查我的桌子; 這只是第一個破解,我還沒有實際編碼此特定算法。 一次可以處理多個位的方法可能更精巧,但是這個想法可能很有成果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM