2011-06-20 79 views
4

ARM ARM實際上並沒有在該指令中正確使用這些指令,但我發現它在其他地方用於知道它將地址作爲提示在何處讀取下一個值。正確使用ARM PLD指令(ARM11)

我的問題是,給定一個256字節的緊密複製循環ldm/stm指令,比如說r4-r11 x 8,在每個指令對之間複製之前預取每個緩存行還是不行因爲所討論的memcpy不是同時讀取和寫入相同區域的內存。很確定我的緩存行大小是64字節,但它可能是32個字節 - 在此處寫入最終代碼之前等待確認。

+0

這是什麼意思?*在這方面更好*? –

+0

更快=在這種情況下更好。 –

回答

5

Cortex-A Series Programmer's Guide,章17.4(注:有些細節可能是ARM11不同):

的memcpy的

最佳性能()是 使用整個高速緩存 線的LDM,然後將這些值寫入實現與整個緩存行的STM相關聯的 。 商店的排列比負載的排列更重要 。 如有可能,應使用PLD指令 。加載/存儲單元中有四個PLD 插槽。 PLD 指令優先於 自動預取器,並且在整數流水線 性能方面沒有成本 。 PLD 指令的最佳memcpy()可以在 系統之間略有不同,但PLD 爲一個地址前三個緩存行前 的當前複製行是一個 有用的起點。

+1

3 cache-lines ahead ...因此,在一個64字節的cacheline上有一個256字節的副本,這聽起來像我應該繼續並預取全部256個字節。嗯。沒有想到看Cortex手冊。可能應該有。 Thansk爲快速回答。 –

+1

原來我的系統是一個32字節的cachline線 - 而且我們的總線很慢。因此,在塊指令之間交織以隱藏延遲是一條路。它也證明,一次超過16個字節的複製速度超過了緩存的速度,並放慢了速度。 ARM可以創造一種美麗的語言,但它仍然需要正確的內存子系統來充分利用它。 –

+0

有關實際代碼示例和基準,請參閱http://infocenter.arm.com/help/topic/com.arm.doc.faqs/ka13544.html。 –

3

一個合理的普通副本循環,利用超高速緩存行大小LDM/STM塊和/或PLD如果有的話可以在Linux內核中,arch/arm/lib/copy_page.S發現的一個例子。這實現了Igor上面提到的關於預加載的使用,並說明了阻塞。

注意用於ARMv7(其中超高速緩存行的大小通常是64個字節),這是不可能的LDM一個完整的緩存行作爲一個單一的運算(這裏只有14個REG,你可以使用,因爲SP/PC不能碰這個) 。所以你可能必須使用兩對/四對LDM/STM

+0

你可以使用它的SP,你將只需要存儲它在適當的地方,並確保您的上下文切換代碼沒有被延遲到足以使用您的執行域(USR/SYS)中的SP。 – sgupta

+0

如果你「將'SP'存儲在某個地方」,那麼你可以「免費」使用'LDM' /'STM',這個「某處」通常最終是一個全局位置或一個「PC」相對位置。兩者都使你的代碼非線程安全,而後者需要可寫代碼(通常不是這樣)。在某些情況下可以接受,但不能在其他情況下接受。另請注意,您需要一個寄存器來存放'LDM' /'STM'源/目標地址。在任何情況下,使用非vFP/Neon,您是否可以通過ARMv6/7上的單條指令加載整個緩存行以進行註冊。 –

+0

您能否解釋一下如何讓我的代碼線程不安全?爲什麼它需要可寫代碼?我認爲「adr」指令是爲了這個特定的目的而做的,所以我不必手動處理電腦的相對負載。常量LDR也是一個電腦相對的指令,這是否使代碼不安全?您可以使用ARM寄存器加載/存儲整個緩存行,具體取決於cpu緩存行大小。我使用32字節緩存行的cpu以及128字節緩存行,這一切都取決於目標。 – sgupta

1

要真正獲得「最快」的ARM asm代碼,您需要在系統上測試不同的方法。至於一個LDM/STM循環去,這一次似乎最好的工作對我來說:

// Use non-conflicting register r12 to avoid waiting for r6 in pld 

    pld [r6, #0] 
    add r12, r6, #32 

1: 
    ldm r6!, {r0, r1, r2, r3, r4, r5, r8, r9} 
    pld [r12, #32] 
    stm r10!, {r0, r1, r2, r3, r4, r5, r8, r9} 
    subs r11, r11, #16 
    ldm r6!, {r0, r1, r2, r3, r4, r5, r8, r9} 
    pld [r12, #64] 
    stm r10!, {r0, r1, r2, r3, r4, r5, r8, r9} 
    add r12, r6, #32 
    bne 1b 

上面介紹的塊假定您已經安裝R6,R10,R11和這個環上的R11而言倒計時字不是字節。我已經在Cortex-A9(iPad2)上測試過了,它在處理器上似乎有相當好的結果。但要小心,因爲在Cortex-A8(iPhone4)上,NEON循環似乎比ldm/stm快,至少對於更大的副本。