Модель выполнения программы в ядре

При выполнении программы в вычислительной системе протекают параллельно следующие процессы:

читаются и подготавливаются к выполнению команды;

работает кэш-память первого уровня;

работает кэш-память второго уровня;

работает кэш-память третьего уровня;

работают функциональные устройства в каждом ядре;

работает оперативная память.

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

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

Общее время выполнения программы будет не меньше времени выполнения самогого длительного этапа из параллельно выполняемых.

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

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

Кеш-память третьего уровня, общая для всех ядер, при условии, что она свободна, в соответствии с некоторой дисциплиной выбирает заявку из одного входного буфера.

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

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

При отсутствии заявок во входных буферах кэш-память третьего уровня простаивает.

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

При отсутствии заявок во входных буферах коммутатор 2 простаивает.

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

При отсутствии заявок во входном буфере оперативная память (или контроллер внешних связей) простаивает.

Поток запросов из ядра в кэш-память первого уровня L1D случайный. Закон распределения интервалов между запросами может быть произвольным. Случайность потока запросов определяется влиянием многих факторов: типом программы (количеством команд обращения в память, их порядком следования в программе, временем выполнения программы, параметрами компонентов ядра и всей вычислительной системы, свойствами локальности программы и т.п.).

Известно, что если случайный процесс это сумма случайных процессов без явного преобладания одного из них, то он является простейшим с показательным законом распределения промежутков времени между очередными событиями уже при =4-5. Поэтому, принято, что процесс обращений в кэш-память первого уровня является простейшим с показательным законом распределения времени между заявками.

Известно также, что использование показательного закона распределения времени между очередными запросами, является одним из «тяжелых» режимов работы. Показатели эффективности в этом случае будут минимальными. При других законах распределения они будут не меньшими, а даже лучшими. Это означает, что в результате будут известны нижние границы показателей эффективности системы.

Примем, что известно:

в конкретной программе количество команд обращения в память ;

времена обслуживания на каждом уровне кэш-памяти;

время обслуживания в оперативной памяти;

времена обслуживания коммутаторов;

вероятности удачных обращений к каждому уровню кэш-памяти.

Обозначим общее время выполнения программы в ядре через .

Времена занятости соответствующих уровней составят:

- время занятости кэш-памяти первого уровня;

- время занятости кэш-памяти второго уровня;

 

- время занятости кэш-памяти третьего уровня;

- время занятости коммутатора;

- время занятости канала оперативной памяти.

- времена обслуживания одного запроса кеш-памятями первого, второго, третьего уровней и канала оперативной памяти, соответственно.

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

Определим коэффициент использования (нагрузки) кэш-памяти первого уровня следующим образом

.

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

Интенсивность генерации заявок одним ядром к:

кэш-памяти первого уровня

;

кэш-памяти второго уровня

.

коммутатору 1 и, соответственно, кэш-памяти третьего уровня

;

;

коммутатору 2

;

каналу оперативной памяти

;

 

Коэффициенты нагрузки общих ресурсов МВС ядрами будут:

коммутатора 1

;

кэш-памяти третьего уровня

;

коммутатора 2

;

канала оперативной памяти

;

Исследование эффективности многоядерной вычислительной системы будет проводиться исходя из предположения, что в ней:

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

все ядра (потоки) одного процессора (микросхемы) используют общую кэш-память третьего уровня;

несколько потоков ядра используют один канал оперативной памяти. При программировании задач в МВС с использованием технологии OpenMP подразумевается, что все ядра выполняют одинаковую программу над различными данными. Соответственно, считаем, что операционная система разумно распределяет оперативную память для всех потоков (ядер) одного процессора;

коммуникационная подсистема между ядрами и кэш-памятью третьего уровня реализована в виде коммутатора с одновременной передачей данных в/из кэш-памяти третьего уровня;

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

канал оперативной памяти также устройство комбинационного типа. Новая заявка может быть выполнена только после завершения предыдущей заявки.

МВС односокетная.