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

ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ. МАТЕМАТИЧЕСКОЕ И КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ

УДК 004.4 ББК В183.5

Е.А. Еремин

РАЗРАБОТКА ИСПОЛНИТЕЛЯ ДЛЯ ДЕМОНСТРАЦИИ ПРОЦЕССА ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ

Вся современная вычислительная техника строится на базе многоядерных процессоров, где каждое ядро работает по отдельной программе. Разработка алгоритмов для таких компьютерных систем требует дополнительных знаний. Поэтому уже в школе необходимо начинать объяснять наиболее важные идеи, лежащие в основе параллельных алгоритмов. В статье описывается разработанный автором параллельный исполнитель, которого можно использовать для этой цели, и его программная реализация. Обосновывается, почему важно решать вычислительные задачи, а не только рассматривать всевозможные «жизненные» аналогии. Разбирается несколько примеров, демонстрирующих, что параллельные алгоритмы могут давать преимущества по сравнению с традиционными, но только при соблюдении определенных условий. Последнее обстоятельство еще раз подтверждает практическую пользу от изучения особенностей параллельных вычислений.

Ключевые слова: исполнитель, алгоритм, удвоитель, параллельные вычисления, обучение, информатика, школа.

Для изучения основ алгоритмизации и программирования в школьном курсе информатики широко используются всевозможные исполнители. Достаточно назвать учебные пакеты «Роботландия» и «КуМир», языки программирования Лого и Скрэч, а также более скромных, но не менее известных исполнителей вроде «Кенгуренка» и «Паркетчика». Они выглядят очень по-разному, но с успехом применяются при знакомстве с базовыми правилами разработки алгоритмов и простейшими приемами программирования.

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

На сегодняшний день методика изучения классических алгоритмов с помощью исполни-

© Еремин Е.А., 2017

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

Первые исполнители для знакомства с особенностями параллельной работы уже придуманы, например, «Директор строительства» [1] и «Танковый экипаж» [4]. Тем не менее они моделируют совместную деятельность людей, но не параллельные вычисления в компьютерной системе. Не отвергая полезности названных работ, автор поставил цель создать исполнителя для решения именно вычислительных задач с тем, чтобы максимально возможно приблизиться к основам работы современных компьютеров (не выходя в то же время за пределы возможностей среднего ученика).

1. Почему нужен именно вычислитель?

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

Педагогический опыт свидетельствует, что использование на уроках метода аналогий имеет как положительные, так и отрицательные стороны. Особенно подробно этот вопрос изучен в связи с решением различных математических задач, где проще увидеть возникающие ошибки и объяснить их причины. При умелом применении метод действительно может существенно улучшать знания учеников, тем не менее «постоянное применение аналогий в педагогическом процессе таит в себе большую опасность привития учащимся склонности к пользованию ложными аналогиями» [6]. Причина такой опасности заключается в следующем. «Основанием всякого заключения по аналогии служит ожидание нового сходства между предметами, вызванное сходством между ними, раньше замеченным. Между сходными в каком-либо отношении объектами может даже вовсе не оказаться никакого дальнейшего сходства, а может быть, оно и есть, да идет не в том направлении, в каком мы его ждем» [6]. Иными словами, коллективная подготовка стенгазеты вполне может проиллюстрировать некоторые трудности совместной работы, но не каждая проблема в этой области наблюдается в ходе параллельных вычислений в компьютерной системе. К тому же, как писал Я. Коменский, « ... всему, чему обучаешь, нужно обучать прямо, а не окольными путями» [3].

В подтверждение высказанной точки зрения по поводу недостаточности аналогий для глубокого усвоения знаний имеются и экспериментальные данные. В частности, интересные результаты описаны в обзорной статье [10] с броским названием «Исследования предлагают учителям математики выбросить теннисные мячи и ломтики пиццы». В ней кратко изложены результаты экспериментов, проведенных группой исследователей из университета штата Огайо. Ученикам колледжа было предложено изучить простую, но незнакомую математическую систему, по существу, набор правил. Одни изучали ее с помощью чисто абстрактных символов, а другие - на конкретных примерах вроде слияния жидкости в мерной посуде. Затем учеников тестировали в другой ситуации, которая базировалась на той же самой математике (причем им специально говорилось, что только что полученные знания можно применить и в новой

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

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

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

2. Устройство параллельного вычислителя

За основу исполнителя-вычислителя автором был взят простейший вычислительный автомат, который часто называют удвоителем. Автомат умеет умножать число на два или прибавлять к нему единицу. Трудно проследить, кто первым предложил рассматривать на уроках этот несложный исполнитель, но он встречается уже в упражнениях к пробным учебникам информатики [7, с. 34] и [5, с. 24] (правда, название «удвоитель» там не используется). Задачи про удвоитель также встречаются в ЕГЭ. Часто в них предлагается найти оптимальное по количеству команд решение [8].

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

Предположим, что у нас есть несколько удвоителей, способных работать параллельно. Будем в дальнейшем называть их для краткости параллельными удвоителями (ПУ). Присвоим каждому такому устройству номер. Удобно, чтобы он состоял из одной цифры; тогда максимально возможное количество удвоителей будет 10: от ПУ0 до ПУ9.

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

Для простоты не будем рассматривать детали загрузки и запуска программ в нашей параллельной вычислительной системе. Будем считать, что при нажатии кнопки «Загрузить» программы из файла каким-то образом распределяются по ПУ, а затем при нажатии кнопки «Пуск» одновременно начинают выполняться.

3. Система команд исполнителя

3.1. ПУ1 - ПУ9

Начнем с более простой системы команд «периферийных» вычислителей ПУ1 - ПУ9 (табл. 1). Их главные команды, как и в случае классического удвоителя, это умножение на два (кратко будем обозначать эту команду 2) и прибавление единицы (команда 1). Будем считать, что эти действия производятся над числами, находящимися в специальном регистре устройства - сумматоре (сокращенно - см).

Таблица 1

Команды ПУ1 - ПУ9

Команда Действие Такты

1 см = см + 1 1

2 см = см * 2 1

0 см = 0 1

операции обмена данными

i ввод значения из ПУ0 в см 2+ожидание

o вывод значения из см в ПУ0 3+ожидание

A см = см + введенное число 2+ожидание

операции с памятью

M0 M = 0 1

MW M = см 1

M+ M = M + см 1

MR см = M 1

Очевидно, что начальное значение сумматора не определено. Можно предложить для инициализации сумматора заносить туда ноль [5] (команда 0). А можно для расширения количества задач предусмотреть ввод начального значения в сумматор из главного удвоителя ПУ0 (команда /). Альтернативная команда ввода А отличается от г только тем, что вводимое число суммируется со значением, лежащим в сумматоре, а не замещает его.

Последняя из операций обмена данными - команда о, возвращает результат вычислений из сумматора в центральный удвоитель ПУ0.

Для того чтобы не путать между собой команды О и о, а также 1 и I, в тексте статьи при обозначении этих команд везде будут использованы строчные латинские буквы.

Еще раз подчеркнем, что каждый из ПУ1 - ПУ9 способен обмениваться данными только с ПУ0, но не между собой. Кроме того, невозможно напрямую ввести в них исходные числа или сразу вывести результат вычислений на экран: такими функциями наделен лишь ПУ0.

Для расширения спектра решаемых задач в ПУ добавлена ячейка памяти (Вспомним, что она есть даже в самой примитивной модели калькулятора!) Память обслуживается четырьмя командами: МО обнуляет содержимое ячейки памяти, МЖзаписывает в нее число из сумматора, МЯ производит обратное действие, т.е. читает содержимое ячейки в сумматор, и, наконец, М+ прибавляет к числу, которое хранится в памяти, содержимое сумматора.

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

Предполагается, что все вычислительные инструкции выполняются за 1 такт, как это происходит в современных процессорах. Команды ввода при отсутствии ожидания требуют 2 такта, а вывода - 3 («несимметрия» обусловлена принятым в модели алгоритмом обмена - см. 3.3).

3.2. ПУ0

ПУ0 обладает во многом похожей системой команд (табл. 2). Поэтому кратко опишем только ее особенности.

Таблица 2

Команды ПУ0

Команда Действие Такты

1 см = см + 1 1

2 см = см * 2 1

0 см = 0 1

операции обмена данными

N ввод значения из ПУN в см 2+ожидание

oN вывод значения из см в ПУN 3+ожидание

т см = см + введенное число 2+ожидание

к чтение значения в см 2

к+ см = см + прочитанное число 2

W вывод значения из см на экран 2

операции с памятью

M0 M = 0 1

MW M = см 1

M+ M = M + см 1

MR см = M 1

Первое различие между табл. 1 и 2 состоит в записи команд обмена. Поскольку ПУ0 способен обмениваться с любым из остальных ПУ, в команде требуется обязательно указывать номер нужного ПУ. Команды ¡0, оО и аО для ПУ0 лишены смысла (устройству незачем

передавать данные самому себе), поэтому их появление в тексте программы фиксируется как ошибка. С другой стороны, ПУ1 - ПУ9 могут обмениваться данными только с ПУ0, поэтому здесь номер указывать не нужно.

Выделенные в таблице жирным шрифтом команды Я и Ж дают ПУ0 возможность принимать аргументы для вычислений и выводить результаты на экран. И устройство ввода, и устройство вывода предполагаются «быстрыми», поэтому указанные команды всегда выполняются без ожидания за 2 такта.

3.3. Алгоритм обмена

Рассмотрим алгоритм обмена данными между двумя ПУ. Цель отдельно взятой операции обмена - передать число (аргумент для счета или конечный результат) из одного ПУ в другой. Чтобы это сделать, ПУ-источник данных должен выполнить команду о, а ПУ-приемник -парную ей команду г (см. ПУ1 на рис. 1). Главная трудность здесь заключается в том, что ПУ работают независимо друг от друга и начало вывода данных ПУ-источником не обязательно совпадет по времени с началом их ввода у ПУ-приемника. А значит, в параллельной вычислительной системе нужно предусмотреть специальный механизм согласования (синхронизации) процесса обмена.

Схема алгоритма обмена данными для оптимального случая (когда команды о и г наилучшим образом совпадают по времени) приведена в табл. 3.

Таблица 3

Алгоритм обмена данными

Источник данных

Такт 1: начало команды о: помещает данные из см в регистр вывода, выставляет сигнал готовности данных Проводит вычисления

Такт 2: ожидание ожидает подтверждения приема Такт 1: начало команды /: фиксирует готовность, принимает данные в регистр ввода и выставляет сигнал о приеме

Такт 3: завершение фиксирует прием и завершает операцию Такт 2: завершение передает число из регистра ввода в см и завершает операцию

Если же один из ПУ занят вычислениями и поэтому к обмену пока не готов, то появляются дополнительные такты ожидания.

Отметим, что описанный алгоритм обмена действительно является одним из возможных механизмов передачи данных между двумя электронными устройствами (см, например, описание посылки процессором данных на принтер в известном справочнике [2, с. 411]).

4. Примеры программ

4.1. Тест обмена данными

Тест передает в ПУ1 и ПУ2 число, соответствующее номеру ПУ, а те возвращают это значение, увеличенное на 1.

В тесте используются три удвоителя с номерами от 0 до 2. Программа с комментариями для каждого из них размещена в соответствующем столбце табл. 4 (серым фоном в ней выделены команды обмена данными; направление передачи указано стрелками).

Таблица 4

Тест обмена данными

ПУ0 ПУ1 ПУ2

0 ;занести 0 в см

1 ;+1

о1 ;передать 1 в ПУ1--------> i ;принять число из ПУ0

1 ;+1 1 ;+1

i ;принять число из ПУ0

о ;передать ответ в ПУ0

П ;принять ответ из ПУ1 <----- 1 ;+1

W ; вывести на экран

о ;передать ответ в ПУ0

i2 ;принять ответ из ПУ2 <

W ; вывести на экран

Все три программы стартуют одновременно. Программы для ПУ1 и ПУ2 одинаковы и начинаются с команды ввода г; поэтому оба они переходят в состояние ожидания числа (своего номера) от ПУ0. Управляющий же удвоитель, выполнив команды 0 и 1, сначала получает в сумматоре значение 1, т.е. номер первого ПУ. Далее он передает эту единицу в ПУ1 командой о1. Последний, как мы знаем, уже ожидает ввода, так что немедленно принимает число. Следующей командой ПУ0 и ПУ1 прибавляют к содержимому своих сумматоров 1. В ПУ1 ответ уже готов, но ПУ0 в это время еще занят: он пересылает двойку в ПУ2, и потому ПУ1 снова вынужден ждать, пока управляющий удвоитель выйдет на диалог с ним. Дождавшись, он предает ответ в ПУ0 и завершает свою работу. ПУ0 выводит на экран принятое число командой Ж, а затем аналогичным образом принимает результат из ПУ2.

Программа для ПУ2, помещенная в третьем столбце таблицы, работает совершенно аналогично, только с небольшим сдвигом по времени.

4.2. Суммирование последовательности чисел

Рассмотрим более содержательную задачу - нахождение суммы последовательных чисел

У = 1 + 2 + 3 + ... + к.

Для удобства проверки будем считать, что количество чисел к - четное. В этом случае легко заранее получить ответ, сгруппировав числа попарно: первое число с последним, второе -с предпоследним и т.д. В итоге одинаковые суммы всех пар достаточно умножить на их количество:

У = (к+1)*к/2.

Рассмотрим для определенности конкретный случай, когда к = 24, а сумму вычисляют четыре ПУ с номерами от 1 до 4. Чтобы построить параллельный алгоритм, достаточно разбить всю сумму на равные части по 24/4 = 6 слагаемых. В результате ПУ1 просуммирует числа 1-6, ПУ2 - 7-12, ПУ3 - 13-18 и ПУ4 - 19-24. Если принять, что программа во всех ПУ одинакова, то тогда исходное значение к00 для старта суммирования (равное 0, 6, 12 или 18) должно передаваться извне.

В итоге для ПУ1 - ПУ4 получим следующую программу суммирования 6 чисел (для экономии места она записана в строку):

1 МО 1 М+ 1 М+ 1 М+ 1 М+ 1 М+ 1 М+ МЯ о.

Программа начинается с приема ко командой г и очистки памяти (занесение туда нуля) командой МО. Далее 6 раз повторяется пара команд 1 и М+, которые увеличивают текущее значение числа на 1 и прибавляют полученное новое число к содержимому памяти. Итоговая сумма считывается из памяти по команде МЯ и возвращается в ПУ0 командой о.

Роль главного удвоителя ПУ0 состоит в распределении работы и сборе ответов:

Я о1 Я о2 Я о3 Я о4 11 А2 А3 А4 W.

Он читает нужные значения к0 с помощью команды Я и по очереди передает их в ПУ1-ПУ4 командами о1-о4. Далее он принимает первую сумму командой г1, а затем команды Л2-Л4 прибавляют к ней остальные три части суммы. Последняя команда Ж служит для вывода результата.

Очень интересно построить временную диаграмму выполнения всех параллельных программ. Главная трудность здесь заключается в том, что разные команды выполняются за разное время - за разное число тактов. Так что, скажем, пока ПУ0 выполняет команду Я, ПУ1 успеет выполнить 2 команды: МО и 1 (см. третью строку в табл. 5).

Таблица 5

Суммирование последовательности чисел

ПУ0 ПУ1 ПУ2 ПУ3 ПУ4

R

o1 i

R МО, 1

o2 М+, 1, М+ i

R 1, М+ МО, 1

o3 1, М+, 1 М+, 1, М+ i

R М+, 1 1, М+ МО, 1

o4 М+, MR 1, М+, 1 М+, 1, М+ i

и О М+, 1 1, М+ МО, 1

М+, МЯ 1, М+, 1 М+, 1, М+

Л2 О М+, 1 1, М+

М+, МЯ 1, М+, 1

Л3 О М+, 1

М+, МЯ

Л4 О

W

Разберем эту сложную таблицу подробнее. Как и раньше, в каждом из ее столбцов помещена программа для одного удвоителя (номер виден в заголовке).

Сначала взглянем на первый столбец, который соответствует главному удвоителю ПУ0. Он читает начальные значения к0 и передает их в ПУ1 - ПУ4. После этого происходит переход к

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

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

Ожидание ввода начинается с момента старта, поэтому все ячейки таблицы, которые лежат выше ячейки ввода, тоже выделены серым фоном (Ожидание обмена - это тоже часть обмена!) Кстати говоря, из таблицы отчетливо видно, что ПУ1 ждет наименьшее время, а максимум ожидания приходится на ПУ4.

Далее начинаются вычисления. Каждая вычислительная команда (например, 1 или М+) выполняется за один такт. В то же время ПУ0 выполняет двух- или трехтактовые команды Я, о и другие. Поэтому в каждой ячейке столбца для ПУ1 мы соответственно видим по две-три команды. Напомним, что количество тактов, которое требуется для каждой команды, можно определить по табл. 1 и 2.

Завершив вычисления, ПУ1 возвращает результат в ПУ0. Анализ таблицы показывает, что когда ПУ0 доходит до команды ввода, результат в ПУ1 уже готов (см. строку в таблице с командой г1 в первом столбце). Зато для ПУ2 - ПУ4 это не так. Скажем, в тот момент, когда ПУ0 выходит на команду Л2, ответ в ПУ2 еще не подсчитан. Следовательно, управляющему ПУ приходится ждать (об этом говорит появление пустой ячейки в первом столбце).

Поставим вопрос: насколько хорошо наличие (или отсутствие) ожидания в ПУ0, т.е. как влияет на общее время то, насколько быстро периферийные ПУ вычисляют результат. Очевидно, что полезная работа для нашего параллельного исполнителя - это вычисления. Оценим, какую часть времени любой из ПУ1 - ПУ4 непосредственно занят вычислениями. Время счета для каждого ПУ получить несложно: для этого достаточно подсчитать количество вычислительных команд в одном из столбцов табл. 5. Таких команд оказывается 14 (г и о не считаем!) Каждая из них выполняется за один такт, поэтому время вычислительной работы для удвоителя в данной задаче составляет 14 тактов. Общее время счета оценить сложнее, поскольку надо точно учесть все такты ожидания и обмена. Тем не менее благодаря программной реализации исполнителя (см. следующий раздел) это удается сделать - полное решение задачи получается за 39 тактов. Следовательно, время полезной работы (счета) для ПУ1 - ПУ4 составляет примерно 36 %.

Кроме того, если построчно проанализировать табл. 5, то мы с удивлением обнаружим, что нет ни одной(!) строки, где бы стояли только вычислительные команды. Иными словами, в данном конкретном случае ни разу все четыре ПУ не выполняли вычислений одновременно.

Напрашивается вывод о том, что наш вычислительный исполнитель загружен слабо. Как это можно исправить? Рецепт прост: надо взять больше чисел, т.е. увеличить значение к. Если не менять при этом число ПУ, то количество обменов данными останется прежним, зато количество вычислений возрастет. Например, эксперимент с программной реализацией исполнителя при к = 120 дает такие результаты: количество тактов вычислений - 62, а полное время работы программы - 87 тактов. Отсюда следует, что коэффициент полезного действия нашего исполнителя возрастает до 71 %, т.е. практически вдвое. А это значит, что при большом объеме параллельные вычисления действительно могут быть полезны.

4.3. Перевод двоичного числа

В предыдущей задаче все ПУ выполняли одинаковый объем вычислений. Посмотрим, что будет, если это не так.

Пусть требуется перевести имеющиеся двоичное число в десятичную систему счисления. Для простоты напишем программу для небольшого числа битов, например, для п = 4. Рабочую формулу для этого случая удобно записать так:

Б = Ьз • 23 + Ь2 • 22 + Ь1 • 2 + Ьо.

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

Попробуем раздать вычисление каждого слагаемого отдельному удвоителю (табл. 6).

Таблица 6

Перевод двоичного числа

ПУ0 ПУ1 ПУ2 ПУ3

Я ;Ьз

о1 ;в ПУ1 1 ;Ь3

Я ;Ь2 2, 2

о2 ;в ПУ2 2 1 ;Ь2

Я ;Ь1 2, 2

оЗ ;в ПУ3 1 ;Ь1

я ;Ьо 2

А1 ;+ Ь3 • 23 о ;Ь3 • 23

А2 ;+ Ь2 • 22 о ;Ь2 • 22

АЗ ;+ Ь1 • 2 о ;Ь1 • 2

W

Очевидно, что использование параллельных вычислителей малоэффективно (особенно это заметно для ПУ3 - всего одна арифметическая команда). Проверка с помощью программной реализации исполнителя подтверждает это: параллельная программа для четырех удвоителей выполнится за 25 тактов, в то время как один удвоитель закончил бы вычисления за 21 такт. Мы видим, что параллельная программа оказалась даже хуже! Конечно, с ростом разрядности ситуация несколько улучшится, поскольку для вычисления старших степеней требуется больше умножений. Тем не менее данный пример наглядно показывает, что формальное разделение вычислений на части далеко не всегда автоматически ведет к успеху. Вот почему понимание механизмов работы параллельных вычислительных систем так важно при создании эффективных алгоритмов!

5. Программная реализация исполнителя

Автором разработана программная реализация исполнителя. Программа для краткости названа Б9РИ - система из 9 параллельных удвоителей. При этом, согласно описанному выше, есть еще один (десятый) центральный удвоитель ПУ0, который берет на себя все взаимодействие в вычислительной системе.

5.1. Устройство ПУ

Рассмотрим сначала устройство одного из ПУ1 - ПУ9. Его отображение в программном окне приведено на рис. 2.

Как и любое классическое устройство, работающее по программе [9], каждый ПУ содержит специальный регистр - «Счетчик адреса команды» (СчАК), который используется для хранения адреса (в нашем случае просто номера) выполняемой команды. Когда команда однотактовая, то счетчик после нее автоматически увеличивается на единицу, тем самым подготавливая ПУ к выполнению следующей команды. Если же команда содержит два такта и более, то счетчик ПУ сохраняет свое значение до последнего такта. Нажав на кнопку, расположенную правее значения счетчика (см. рис. 2), можно увидеть место в программе, соответствующее текущему значению СчАК. Исполняемая команда отображается ниже (на рисунке этой команды нет, поскольку там показан завершивший программу ПУ).

Рис. 2. Устройство одного из параллельных удвоителей

Расположенный рядом индикатор режима ПУ своим цветом демонстрирует характер загрузки устройства: когда индикатор зеленый, происходят вычисления, желтый - обмен данными и серый - ПУ остановлен.

Назначение сумматора и памяти нам уже известно из обсуждения системы команд. В нижней части панели размещены регистры ввода и вывода, через которые происходит обмен между ПУ1 и ПУ0. Когда ПУ1 принял данные в регистр ввода, загорается зеленый индикатор рядом с этим регистром, а когда приготовил данные для вывода - рядом с регистром вывода. Попутно заметим, что одновременный ввод и вывод невозможны, так как конкретный ПУ не может одновременно выполнять две команды.

ПУ0 отличается от ПУ1 - ПУ9 только тем, что у него не один, а девять каналов обмена (с каждым ПУ свой).

5.2. Окна программы S9PU

Данные программы отображаются в трех окнах (рис. 3). Сверху расположено главное окно, которое является пультом управления; здесь же отображаются результаты вычислений. Ниже находится окно, в котором можно изучать состояние всех удвоителей от ПУ0 до ПУ9. Наконец, с правой стороны мы видим окно с текстом выполняемой программы.

Рассмотрим каждое из окон подробнее.

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

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

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

Щ: S9PU - Система из 9 Параллельным Удвоителей

й Загрузить 3 mull 00.s9

режим (* авто С такт

£ Пуск

0 Стоп

©Даль

Скорость выполнения [нормально

Показ окон

Вывод

Строка ввода |1 234 5 6 7 8 9

500 ч

600

700

800

900 -

Тактов: 81 Для каждого ПУ:

Е.А. Ервмин Пермь, 2017

0 1 г 3 4 5 6 7 8 9

так. 81 41 51 55 59 63 67 71 75 79

ком. 38 14 14 14 14 14 14 14 14 14

Состояние ПУО - ПУ9

СчАК 14

суммат. 100 команда память 100

ПУ1

режим

рег. ввода

о 1

рег. вывода

О 100

СчАК 1А

суммат. 200 память 200

рег. ввода

О г

команда

ПУ2

режим

рег. вывода

О 200

СчАК 1А

суммат. 300 память 300

рег. ввода

О з

О 9 О 900 ПУ9

per. ввода per. вывода

режим

СчАК 1А idl

суммат. 900 команда

память 900

О 8 О 800 ПУ8

per. ввода per. вывода

режим

СчАК 1А idl

суммат. 800 команда

память 800

программы для пуо - пу9

о о ПУ0<=>ПУ1 оо ПУО <=> ПУ2 О о ПУ0<=>ПУЗ

СчАК 36 суммат. 900 память 0 режим ы|  команда рег. ввода рег. вывода 900 900 ПУО

ПУО <=> ПУ9 О О ПУО <=> ПУ8 ОО ПУО <=> ПУ7 о о

О 7

рег. ввода

СчАК 14

суммат 700

память 700

Файл: 9_mul100.s9

Л_ Закрыть

Щ 0 1 2 3 4 5 6 7 8 9 d zl

0 R i i i i i i i i i

1 01 2 2 2 2 2 2 2 2 2

2 R mw mw mw mw mw mw mw mw mw

3 о2 2 2 2 2 2 2 2 2 2

4 R 2 2 2 2 2 2 2 2 2

5 оЗ m+ m+ m+ m+ m+ m+ m+ m+ m+

6 R mr mr mr mr mr mr mr mr mr

7 о4 2 2 2 2 2 2 2 2 2

8 R mw mw mw mw mw mw mw mw mw

9 о5 2 2 2 2 2 2 2 2 2

10 R 2 2 2 2 2 2 2 2 2

11 об m+ m+ m+ m+ m+ m+ m+ m+ m+

12 R mr mr mr mr mr mr mr mr mr

13 о7 0 0 0 0 0 0 0 0 0

14 R

15 о8

16 R

Рис. 3. Общий вид программы 89Ри

В окне состояния можно видеть содержимое всех регистров ПУ (см. также более крупный рис. 2). Подчеркнем, что при чтении параллельной программы из файла автоматически

определяется, какие ПУ участвуют в вычислениях, и в окне отображаются только они (остальные скрыты).

Наконец, в последнем окне выводится таблица, столбцы которой содержат программы для каждого ПУ.

5.3. Правила записи программы

Программа для Б9Ри представляет собой текстовой файл с расширением Б9. Команды пишутся в столбик, каждая строка содержит ровно одну команду. Допускаются пустые строки а также комментарии, строки которых содержат в первой позиции символ «точка с запятой».

Блоки команд для каждого ПУ содержат заголовок вида: >рК, где N - номер ПУ. Если для нескольких ПУ используется одна и та же программа, можно вместо N указать две цифры. Например, запись: >р14 загрузит расположенную следом программу во все ПУ от ПУ1 до ПУ4 включительно.

6. Заключение

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

Разработанный автором исполнитель выполнен на базе известного исполнителя под названием «Удвоитель». Фактически это несколько исполнителей, каждый из которых способен вести вычисления самостоятельно по собственной программе. Для передачи числовых данных между параллельными удвоителями имеются специальные команды обмена. Кроме того, для расширения круга решаемых задач в их конструкции предусмотрена ячейка памяти, которая позволяет сохранять одно число.

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

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

Список литературы

1. Алгоритмика: учеб. пособие / А.К. Звонкин, С.К. Ландо, А.Л. Семенов, А.Х. Шень. -М.: Институт новых технологий образования, 1994.

2. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. - М.: Финансы и статистика, 1992.

3. Коменский Я.А. Избранные педагогические сочинения: в 2 т. - Т. 1. - М.: Педагогика,

1982.

4. Кучев А.Д., Плаксин М.А. Параллельные вычисления в школьной информатике. Игра «Танковый экипаж» // Информатика в школе: прошлое, настоящее и будущее: Материалы Всеросс. науч.-метод. конф. по вопросам применения ИКТ в образовании. - Пермь: ПГНИУ, 2014.

5. Кушниренко А.Г., Лебедев Г.В., Сворень Р.А. Основы информатики и вычислительной техники: Проб. учеб. для сред. учеб. заведений. - М.: Просвещение, 1990.

6. Майергойз Д.М. Аналогия в педагогическом процессе // Математика в школе. - 1947. -№ 1. - С. 60-65.

7. Основы информатики и вычислительной техники / А.Г. Гейн, В.Г.Житомирский, Е.В. Линецкий и др. - Свердловск: Изд-во Урал. ун-та, 1989.

8. Поляков К.Ю., Еремин Е.А. Алгоритмизация и программирование // Информатика ("Первое сентября"). - 2016. - № 4. - С.4-43.

9. Burks A.W., Goldstine H.H., Neumann J. Preliminary Discussion of the Logical Design of an Electronic Computing Instrument. - Princeton, NJ: Institute for Advanced Study, 1946 (русский перевод: Беркс А., Голдстейн Г., Нейман Дж. Предварительное рассмотрение логической конструкции электронного вычислительного устройства // Кибернетический сборник. Вып. 9. -М.: Мир, 1964).

10. Chang K. Study Suggests Math Teachers Scrap Balls and Slices // The New York Times, 25.04 2008 [Электронный ресурс]. - URL: http://www.nytimes.com/2008/04/25/science/25math.html (дата обращения: 30.12.2017) (русский перевод: http://educomp.runnet.ru/lmc/abstr_math.html).