软件预取和向后循环

时间:2018-10-03 23:16:46

标签: c++ x86 prefetch

我是否正确使用了预取指令来减少内存延迟?

我可以做得更好吗?

当我用-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);
}

0 个答案:

没有答案