Реализация нерегулярной двухточечной связи - PullRequest
0 голосов
/ 30 ноября 2018

У меня N процессы MPI.Каждый процесс должен отправить некоторым другим процессам массивы данных (целые числа).Массивы для отправки имеют разные размеры.Все процессы знают / от кого отправлять / получать и сколько.

Например, существуют N=4 процессы MPI (P).

P0 sends: 2 ints to P1, 5 ints to P2, 6 ints to P3
P1 sends: 3 ints to P2, 4 ints to P3
P2 sends: nothing, only receives.
P3 sends: 3 ints to P1

Каков наилучший способорганизовать такой обмен данными?

Я думаю об этом:

Пусть C(S,D) обозначает количество данных, которые будут отправлены из процесса S в процесс D.

On each process P:
1. For R = 0 ... N-1
   {
       if C(R,P) > 0
           call MPI_Irecv( source = R, count = C(R,P), ... )
   }
2. For R = 0 ... N-1
   {
       if C(P,R) > 0
           call MPI_Send( destination = R, count = C(R,P), ... )
   }
3. MPI_Waitall for requests created in Step 1.

Есть ли лучший подход?Этот обмен происходит только один раз во время выполнения.

...