Параллельная обработка данных


Система параллельного программирования Linda - часть 5


Теперь рассмотрим возможную схему организации программы для перемножения С=A*B двух квадратных матриц размера N*N. Инициализирующий процесс использует функцию out и помещает в пространство кортежей исходные строки матрицы A и столбцы матрицы B: out( "A",1, <1-я строка A>); out( "A",2, <2-я строка A>); ... out( "B",1, <1-й столбец B>); out( "B",2, <2-й столбец B>); ...

Для порождения Nproc идентичных параллельных процессов можно воспользоваться следующим фрагментом: for( i = 0; i < Nproc; ++i ) eval( "ParProc", get_elem_result() );

Входные данные готовы, и нахождение всех N2 элементов Cij результирующей матрицы можно выполнять в любом порядке. Главное - это распределить работу между процессами, для чего процесс, инициирующий вычисления, в пространство помещает следующий кортеж: out( "NextElementCij", 1);

Второй элемент данного кортежа всегда будет показывать, какой из N2 элементов Cij предстоит вычислить следующим. Базовый вычислительный блок функции get_elem_result() будет содержать следующий фрагмент: in( "NextElementCij", formal NextElement); if( NextElement < N*N ) out("NextElementCij ", NextElement + 1); Nrow = (NextElement - 1) / N + 1; Ncol = (NextElement - 1) % N + 1;

В результате выполнения данного фрагмента для элемента с номером NextElement процесс определит его местоположение в результирующей матрице: номер строки Nrow и столбца Ncol. Заметим, что если вычисляется последний элемент, то кортеж с именем "NextElementCij" в пространство не возвращается. Когда в конце работы программы процессы обратятся к этому кортежу, они будут заблокированы, что не помешает нормальному завершению программы. И, наконец, для вычисления элемента Cij каждый процесс get_elem_result выполнит следующий фрагмент: read( "A", Nrow, formal row); read( "B", Ncol, formal col); out( "result", Nrow, Ncol, DotProduct(row,col) );

где DotProduct это функция, реализующая скалярное произведение.


Начало  Назад  Вперед



Книжный магазин