代码在 Intel XEON 上运行速度比 Intel i7 慢?

问题描述 投票:0回答:1

我有一些代码,其中以下函数负责 95% 的计算

void processServerData(uint32_t partIndex, uint32_t dataOffset, uint64_t *outputData, uint32_t dataSize, uint32_t partSize) {
    auto bytesInEntry = dataSize / sizeof(uint64_t);

    __m256i a, b, r;
    int outputIndex, dataIndex;
    uint32_t rotationOffset;

    int k = 0;
    for (int i = 0; i < partSize; i = i + 1)
    {
        k = i;
        rotationOffset = (k + dataOffset) & (partSize - 1);

        outputIndex = rotationOffset * bytesInEntry;
        dataIndex = partIndex + k * bytesInEntry;

        a = _mm256_loadu_si256((__m256i *)(outputData + outputIndex));
        b = _mm256_loadu_si256((__m256i *)(DB + dataIndex));
        r = _mm256_xor_si256(a, b);
        _mm256_storeu_si256((__m256i *)(outputData + outputIndex), r);
    } }

这里的outputData对于每个函数调用都指向完全相同的数组。 正如您在高层次上看到的,代码只是在某个偏移处对两个数组进行异或并将结果存储到outputData中。

我正在使用以下标志

-mavx2 -march=native -O3 

现在问题来了

我在两个实例上运行了此代码。

  • Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz,运行 MacOS 13.6,16 GB DDR4 RAM,编译器 Apple clang 版本 15.0.0 (clang-1500.0.40.1)
  • AWS r7i.2xlarge Intel(R) Xeon(R) Platinum 8488C,带 Ubuntu,64 GB DDR5 RAM,编译器 g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

我观察到以下行为

  • 对于 32 MB 的较小数据库,AWS 至少比 MAC 快 2 倍
  • 尽管对于 8 GB 的大型数据库,MAC 比 AWS 快 2 倍
  • 对于 AWS,我尝试使用 avx512,代码速度慢了 2 倍

我认为这是因为 Mac 拥有更快的处理器?

但是由于这是内存密集型代码,AWS 的大缓存没有帮助吗?

我可以做哪些优化来帮助使用 AWS?

我对此类优化非常陌生,任何指导都将受到高度赞赏

amazon-web-services c++11 g++
1个回答
0
投票

不太清楚,但有可能因为整个 32MB 数据集都适合处理器缓存,所以(理论上)不存在缓存未命中的情况。

当数据完全适合缓存时,代码中的 AVX2 指令可能会更有效。

这都是猜测 - 尝试使用一个或多个

进行分析
  • 叮当
  • 英特尔 vtune 分析器
  • gperftools
© www.soinside.com 2019 - 2024. All rights reserved.