Memory 为什么64位对齐异或的运行速度不快于32位对齐异或?
我想测试两个内存块的速度,我在64位机器(4M缓存)上做了一个实验,分别对32位对齐和64位对齐的两个内存区域进行异或。我认为64位对齐区域的异或比32位对齐区域的异或快得多,但两种异或的速度是相同的 代码:Memory 为什么64位对齐异或的运行速度不快于32位对齐异或?,memory,xor,Memory,Xor,我想测试两个内存块的速度,我在64位机器(4M缓存)上做了一个实验,分别对32位对齐和64位对齐的两个内存区域进行异或。我认为64位对齐区域的异或比32位对齐区域的异或快得多,但两种异或的速度是相同的 代码: void region\u xor\u w32(无符号字符*r1,/*区域1*/ 无符号字符*r2,/*区域2*/ 无符号字符*r3,/*和区域*/ int nbytes)/*区域中的字节数*/ { uint32_t*l1; uint32_t*l2; uint32_t*l3; uint32
void region\u xor\u w32(无符号字符*r1,/*区域1*/
无符号字符*r2,/*区域2*/
无符号字符*r3,/*和区域*/
int nbytes)/*区域中的字节数*/
{
uint32_t*l1;
uint32_t*l2;
uint32_t*l3;
uint32_t*ltop;
无符号字符*ctop;
ctop=r1+N字节;
ltop=(uint32_t*)ctop;
l1=(uint32_t*)r1;
l2=(uint32_t*)r2;
l3=(uint32_t*)r3;
而(l1
结果:
我认为这是由于数据匮乏。也就是说,CPU速度太快,代码效率太高,内存子系统根本跟不上。即使是以32位对齐的方式进行XORing,也比从内存中获取数据花费更少的时间。这就是为什么32位和64位对齐方法具有相同的速度——内存子系统的速度 为了演示,我复制了您的实验,但这次使用了四种不同的XORing方法:
如您所见,切换到128位处理并没有提高性能。另一方面,切换到每字节处理会减慢速度-这是因为在这种情况下,内存子系统仍然优于CPU。从左到右,这是您测量的一级缓存、二级缓存和RAM总线速度。您是对的,但是为什么在64位机器中32位对齐和64位对齐的速度是相同的呢?谢谢,你在编译代码时添加了编译器优化“-O2”吗?是的,我添加了。顺便说一句,如果没有
-O2
,32位对齐的异或比64位的异或要慢(至少这是我在机器上得到的)。同样,这是因为,如果代码不理想,CPU就会成为瓶颈。
void region_xor_w32( unsigned char *r1, /* Region 1 */
unsigned char *r2, /* Region 2 */
unsigned char *r3, /* Sum region */
int nbytes) /* Number of bytes in region */
{
uint32_t *l1;
uint32_t *l2;
uint32_t *l3;
uint32_t *ltop;
unsigned char *ctop;
ctop = r1 + nbytes;
ltop = (uint32_t *) ctop;
l1 = (uint32_t *) r1;
l2 = (uint32_t *) r2;
l3 = (uint32_t *) r3;
while (l1 < ltop) {
*l3 = ((*l1) ^ (*l2));
l1++;
l2++;
l3++;
}
}
void region_xor_w64( unsigned char *r1, /* Region 1 */
unsigned char *r2, /* Region 2 */
unsigned char *r3, /* Sum region */
int nbytes) /* Number of bytes in region */
{
uint64_t *l1;
uint64_t *l2;
uint64_t *l3;
uint64_t *ltop;
unsigned char *ctop;
ctop = r1 + nbytes;
ltop = (uint64_t *) ctop;
l1 = (uint64_t *) r1;
l2 = (uint64_t *) r2;
l3 = (uint64_t *) r3;
while (l1 < ltop) {
*l3 = ((*l1) ^ (*l2));
l1++;
l2++;
l3++;
}
}