提问人:CryptoKitty 提问时间:11/16/2023 更新时间:11/19/2023 访问量:27
代码在英特尔至强上的运行速度比英特尔 i7 慢?
Code runs slower on Intel XEON than Intel i7?
问:
我有一些代码,其中以下函数负责 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 的优化吗?
我对这种优化非常陌生,因为任何指导都会受到高度赞赏
答:
0赞
cptwonton
11/19/2023
#1
不太清楚,但有没有可能因为你的整个 32MB 数据集都适合处理器缓存,所以(理论上)没有缓存未命中这样的事情。
当数据完全适合缓存时,代码中的 AVX2 指令可能更有效。
这都是猜测 - 尝试使用一个或多个
- 铛
- 英特尔 VTune Profiler
- gperftools
评论