Библиотека сайта rus-linux.net
Что каждый программист должен знать о памяти.
Часть 2: Кэш-память процессора
Оригинал: "Memory part 2: CPU caches"Автор: Ulrich Drepper
Дата публикации: October 1, 2007
Перевод: Н.Ромоданов
Дата перевода: апрель 2012 г.
Назад | Оглавление | Вперед |
3.5.2 Загрузка критических слов
Данные передается из основной памяти в кэш-память в блоках, размер которых меньше, чем размер кэш-строки. В настоящее время за один раз можно передать 64 бита данных, а размер кэш-строки составляет 64 или 128 байтов. Это означает, что потребуется 8 или 16 действий передач данных в кэш-строку.
Чипы DRAM могут передавать эти 64-битовые блоки пакетами (burst mode). Это поможет заполнить кэш-строку без дальнейших команд от контроллера памяти и возможных связанных с этим задержек. Когда процессор выполняет предварительную загрузку кэш-строк, то это, пожалуй, наилучший вариант.
Если при доступе в программе к кэш-памяти данных или кэш-памяти инструкций возникает промах (что означает, что это вынужденный промах кэш-памяти из-за того, что данные используются первый раз или недостаточная емкость кэш-памяти, либо из-за того, что ограниченный размер кэша требует удаления кэш-строки), то ситуация иная. Слово, находящееся в кэш-строке, которое требуется программе для продолжения работы, может оказаться не первым словом в кэш-строке. Даже в режиме передачи данных пакетами (burst mode) и с двойной скоростью передачи данных, отдельные 64-разрядные блоки оказываются на месте за заметно разное время. Каждый блок поступает после поступления предыдущего блока через 4 процессорных циклов или более. Если слово, которое нужно для продолжения работы программы, будет восьмым в кэш-строке, то после того, как поступит первое слово, программа должна ждать еще 30 циклов или более.
Ситуация не обязательно должна быть именно такой. Контроллер памяти может запрашивать слова кэш-строк в другом порядке. Процессор может определить, какое слово, оно будет называться критическим словом, ожидает программа, и контроллер памяти может запросить это слово в первую очередь. Как только это слово поступает, программа может продолжать работу, хотя остальная часть кэш-строки еще не поступила и находится в несогласованном состоянии. Эта методика называется предварительно ранней перезагрузкой критического слова (Critical Word First & Early Restart).
В настоящее время в процессорах используется эта методика, но бывают ситуации, когда ее использовать невозможно. Если процессор выполняет предварительную загрузку и ему не известно критическое слово. В случае, когда процессор запрашивает кэш-строки в процессе выполнения операции предварительной загрузки, ему приходится ждать, когда поступит критическое слово, и у него нет возможности повлиять на порядок загрузки.
Figure 3.30: Critical Word at End of Cache LineРис.3.30: Критическое слово в конце кэш-строки
Даже при такой оптимизации имеет значение то, где в кэш-строке находится критическое слово. На рис.3.30 показан результат работы теста Follow для последовательного и случайного доступа. Показано замедление выполнения теста для случая, когда указатель находится в первом слове, по сравнению с ситуацией, когда указатель находится в последнем слове. Размер элемента равен 64 байта, что соответствует размеру кэш-строки. Значения сильно зашумлены, но видно, что как только кэш-памяти L2 становится недостаточным для того, чтобы хранить рабочий набор, производительность для случая, когда критическое слово находится в конце кэш-строки, будет приблизительно на 0,7% меньше. Похоже, что при последовательном доступе влияние немного больше. Когда происходит предварительная загрузка следующей кэш-строки, описанная выше проблема не исчезает.
Назад | Оглавление | Вперед |