Параллельное программирование в стандарте MPI. Баканов В.М - 61 стр.

UptoLike

Составители: 

- 61 -
В конце работы все
numworkers
процессов возвращают
rows*NCB
строк
[C] главному процессу
посредством выполнения
MPI_Send(&c, rows*NCB,
MPI_DOUBLE, MASTER, FROM_MASTER, MPI_COMM_WORLD);
причем предва-
рительно номер первой строки
offset
передается посредством
MPI_Send(&offset, 1, MPI_INT, MASTER, FROM_MASTER, MPI_COMM_WORLD)
, а
число строк
rows
MPI_Send(&rows,1, MPI_INT, MASTER, FROM_MASTER,
MPI_COMM_WORLD).
MASTER-процесс принимает эти данные вызовом
MPI_Recv(&c[offset][0], rows*NCB, MPI_DOUBLE, source, FROM_WORKER,
MPI_COMM_WORLD, &status).
Ниже приводится начало выдачи программы при NRA=1000 и числе вы-
числительных узлов 12 (видно, что в случае невозможности деления NRA на
numworkers
нацело равный
extra=NRA%numworkers
отстаток распределяется
равномерно по первым 4 вычислительным узлам):
Number of worker tasks = 12
task ID = 5
task ID = 11
task ID = 10
task ID = 1
task ID = 0
task ID = 6
task ID = 7
task ID = 3
task ID = 2
task ID = 9
task ID = 8
task ID = 12
task ID = 4
...sending 84 rows to task 1
...sending 84 rows to task 2
...sending 84 rows to task 3
...sending 84 rows to task 4
...sending 83 rows to task 5
...sending 83 rows to task 6
...sending 83 rows to task 7
...sending 83 rows to task 8
...sending 83 rows to task 9
...sending 83 rows to task 10
...sending 83 rows to task 11
...sending 83 rows to task 12
Дальнейшим развитием (в сторону минимизации числа пересылок данных)
ленточного алгоритма умножения матриц является алгоритм Фокса (Geoffrey
Fox, et al., Solving Problems on Concurrent Processors, Englewood Cliffs, NJ,
Prentice-Hall, 1998) и алгоритм Кэннона (в этом случае процессам пересыла-
ются не ленты, а прямоугольные блоки исходных матриц; усложнением при
этом является необходимость дополнительного межпроцессного обмена, ибо
на основе прямоугольных блоков [A] и [B] невозможно вычислить
такой же
блок [C] – необходим циклический сдвиг фронта вычислений).
                                      - 61 -

  В конце работы все numworkers процессов возвращают rows*NCB строк
[C] главному процессу посредством выполнения     MPI_Send(&c, rows*NCB,
MPI_DOUBLE, MASTER, FROM_MASTER, MPI_COMM_WORLD); причем предва-
рительно номер первой строки offset передается посредством
MPI_Send(&offset, 1, MPI_INT, MASTER, FROM_MASTER, MPI_COMM_WORLD), а
число строк rows – MPI_Send(&rows,1, MPI_INT, MASTER, FROM_MASTER,
MPI_COMM_WORLD).         MASTER-процесс принимает эти данные вызовом
MPI_Recv(&c[offset][0], rows*NCB,   MPI_DOUBLE,    source,   FROM_WORKER,
MPI_COMM_WORLD, &status).
  Ниже приводится начало выдачи программы при NRA=1000 и числе вы-
числительных узлов 12 (видно, что в случае невозможности деления NRA на
numworkers нацело равный extra=NRA%numworkers отстаток распределяется
равномерно по первым 4 вычислительным узлам):

  Number of worker tasks = 12
  task ID = 5
  task ID = 11
  task ID = 10
  task ID = 1
  task ID = 0
  task ID = 6
  task ID = 7
  task ID = 3
  task ID = 2
  task ID = 9
  task ID = 8
  task ID = 12
  task ID = 4
  ...sending 84 rows to task 1
  ...sending 84 rows to task 2
  ...sending 84 rows to task 3
  ...sending 84 rows to task 4
  ...sending 83 rows to task 5
  ...sending 83 rows to task 6
  ...sending 83 rows to task 7
  ...sending 83 rows to task 8
  ...sending 83 rows to task 9
  ...sending 83 rows to task 10
  ...sending 83 rows to task 11
  ...sending 83 rows to task 12

  Дальнейшим развитием (в сторону минимизации числа пересылок данных)
ленточного алгоритма умножения матриц является алгоритм Фокса (Geoffrey
Fox, et al., Solving Problems on Concurrent Processors, Englewood Cliffs, NJ,
Prentice-Hall, 1998) и алгоритм Кэннона (в этом случае процессам пересыла-
ются не ленты, а прямоугольные блоки исходных матриц; усложнением при
этом является необходимость дополнительного межпроцессного обмена, ибо
на основе прямоугольных блоков [A] и [B] невозможно вычислить такой же
блок [C] – необходим циклический сдвиг фронта вычислений).