Иерархия памяти — заблуждения и недоразумения

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

Недоразумение. При имитации кэш-памяти упускается из виду байтовая адресация или размер блока кэш-памяти.

При имитации кэш-памяти (с использованием или без использования компьютера) нужно убедиться в том, что при определении, на какой блок кэш-памяти отображается заданный адрес, в расчет берется эффект байтовой адресации и факт наличия в блоке нескольких слов. Например, если мы располагаем 32-разрядной кэш памятью с непосредственным отображением и размером блока, равном 4 байтам, байтовый адрес 36 отображается на блок 1 кэш-памяти, поскольку байтовый адрес 36 – это блоковый адрес 9, а (9 mod 8) - 1.

С другой стороны, если адрес 36 это адрес слова, то тогда он отображается на блок (36 mod 8) 4. Убедитесь в том, что в задаче четко определена база адреса.

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

Недоразумение. Игнорирование поведения системы памяти при написании программ или при генерации кода в компиляторе.

При запуске с входными данными, представленными матрицами 500х500 с двойной точностью, время выполнения процессором показанного выше цикла на МIPS-процессоре, имеющем 1-мегабайтную вторичную кэш-память, будет примерно вдвое больше по сравнению с тем, когда порядок цикла будет изменен на k, J, 1 (то есть і станет самым внутренним циклом)! Единственное отличие состоит в том, как программа обращается к памяти и стремится получить эффект от иерархии памяти. Дальнейшая оптимизация компилятора с использованием технологии подзазванном объединение в блоки может отразиться на времени выполнения, которое уменьшится для этого кода еще в четыре раза!

Заблуждение. Наличие меньшей степени ассоциативности в совместно используемой кэш-памяти, чем количество ядер или потоков, использующих эту кэш-память

Если не принять дополнительные меры, программа, параллельно запущенная на 2-х процессорах или потоках, может запросто распределить структуры данных по адресам, которые будут отображаться на один и тот же набор совместно используемой кэш-памяти уровня L2. Если кэш-память имеет как минимум 2-канальную ассоциативность, то этот случайный конфликт будет скрыт от программы оборудованием, Если нет, программист может столкнуться с явно мистической ошибкой выполнения, возникающей фактически из-за конфликта промахов при обращении к L2, при переходе, скажем, с 16-ядерной конструкции на 32-ядерную, при условии, что в обеих конструкциях используется кэш-память уровня L2 с 16-канальной ассоциативностью.

Заблуждение. Использование среднего времени доступа к памяти для оценки иерархии памяти на процессоре, не придерживающемся порядка выполнения инструкций.

Если процессор останавливается на время обработки промаха при обращении к кэш-памяти, то вы можете отдельно вычислить время задержки из-за обращения к памяти и время выполнения программы процессором, а следовательно, независимо оценить иерархию памяти, используя среднее время доступа к памяти (см упражнение «Вычисление среднего времени доступа к памяти»).

Если процессор продолжает выполнение инструкций даже во время обработки промаха, то можно столкнуться с новыми промахами при обращении к кэш-памяти. Единственная точная оценка иерархии памяти – имитация работы в этой иерархии процессора, не придерживающегося порядка выполнения инструкций.

Заблуждение. Расширение адресного пространства за счет добавления сегментов в верхнюю часть несегментированного адресного пространства

В течение 1970-х годов многие программы разрослись до таких размеров, что весь код и данные не могли быть адресованы с помощью всего лишь 16-разрядных адресов. После чего компьютеры были переработаны под 32-разрядные адреса либо посредством несегментированного 32-разрядного адресного пространства (также называемого линейным адресным пространством), либо посредством добавления 16 разрядов сегмента к существующему 16-разрядному адресу. С точки зрения маркетинга, добавление сегментов, видимых программой, которые заставляли программиста и компилятор разбивать программу на сегменты, могло решить проблему адресации. К сожалению, всякий раз, когда программа хотела адресовать то, что было больше одного сегмента, например индексы для больших массивов, неограниченные указатели или параметры ссылки, возникала проблема. Кроме этого, добавление сегментов может превратить любой адрес в два слова – одно для номера сегмента, а другое для смещения сегмента, вызывая проблемы использования адресов в регистрах.

Заблуждение. Реализация диспетчера виртуальной машины на архитектуре набора команд, которая была разработана без учета виртуализации.

Многие разработчики 1970-х–1980-х годов не позаботились о гарантиях привилегированности всех инструкций, считывающих или записывающих информацию, связанную с аппаратными ресурсами. Такая беспечность привела к проблемам для диспетчеров виртуальных машин на базе всех этих архитектур, включая х86, которая использовалась нами в качестве примера.

Описание 18 инструкций, вызывающих проблемы для виртуализации (Robin and Irvine, 2000). Они относятся к двум распространенным классам инструкций:

чтение регистров управления в пользовательском режиме, которые показывают, что гостевая операционная система запущена на виртуальной машине (например, упомянутая ранее инструкция POPF);

проверка защиты, как этого требует сегментированная архитектура, в предположении. что операционная система запущена на самом высоком привилегированном уровне.

Сводка из 18 х86-инструкций, вызывающих проблемы для виртуализации (Robin and Irvine, 2000). Первые пять инструкций в верхней части таблицы позволяют программе в пользовательском режиме читать значение регистра управления, например, регистров таблицы дескрипторов, не вызывая при этом перехвата. Инструкция извлечения флагов из стека изменяет регистр управления, содержащий важную информацию, но при этом приводит в пользовательском режиме к молчаливому сбою. Проверка защиты сегментированной архитектуры х86 является западней, расставленной группой инструкций, показанных в нижней части таблицы, поскольку каждая из этих инструкций проверяет уровень привилегированности косвенным образом, как часть выполнения инструкции при чтении регистра управления. Проверка предполагает, что операционная система должна быть на самом высоком привилегированном уровне, что не соответствует случаю использования гостевых виртуальных машин. Только лишь инструкция перемещения в регистр сегмента пытается модифицировать состояние управления, но проверка защиты точно так же мешает ей это сделать



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий