我有一些代码,其中以下函数负责 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
现在问题来了
我在两个实例上运行了此代码。
我观察到以下行为
我认为这是因为 Mac 拥有更快的处理器?
但是由于这是内存密集型代码,AWS 的大缓存没有帮助吗?
我可以做哪些优化来帮助使用 AWS?
我对此类优化非常陌生,任何指导都将受到高度赞赏
不太清楚,但有可能因为整个 32MB 数据集都适合处理器缓存,所以(理论上)不存在缓存未命中的情况。
当数据完全适合缓存时,代码中的 AVX2 指令可能会更有效。
这都是猜测 - 尝试使用一个或多个
进行分析