1

我使用一个 SPARC V8 处理器,它通过 32 位数据总线连接到内存。从 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 倍。确实存在数据和指令缓存,对我来说它们可以加快双字操作是有意义的。我也同意,从内存中获取两个连续单词时必须以某种方式减少开销。谢谢大家的意见。

4

0 回答 0