【问题标题】:Why 64-bits aligned XOR do not run faster than 32-bits aligned XOR?为什么 64 位对齐 XOR 的运行速度不比 32 位对齐 XOR 快?
【发布时间】:2013-04-01 17:05:08
【问题描述】:

我想测试两个内存块的速度,我在一个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++;
    }
}

结果:

【问题讨论】:

  • 从左到右分别是你测量的L1缓存、L2缓存和RAM总线速度。
  • 你是对的,但是为什么 64 位机器中 32 位对齐和 64 位对齐的速度是一样的?

标签: memory xor


【解决方案1】:

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

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

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

最后一个是通过_mm_xor_si128() 实现的,它是 SSE2 指令集的一部分。

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

【讨论】:

  • 谢谢,您在编译代码时是否添加了编译器优化“-O2”?
  • 是的,我做到了。顺便说一句,没有-O2,32 位对齐的异或 比它的 64 位对应物慢(至少这是我在我的机器上得到的)。同样,这是因为,对于次优代码,CPU 会成为瓶颈。
猜你喜欢
  • 2010-12-28
  • 1970-01-01
  • 2016-12-18
  • 2013-07-24
  • 2021-08-22
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多