我使用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倍。确实存在数据和指令缓存,我觉得它们可以加速双字操作。我也同意,当从内存中取出两个连续的单词时,必须以某种方式减少开销。谢谢大家的意见。