Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.orgfree.com

emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.


Учебные модели компьютера



Модели (software):

"Е14" (parallel !!!)
"S9PU" (parallel)

Модели (hardware):






Награды сайта
Награды сайта 2005

"Е14": обмен данными между процессорами

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

Как уже говорилось во введении, механизмы обмена в "Е14" предполагаются аналогичными тем, которые приняты в традиционной однопроцессорной технике.

В версии 2 программы "Е14" реализованы 3 метода обмена данными.

Метод 1. Обмен блоком данных с общей памятью по инициативе CPU

архитектурас общей памятью
аналогия с
классической архитектурой
прямой доступ к памяти (DMA)
начинает обменCPU
действия CPU
  1. задать параметры обмена в фиксированные ячейки ОЗУ:
    • 3FA - начальный адрес в ОЗУ CPU
    • 3FC - начальный адрес в ОЗУ PPU
    • 3FE - количество копируемых 16-битных слов
  2. установить у PPU режим INPUT (RR=2) или OUTPUT (RR=3)
    (дальше CPU может работать независимо)
действия PPU
  1. перейти на программу ПЗУ с адреса 2000 (INPUT)
    или 2002 (OUTPUT)
  2. выполнить нужную программу из ПЗУ
    • прочитать ячейки 3FA-3FE
    • в цикле скопировать нужное число слов
  3. перейти в режим STOP
примечание режим INPUT - копирование из CPU в PPU, OUTPUT - из PPU в CPU

Пример 1.

Допустим, мы хотим скопировать F чисел из ОЗУ CPU, начиная с адреса 100, в ОЗУ PPU1 так, чтобы они расположились там, начиная с адреса 1A. Пусть следующие F чисел (нетрудно посчитать, что в ОЗУ CPU они начинаются с адреса 100+2*F=11E) мы хотим занести в ОЗУ PPU2 с такого же адреса 1A. Данный алгоритм нетрудно продлить и на процессоры PPU3-PPU4, но для экономии здесь мы это делать не будем.

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

Для переписи чисел в PPU1 зададим CPU следующую программу (в PPU программа не требуется, там в ПЗУ все уже есть).

01DE
0100   mov #100, (3FA)
03FA

01DE
001A   mov #1A, (3FC)
03FC

01DE
000F   mov #0F, (3FE)
03FE

2B29   out #2, p.9

При составлении программы для PPU2 учтем, что значения ячеек 3FC и 3FE изменять не надо. Но зато надо дождаться, пока PPU1 считает значение 100 из 3FA, и только потом его менять на 11E. В итоге программа для CPU принимает следующий вид.

0000   nop             ждем
0000   nop             три команды
0000   nop             (nop - нет операции)

02DE
001E   add #1E, (3FA)  вычисляем новый адрес
03FA

2B2A   out #2, p.A

Аналогично программируется и копирование из PPU в CPU, только в этом случае вместо константы 2 (режим INPUT) используется 3 (режим OUTPUT).

Заметим, что если в ячейку 3FE занести 1, то будет прочитано или записано 1 слово. Правда, для этого PPU все равно будет выполнять цикл, хотя и всего один раз.

Метод 2. Обмен словом с общей памятью по инициативе PPU

архитектурас общей памятью
аналогия с
классической архитектурой
адресация к общей странице ОЗУ
начинает обменPPU
действия CPU участие CPU не требуется
действия PPU
  1. из программы вызвать подпрограмму ПЗУ с адреса
    2048 (READ) или 2050 (WRITE)
  2. выполнить подпрограмму ПЗУ
    • подключить нулевую (общую) страницу ОЗУ
    • произвести обмен с общей страницей ОЗУ: прочитать в R0
      (написать из R0) одно 16-битное слово (адрес ОЗУ CPU в R1)
    • подключить "свою" страницу ОЗУ
    • выполнить возврат в основную программу
  3. продолжить выполнение программы

Пример 2.

Пусть мы хотим в программе для PPU прочитать с общей (нулевой) страницы ОЗУ значение слова из адреса 100. Для этого достаточно вставить в программу следующую пару команд.

01D1   mov #100, R1  задаем адрес
0100
9C0D   call READ     вызов подпрограммы из ПЗУ
2048

Прочитанное значение находится в R0.

Для записи значения из R0 в ОЗУ CPU достаточно в приведенном фрагменте заменить адрес подпрограммы ПЗУ на 2050.

Все просто и замечательно. Но есть одно "но": поскольку данный обмен выполняется не по запросу CPU, он никак не синхронизирован с остальными вычислениями.

Метод 3. Обмен словом по шине по инициативе CPU

архитектурас распределенной памятью
аналогия с
классической архитектурой
обмен по шине
начинает обменCPU
действия CPU
  1. задать константы обмена на шину через порты:
    • порт 6 - адрес в ОЗУ PPU
    • порт 7 - значение ячейки при записи
      (при чтении это действие не требуется)
  2. установить у PPU режим INPUT (RR=2) или OUTPUT (RR=3)
  3. при чтении - подождать 2 команды и читать порт 7
    (при записи никаких действий не требуется)
действия PPU
  1. перейти на программу ПЗУ с адреса 2058 (INPUT)
    или 2060 (OUTPUT)
  2. выполнить нужную программу из ПЗУ
    • прочитать адрес ОЗУ из порта 6
    • при INPUT читать порт 7,
      при OUTPUT - прочитать из ОЗУ нужную ячейку
    • при INPUT сохранить прочитанное с шины по нужному адресу,
      при OUTPUT записать прочитанное из ОЗУ значение в порт 7
  3. перейти в режим STOP
примечание режим INPUT - копирование из CPU в PPU, OUTPUT - из PPU в CPU

Пример 3.

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

Пусть мы хотим обнулить ячейку для будущей суммы с адресом 18 в ОЗУ всех PPU (как и в примере 1, ограничимся частью программы для первых двух). Тогда CPU может выполнить такую, например, программу (для PPU опять ничего не надо писать, все есть в ПЗУ).

0BD6   out #18, p.6
0018

2B07   out #0, p.7

2B29   out #2, p.9

И сразу же можно переводить в режим INPUT и PPU2 (значения на шине уже есть!)

2B2A   out #2, p.A

Пример 4.

А теперь покажем, как CPU может после окончания вычислений прочитать из ячейки 18 ОЗУ PPU результат и записать его в ячейку FC в ОЗУ CPU.

0BD6   out #18, p.6
0018

2B39   out #3, p.9

0000   nop   ждем 2 команды, пока
0000   nop   в порту 7 появится значение

0A7E   in p.7, (FC)
00FC

читать дальше


Автор сайта - Евгений Александрович Еремин (Пермский государственный педагогический университет). e_eremin@yahoo.com


Free Web Hosting