Может & ldquo; non-native & rdquo; указатели повреждают производительность кэша?

Если вы новичок, возможно, вы еще не хотите иметь дело с malloc и free. Поэтому, если вы используете GCC, вы можете выделить массивы переменных размеров в стеке, просто указав размер как выражение.

Например:

#include <stdio.h>
void dyn_array(const unsigned int n) {
        int array[n];
        int i;

        for(i=0; i<n;i++) {
                array[i]=i*i;
        }
        for(i=0; i<n;i++) {
                printf("%d\n",array[i]);
        }
}
int main(int argc, char **argv) {
        dyn_array(argc);
        return 0;
}

Но имейте в виду что это нестандартное расширение, поэтому вы не должны рассчитывать на него, если важна переносимость.

17
задан Leeor 13 November 2013 в 13:27
поделиться

1 ответ

Предварительная выборка связанных структур данных (LDS) все еще является известной проблемой в компьютерной архитектуре. Я не знаком ни с одним современным процессором, который действительно это делает, но теоретически это возможно. За прошедшие годы было опубликовано несколько научных работ, в которых предлагается несколько вариантов:

  1. Специальное HW, которое может обнаруживать значения, подобные адресам, в извлеченных строках кэша и выдавать предварительные выборки по этим адресам.
  2. Метод с использованием компилятора, при котором компилятор распознает зависимости структуры данных и вставляет предварительные выборки SW или другие подсказки.

Ваш метод может повлиять на оба этих метода (первый может оказаться бесполезным, второй может работать, если компилятор достаточно умен).

Конечно, вам действительно нужно было бы работать на такой машине, так что это только теоретически, и вам не нужно менять свою практику, если она работает нормально для вас, но это показывает, что профилирование должно быть специфические для каждой микроархитектуры и системы, и то, что помогает вам в одном случае, может быть менее эффективным в другом.
Вообще говоря - не просто доверяйте ЦП выполнять или не выполнять некоторую оптимизацию (если она не задокументирована), всегда проверяйте, получаете ли вы ожидаемое поведение.

Кстати, обратите внимание, что даже если HW видит содержимое памяти, оно все еще находится в виртуальном адресном пространстве - HW в любом случае пришлось бы выполнить какой-то перевод в физический адрес, чтобы использовать его, так что в некотором смысле не должно быть никаких дополнительных накладных расходов.

Некоторая библиография:

10
ответ дан Leeor 13 November 2013 в 13:27
поделиться