Memory 为什么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

我想测试两个内存块的速度,我在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_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方法:

  • 非对齐(即字节对齐)XORing
  • 32位对齐异或环
  • 64位对齐异或环
  • 128位对齐异或环
  • 最后一个是通过实现的,它是SSE2指令集的一部分。


    如您所见,切换到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++;
        }
    }