1

我想测试两块内存的速度,我在64位机器(4M缓存)上做了一个实验,分别对32位对齐和64位对齐的两个内存区域进行异或。我认为64-位对齐区域异或可能比 32 位对齐区域异或快得多,但两种异或的速度是相同的。

代码:

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

结果: 速度比较

4

1 回答 1

2

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

为了演示,我复制了您的实验,但这次使用了四种不同的 XORing 方式:

  1. 非对齐(即字节对齐)异或;
  2. 32 位对齐异或;
  3. 64 位对齐的异或;
  4. 128 位对齐 XORing。

最后一个是通过_mm_xor_si128()实现的,它是 SSE2 指令集的一部分。 不同异或方式的速度(优化二进制)

如您所见,切换到 128 位处理并没有提高性能。另一方面,切换到按字节处理会减慢一切——这是因为在这种情况下,内存子系统仍然胜过 CPU。

于 2013-03-28T16:18:40.780 回答