Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 一个双负载是否比两个负载快_Memory_Assembly_Sparc_Instructions - Fatal编程技术网

Memory 一个双负载是否比两个负载快

Memory 一个双负载是否比两个负载快,memory,assembly,sparc,instructions,Memory,Assembly,Sparc,Instructions,我正在使用SPARC V8处理器,该处理器通过32位数据总线连接到内存。从SPARC架构手册V8中,我了解到,有一些指令可以加载/存储单个32位寄存器字,也有一些指令可以将双字以原子方式加载/存储到2个寄存器中。在我的机器上,双字指令比单字指令快吗?除了数据总线宽度之外,它还依赖于什么 此外,我在Linux内核源代码中发现了一个优化的memcpy实现,它复制了一个对齐的块,如下所示: #define MOVE_BIGALIGNCHUNK(...) \ ldd [%src + (offse

我正在使用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倍。确实存在数据和指令缓存,它们可以加速双字操作,这对我来说很有意义。我也同意,当从内存中提取两个连续的单词时,必须以某种方式减少开销。感谢大家的评论。

了解这一点的最佳方法是尝试使用相当大的数据量并测量时间。如果ldd不是由您的特定CPU实现的,则将通过操作系统提供的陷阱处理程序进行模拟。这最终会让它变慢。如果您在Solaris上,trapstat-l将显示操作系统是否设置了UNMP ldd/UNMP std陷阱处理程序;他们是否存在,运行你的代码,看看他们是否被击中。。。如果是这样,请使用不同的代码…您能告诉我们您使用的是哪种实现吗?通常,实现将指令和数据缓存连接到核心,行大小通常大于一个双字。这意味着,即使外部内存总线为32位,双负载一次从缓存中获取2个字,因为连接核心到缓存的片上总线可能大于32位。此外,从逻辑上讲,双字操作应该比两个单字操作更有效,因为可以节省获取和解码这些指令的时间。但实际上,如果代码很小,它可能没有什么效果。