Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.
|
"Е14": обмен данными между процессорамиОбмен данными между процессорами - одна из важнейших задач, возникающих при параллельных вычислениях. Именно необходимость использовать данные из других процессоров часто приводит к существенному замедлению вычислений, сводя на нет все преимущества от параллельности. Как уже говорилось во введении, механизмы обмена в "Е14" предполагаются аналогичными тем, которые приняты в традиционной однопроцессорной технике. В версии 2 программы "Е14" реализованы 3 метода обмена данными. Метод 1. Обмен блоком данных с общей памятью по инициативе 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
Пример 2.Пусть мы хотим в программе для PPU прочитать с общей (нулевой) страницы ОЗУ значение слова из адреса 100. Для этого достаточно вставить в программу следующую пару команд. 01D1 mov #100, R1 задаем адрес 0100 9C0D call READ вызов подпрограммы из ПЗУ 2048 Прочитанное значение находится в R0. Для записи значения из R0 в ОЗУ CPU достаточно в приведенном фрагменте заменить адрес подпрограммы ПЗУ на 2050. Все просто и замечательно. Но есть одно "но": поскольку данный обмен выполняется не по запросу CPU, он никак не синхронизирован с остальными вычислениями. Метод 3. Обмен словом по шине по инициативе 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 |