Автор: Пользователь скрыл имя, 13 Ноября 2011 в 18:59, курсовая работа
Идея параллельной обработки данных не нова. Можно считать, что она возникла еще на заре человеческой цивилизации, когда оказалось, что племя может успешно бороться за выживание, если каждый его член выполняет свою часть общей работы.
В ближайшее время под эффективным использованием аппаратных средств компьютера будут пониматься применение параллельных алгоритмов. Это связано с замедлением темпов роста тактовой частоты микропроцессоров и быстрым распространением многоядерных микропроцессоров.
В случае языка MC#, программист может предусмотреть исполнение автономных асинхронных методов либо локально, либо удаленно. В последнем случае, метод может быть спланирован для исполнения на другой машине, выбираемой двумя способами: либо согласно явному указанию программиста (что не является типичным случаем), либо автоматически (обычно, на наименее загруженном узле кластера или машине Grid-сети). Взаимодействие асинхронных методов, в рамках языка MC#, реализуется посредством передачи сообщений с использованием каналов и обработчиков канальных сообщений. Эти каналы и обработчики определяются в MC#-программах с помощью связок в стиле языка Polyphonic C#.
В любом традиционном
языке объектно-
При исполнении программы на параллельной архитектуре, сокращение времени её работы может быть достигнуто путем распределения множества исполняемых методов на несколько ядер одного процессора, и, возможно, отправкой части из них на другие процессоры (машины) при распределенных вычислениях.
Разделение всех
методов в программе на обычные
(синхронные) и асинхронные производится
программистом с использованием специальных
ключевых слов async
и movable. (В языке MC#, семантика и
использование ключевого слова async
полностью совпадает с использованием
этого слова в языке Polyphonic C# за тем исключением,
что в MC# async-методы не могут встречаться
в связках – см. об этом ниже).
async-
и movable-методы, каналы,
обработчики связки
Async- и movable- методы являются единственным средством создания параллельных процессов (потоков) в языке MC#.
Основой взаимодействия параллельных процессов в языке MC# является передача сообщений (в отличие от другой альтернативы – использования общей (разделяемой) памяти). В языке MC#, средства взаимодействия между процессами оформлены в виде специальных синтаксических категорий – каналов и обработчиков канальных сообщений. При этом, синтаксически посылка сообщения по каналу или прием из него с помощью обработчика выглядят в языке как вызовы обычных методов.
Общий синтаксис определения async- и movable-методов в языке MC# следующий:
модификаторы {async | movable} имя_метода (аргументы)
{
<тело метода>
}
Ключевые слова async и movable располагаются на месте типа возвращаемого значения, поэтому синтаксическое правило его задания при объявлении метода в языке MC# имеет вид:
return-type::= type | void | async | movable
Задание ключевого слова async означает, что при вызове данного метода он будет запущен в виде отдельного потока локально, т.е., на данной машине, но без перемещения на другую машину. Ключевое слово movable означает, что данный метод при его вызове может быть спланирован для исполнения на другой машине. Как обычно, для любого параллельного языка программирования, реализация MC# состоит из компилятора и рантайм-системы. Главными функциональными частями рантайм-системы являются:
Компилятор
переводит программу из MC# в C#, его
главной целью является создание
кода, реализующего: 1) выполнение movable-методов
на других процессорах, 2) пересылку
канальных сообщений и 3) синхронизацию
методов, объединённых связкой. Эти
функции предоставляются
Главные функции компилятора MC#:
3.3 Параллельные библиотеки
При
использовании библиотек
ATLAS
ATLAS (Automatically
Tuned Linear Algebra Software) - библиотека, позволяющая
автоматически генерировать и
оптимизировать численное
Aztec
Aztec - параллельная
библиотека итерационных
DOUG
DOUG (Domain
decomposition On Unstructured Grids) - параллельный
решатель для finite element - систем, возникающих
из дифференциальных уравнений
с частными производными
GALOPPS
GALOPPS (Genetic ALgorithm Optimized for Portability and Parallelism System) - библиотека "обобщенных" генетических алгоритмов. Доступна многопоточная версия.
JOSTLE
JOSTLE - библиотека для распределения расчетов на сетках (mesh partitioning software). Реализована на С с помощью MPI.
NAMD
NAMD - параллельная
объектно-ориентированная
ParMETIS
PARMETIS - параллельная версия библиотеки METIS, включающей ряд алгоритмов над графами (parallel graph partitioning). Реализована с помощью MPI.
PETSc
Набор
процедур и структур данных для параллельного
решения научных задач с
ScaLAPACK
Библиотека
ScaLAPACK включает подмножество процедур
LAPACK, переработанных для использования
на MPP-компьютерах, включая: решение
систем линейных уравнений, обращение
матриц, ортогональные преобразования,
поиск собственных значений и
др. Может быть портирована на любую
платформу, где поддерживается PVM или
MPI.
3.4
Классы задач, решаемые
с помощью параллелизма
3.5 Примеры решения задач
3.5.1 Вычисление чисел Фибоначчи
Последовательность чисел Фибоначчи есть бесконечный ряд из натуральных чисел
a0, a1, a2, a3, . . .
таких, что
a0 = 1,
a1 = 1, и
ai = ai-1 + ai-2, для i ³ 2.
Построим параллельную программу, находящую -ое ( ³ ) число в ряду Фибоначчи, т.е., элемент anпоследовательности.
Первый вариант
такой программы будет иметь
рекурсивную структуру, соответствующую
формуле определения чисел
class Fib {
public async Compute( int x, channel (int)sendResult ) {
if ( n <= 1 )
sendResult ( 1 );
else {
new Fib().Compute( n – 1, ic1 );
new Fib().Compute( n – 2, ic2 );
sendResult ( Get() );
}
}
Handler Get int() &channel ic1( int x )
&channel ic2(int y )
{
return x + y;
}
}
public class MainFib {
public static void Main( String[] args ) {
int n = System.Convert.ToInt32( args [0] ); // n естьномер
// искомого числа Фибоначчи ( n>= 1 )
MainFibmfib = new MainFib(); // Создание объекта
// необходимо для создания его каналов
// и обработчиков
Fib fib = new Fib();
fib.Compute( n, mfib.senResult );
Console.WriteLine( “For n = “ + n + “ value is “ +
mfib.Get() );
}
handler Get int() &channel sendResult( int x )