代码在英特尔至强上的运行速度比英特尔 i7 慢?

Code runs slower on Intel XEON than Intel i7?

提问人:CryptoKitty 提问时间:11/16/2023 更新时间:11/19/2023 访问量:27

问:

我有一些代码,其中以下函数负责 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 带 Ubuntu 的 Intel (R) Xeon(R) Platinum 8488C,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 的优化吗?

我对这种优化非常陌生,因为任何指导都会受到高度赞赏

亚马逊网络服务 C++11 G++

评论


答:

0赞 cptwonton 11/19/2023 #1

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

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

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

  • 英特尔 VTune Profiler
  • gperftools