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