我是否正确使用了预取指令来减少内存延迟?
我可以做得更好吗?
当我用-O3编译代码时,g ++似乎展开了内部循环(code at godbolt.org)。
CPU的体系结构是Broadwell。
谢谢。
向后循环遍历数组和读/写元素。
每次计算都取决于先前的计算。
#include <stdlib.h>
#include <iostream>
int main() {
const int N = 25000000;
float* x = reinterpret_cast<float*>(
aligned_alloc(16, 4*N)
); // 0.1 GB
x[N - 1] = 1.0f;
// fetch last cache line of the array
__builtin_prefetch(&x[N - 16], 0, 3);
// Backward loop over the i^th cache line.
for (int i = N - 16; i >= 0; i -= 16) {
for (int j = 15; j >= 1; --j) {
x[i + j - 1] += x[i + j];
}
__builtin_prefetch(&x[i - 16], 0, 3);
x[i - 1] = x[i];
}
std::cout << x[0] << "\n";
free(x);
}