1

32 ビット データ バスでメモリに接続された SPARC V8 プロセッサを使用しています。SPARC アーキテクチャ マニュアル V8 から、単一の 32 ビット レジスタ (ワード) をロード/ストアする命令があることを学びましたが、ダブル ワードを 2 つのレジスタにアトミックにロード/ストアする命令もあります。私のマシンでは、ダブルワード命令はシングルワード命令よりも高速ですか? データバス幅以外に依存するものは何ですか?

さらに、Linux カーネル ソースで最適化された memcpy 実装を発見しました。これは、次のように整列されたチャンクをコピーします。

#define MOVE_BIGALIGNCHUNK(...) \
ldd     [%src + (offset) + 0x00], %t0; \
ldd     [%src + (offset) + 0x08], %t2; \
ldd     [%src + (offset) + 0x10], %t4; \
ldd     [%src + (offset) + 0x18], %t6; \
std     %t0, [%dst + (offset) + 0x00]; \
std     %t2, [%dst + (offset) + 0x08]; \
std     %t4, [%dst + (offset) + 0x10]; \
std     %t6, [%dst + (offset) + 0x18]; 

ロードとストアをグループ化する利点はありますか? ただ興味があります..ありがとう!

更新: 私は Gaisler の LEON3 実装を使用しており、ベア メタルを使用しています。ldd と std が実装されており、トラップしません。ldd と std を使用して大量のジャンク データをコピーすると、約 1.5 倍高速になることが測定されました。確かにデータ キャッシュと命令キャッシュが存在し、ダブル ワード操作を高速化できることは理にかなっています。また、メモリから 2 つの連続した単語をフェッチするときにオーバーヘッドを何らかの方法で削減する必要があることにも同意します。コメントありがとうございます。

4

0 に答える 0