4

ARM ARMは、実際にはこの命令の適切な使用方法をあまり示していませんが、次の値を読み取る場所のヒントとしてアドレスを使用することを知っている他の場所で使用されていることがわかりました。

私の質問は、命令の256バイトのタイトなコピーループldm/stm、たとえばr4-r11 x 8が与えられた場合、コピーの前、各命令ペアの間で各キャッシュラインをプリフェッチするか、またはのようにまったく実行しない方がよいかどうかですmemcpy。問題は、メモリの同じ領域の読み取りと書き込みの両方ではありません。キャッシュラインのサイズが64バイトであることは確かですが、32バイトの可能性があります。ここで最終的なコードを記述する前に、確認を待っています。

4

3 に答える 3

5

Cortex-Aシリーズプログラマーズガイドの17.4章から(注:ARM11では一部の詳細が異なる場合があります):

memcpy()の最高のパフォーマンスは、キャッシュライン全体のLDMを使用し、次にキャッシュライン全体のSTMを使用してこれらの値を書き込むことで達成されます。店舗の配置は、荷物の配置よりも重要です。可能な場合はPLD命令を使用する必要があります。ロード/ストアユニットには4つのPLDスロットがあります。PLD命令は自動プリフェッチャーよりも優先され、整数パイプラインのパフォーマンスに関してコストはかかりません。最良のmemcpy()のPLD命令の正確なタイミングはシステム間でわずかに異なる可能性がありますが、現在コピーしているラインの3キャッシュライン先のアドレスへのPLDは有用な開始点です。

于 2011-06-20T16:52:39.750 に答える
3

キャッシュラインサイズのLDM/STMブロックを利用する、および/またはPLD利用可能な場合はLinuxカーネルにある、適度に一般的なコピーループの例arch/arm/lib/copy_page.S。これは、プリロードの使用に関してIgorが上記で述べたことを実装し、ブロッキングを示しています。

ARMv7(キャッシュラインのサイズは通常64バイト)ではLDM、単一の操作として完全なキャッシュラインを作成することはできません(これには、SP/PCに触れることができないため、使用できるregは14個しかありません)。したがって、LDM/の2つまたは4つのペアを使用する必要がある場合がありますSTM

于 2011-06-21T13:34:59.767 に答える
1

可能な限り「最速」のARMasmコードを実際に取得するには、システムでさまざまなアプローチをテストする必要があります。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よりも高速であるように見えるため注意してください。

于 2013-07-05T22:10:32.737 に答える