Производительность кэширования последовательных и дополненных данных - PullRequest
1 голос
/ 01 сентября 2010

Я получил несколько объектов с определенными значениями, например: (1)

struct massPoint {
    double pos;
    double vel;
    double acc;
} objects[LOTS];

или то же самое в массивах:

(2)

double pos[LOTS];
double vel[LOTS];
double acc[LOTS];

Первый вопрос: это правильно, если я вызываю (1) дополненные данные и (2) последовательные данные?

Второй вопрос: если я делаю некоторые операции, которые влияют только на vel и acc, и нет pos, и у меня есть LOTSиз них, было бы предпочтительным (2), так как это было бы лучше с точки зрения производительности кэширования, потому что pos [] не нужно кэшировать таким образом, а в (1) это должно быть?Или я вообще не понимаю концепцию?

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Не знаю, для вашего первого вопроса

На ваш второй вопрос нет общего ответа, это зависит от вашей архитектуры и вашего шаблона использования.

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

, так что в итогеэто может зависеть от множества факторов, но тенденции, что второй метод будет предпочтительным иВо многих обстоятельствах

0 голосов
/ 01 сентября 2010

Если вы выполняете операции на только позициях, тогда просто скоростей или просто ускорений, тогда (2) лучше.

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

Предполагается, что:

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

Хотя, если честно, это звучит как преждевременная оптимизация: и лучшее, что нужно сделать, - это профилировать что-то вроде valgrind , который сможет сказать вам точный ответ для вашей платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...