为什么64位对齐的XOR运行速度不比32位对齐的XOR快?

时间:2013-02-24 03:17:53

标签: memory xor

我想测试两块memmory的速度,我在64位机器(4M缓存)中进行了实验,并且XOR两个内存区域分别对齐32位和64位。我认为64位对齐区域XOR比32位对齐区域XOR快得多,但两种类型XOR的速度相同。

代码:

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++;
    }
}

结果:  speed comparation

1 个答案:

答案 0 :(得分:2)

我认为这是由于数据不足造成的。也就是说,你的CPU速度非常快,你的代码非常高效,你的内存子系统根本无法跟上。即使以32位对齐的方式进行异或,也比从内存中获取数据花费的时间更少。这就是为什么32位和64位对齐方法都具有相同的速度 - 即内存子系统的速度。

为了演示,我已经重现了你的实验,但这次有四种不同的XOR方式:

  1. 非对齐(即字节对齐)XORing;
  2. 32位对齐XORing;
  3. 64位对齐XORing;
  4. 128位对齐XORing。
  5. 最后一个是通过_mm_xor_si128()实现的,{{3}}是SSE2指令集的一部分。 Speed of different ways of XORing (optimized binary)

    正如您所看到的,切换到128位处理没有提高性能。另一方面,切换到每字节处理会减慢一切 - 这是因为在这种情况下内存子系统仍然击败CPU。