




Разрешить процессору эффективно выполнять предварительную выборку данных. Например, вы можете уменьшить количество промахов в кэше, обрабатывая многомерные массивы по строкам, а не по столбцам, циклам развертывания и т. д.
Такой вид оптимизации зависит от аппаратной архитектуры, поэтому лучше использовать профилировщик для конкретной платформы, например Intel VTune, для обнаружения возможных проблем с кешем.
Для операций с привязкой к данным
использовать массивы и векторы вместо списков, карт и наборов
обрабатывать по строкам по столбцам
Ссылка на видео и слайды презентации мертвы. Порекомендуйте отредактировать комментарии и ответ, включив заголовок видео, чтобы люди могли его найти.
Избегайте использования динамической памяти, когда в этом нет необходимости. Использование новых, удаленных, интеллектуальных указателей и т. д. Имеет тенденцию распространять данные вашей программы по памяти. Это не хорошо. Если вы можете хранить большую часть своих данных вместе (например, объявляя объекты в стеке), ваш кеш наверняка будет работать намного лучше.
Встраивание запусков функций может привести к повреждению кеша инструкций. И если память не привязана к выборке, то это вряд ли будет иметь большое (если вообще есть) различие.
Как всегда, любая оптимизация должна основываться на профилировании, а не на догадках. Не говоря уже о том, что вам нужно будет понимать, что говорит вам профилировщик, что подразумевает знакомство с языком ассемблера и конкретными характеристиками платформы, для которой вы оптимизируете.
Немного устарел, но в «Черной книге по программированию графики» Майка Абраша все еще есть много хороших общих советов.
Вот некоторые вещи, которые мне нравится учитывать при работе с таким кодом.
+1. Идея кривой Гильберта очень нова, откуда вы ее взяли? Действительно ли время, необходимое для преобразования между координатами кривой Гильберта и координатами стандартного массива, стоит эффективности кеширования, или оно того стоит, только если вы выполняете преобразование координат в одном направлении, но не в другом?
Также, если вы используете C++ и многопоточность, вам необходимо учитывать ложное совместное использование, локальность и горячие данные в кеше каждого процессора. Это может иметь большое значение. Также, особенно в многопоточных вычислениях, методы LIFO более эффективны, чем вычисления в режиме FIFO, но они также действительны в однопроцессорной архитектуре.
Хороший разговор Саттера. Слайды доступны здесь, что неплохо иметь рядом с видео, так как его качество немного ужасное. nwcpp.org/Downloads/2007/Machine_Architecture_-_NWCPP.pdf