Предварительная загрузка программного обеспечения и обратный цикл - PullRequest
0 голосов
/ 04 октября 2018

Правильно ли я использовал инструкцию предварительной выборки, чтобы уменьшить задержку памяти?

Могу ли я добиться большего успеха, чем эта?

Когда я компилирую код с -O3, g ++, кажется, разворачиваетвнутренний цикл ( код на godbolt.org ).

Архитектура процессора - 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);
}
...