Должен ли я предпочесть доступ к памяти с шагом один для чтения или записи?

Хорошо известно, что быстрый доступ к памяти лучше всего для производительности.

В ситуациях, когда

  • я должен получить доступ к одной области памяти для чтения,
  • я должен получить доступ к другой области для записи, и
  • я могу получить доступ только к одной из двух областей с шагом 1,

, что лучше: прочитать первый шаг или написать первый шаг?

Одним из простых конкретных примеров является BLAS-подобная операция копирования и перестановки, такая как y: = P x . Матрица перестановок P полностью определяется некоторым вектором перестановок q (i) . Ему соответствует вектор обратной перестановки qinv (i) . Требуемый цикл можно было бы закодировать как y [qinv (i)] = x [i] или как y [i] = x [q (i)] , где первый читается из x шаг один, а последний записывает в y шаг один.

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

8
задан Rhys Ulerich 26 January 2012 в 15:53
поделиться