Введение в высокоуровневый язык параллельного, распределенного программирования MC#
Цель - изучить модель программирования языка MC# и его специфические конструкции: async- и movable-методы, каналы, обработчики и связки
Высокоуровневый язык параллельного, распределенного программирования MC# предназначен для написания программ, работающих на всем спектре параллельных архитектур - от многоядерных процессоров до Grid-сетей. В случае, когда параллельная программа разрабатывается для исполнения на кластерах или Grid-сети, то она называется параллельной, распределенной программой.
Для исполнения MC#-программ, на машинах должна быть установлена среда исполнения CLR (Common Language Runtime) с соответствующим набором библиотек. На машине с операционной системой Windows, реализацией такой системы является Microsoft .NET Framework, а на машинах с операционной системой Linux - система Mono (http://www.mono-project.com).
Ключевая особенность языка MC# заключается в добавлении к обычным, синхронным методам, так называемых "асинхронных" методов, которые отмечаются в MC#-программах ключевым словом async (а в случае распределенных программ - ключевым словом movable ). При их вызове, происходит порождение нового потока (thread), в котором выполняется вызванный асинхронный метод.
Взаимодействие асинхронных методов в MC#-программе осуществляется с помощью передачи сообщений с использованием специальных средств - каналов и обработчиков канальных сообщений, выделенных в специальные синтаксические категории языка MC#: channels и handlers, соответственно.
Задача 1. Оттранслировать и выполнить, задавая различные значения входного параметра, программу вычисления n-го числа Фибоначчи:
Трансляция MC#-программ осуществляется командой:
mcsc <имя программы>.mcs
Запуск на выполнение осуществляется
- в Windows, командой
<имя программы> <входные параметры>
- в Linux, командой
mono <имя программы>.exe <входные параметры>
Объяснить, почему при рекурсивных вызовах программы, необходимо создание новых объектов класса Fib.
Задача 2. Оттранслировать и выполнить модифицированный вариант программы вычисления чисел Фибоначчи с порогом для локального вычисления (см. текст программы ниже):
Если задание выполняется на машине, имеющей два или более ядра (процессора), то для входного параметра n = 40, подобрать оптимальное значение порога, при котором время исполнения программы будет наименьшим.
Задача 3. Оттранслировать и выполнить программу вычисления чисел Фибоначчи с линейным порождением рекурсивных вызовов:
Если задание выполняется на многоядерной (многопроцессорной) машине, то сравнить время выполнения данного варианта программы с вариантом из Задачи 2 при запуске с N = 40 и одинаковым порогом для обеих программ.
Объяснить полученное время выполнения для этих вариантов по сравнению друг с другом.