2016-10-27 2 views
0

У меня есть задача, которая требует ультра производительностьКак использовать (чтение/запись) CPU кэширует L1, L2, L3

Конечно, я могу оптимизировать алгоритм, но я также хочу оптимизировать на аппаратном уровне.

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

Другого вида оптимизации может быть положить в кэшах процессора (L1, L2, L3) данные, которые должны выполнить мои задачи, чтобы, насколько это возможно, избежать задержки «доступа к оперативной памяти»

Какой API я могу использовать для такой разработки?

(Другими словами, мои вопросы могли бы быть: «как заставить процессор поместить в кэш заданной структуры данных?»)

Спасибо за вашу помощь

ответ

1

Ну, вы 'нужно будет использовать язык низкого уровня (C, вероятно, будет идти в этом случае).

Тогда у вас есть чтение: What every programmer should know about memory. Обратите особое внимание на главу 6, которая содержит очень полезные советы по программированию о том, как оптимизировать конкретные шаблоны использования.

2

Обычно вы не можете переопределять политики замены LRU в кэшах ЦП. Процессоры x86 по крайней мере не поддерживают какой-либо способ «привязать» определенные диапазоны адресов к любому уровню кеша.

Что вы можете сделать, это «предварительная выборка» перед использованием. «предварительная выборка программного обеспечения» редко бывает полезной. Обычно предварительная выборка HW делает хорошую работу, а ваши данные остаются в кеше, пока размер вашего кеша достаточно мал. Ульрих Дреппер What every programmer should know about memory охватывает это и по-прежнему актуально. Однако его акцент на предварительную выборку программного обеспечения (особенно отдельный поток предварительной выборки) был подходящим для P4, но не очень хорошая идея для других процессоров. Помните об этом во время чтения.

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


Если вы используете это на Intel Haswell Xeon или новее (EXXX v3 или выше), вы можете разделить кэш L3, так что ядро ​​работает критическая нить владеет куском L3, и он выиграл» t быть выселены другими ядрами. Это называется CAT (Cache Allocation Technology). См. Также this article by Dan Luu

2

Отличный комментарий Питера С о предварительной выборке. Как бывший оптимизатор, первое, что мы хотели бы улучшить для кода, - удалить всю предварительную выборку SW. Кроме того, не пытайтесь гадоваться с состояниями власти и т. Д. Они настолько хороши в настоящее время, что усилия не стоят выигрыша в HPC. Возможным исключением является гиперпоточность. Единственный раз, когда вы захотите туда попасть, будет определенный бенчмаркинг, где вам нужна согласованность, а также производительность.

Посмотрите на ресурсы оптимизации Intel, такие как optimization guide. Также сделайте себе хороший профилировщик; Intel's VTune действительно один из лучших. Для получения информации от Intel используйте bing (или google), чтобы найти материал. Сайт Intel всегда был глянцевым. VTune имеет лицензию для студентов и преподавателей.

Вот шаги, которые я использовал для оптимизации приложений для производительности. Во-первых, исчерпайте изменения программного обеспечения более высокого уровня. Затем переходите к настройке производительности оборудования. Зачем? Две причины: (1) изменения кода, как правило, независимы от архитектуры и имеют больше шансов пережить переход на другую платформу и поколение HW. (2) Они намного проще сделать (хотя, возможно, не так весело).

КОД ИЗМЕНЕНИЯ:

  1. Удалите все SW предвыборку.
  2. Заменить опрос с периодическими прерываниями
  3. Убедитесь, что все проверки прерывания имеют соответствующие интервалы
  4. Использование Fortran. В самом деле. Есть причина, по которой Фортран жив. Взгляните на форумы Intel Fortran. Все классические HPC форума. И компилятор Intel Fortran от Intel является одним из лучших.
  5. Используйте хороший оптимизирующий компилятор и играйте с настройками компилятора и прагмами/аннотациями (например, количество циклов #pragma). Опять же, Intel является одним из лучших. (Я ненавижу говорить это, но это правда.)
  6. Используйте хороший профилировщик SW, чтобы найти возможности оптимизации (где большая часть вашего времени расходуется). Убедитесь, что профилировщик может выкопать исходный код, чтобы определить время, затрачиваемое на различные функции. Сначала оптимизируйте эти функции.
  7. найти возможности для резьбы распараллеливания (Многопоточность) надлежащий охват к количеству ядер
  8. найти возможности для векторизации
  9. Преобразования из AoS (массив структуры) на диван. Обратите внимание, что если вам нужно выполнить преобразование «на лету», это может не стоить затрат на производительность.
  10. Стройте свои петли таким образом, чтобы они были более благоприятными для возможностей векторизации компилятора. См. Любую хорошую книгу оптимизации о том, как это сделать.

HARDWARE ВЗЛОМ/ОПТИМИЗАЦИЯ (используя хороший анализатор производительности HW-уровня)

  1. Определить кэш и TLB отсутствует, и код реструктурировать.
  2. Определить ветвь неправильных прогнозов и перестроить код.
  3. Идентифицировать конвейеры и реструктурировать код.

Последнее предложение, хотя я уверен, что вы уже это знаете. Помните, идите за самыми горячими пятнами. Меньшие возможности занимают много времени, а улучшения производительности не влияют на общее применение.

Удачи. Оптимизация может быть интересной и полезной (если вы немного сумасшедшие).

Смежные вопросы