Правильно ли я использовал инструкцию предварительной выборки, чтобы уменьшить задержку памяти?
Могу ли я добиться большего успеха, чем эта?
Когда я компилирую код с -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);
}