MPI Fortran - метод усреднения значений по процессорам - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть двойной массив, который разбивается на части и распределяется между процессами.Тем не менее, фрагменты соответствуют целочисленным индексированным местоположениям, которые могут дублироваться на других фрагментах.Как я могу усреднить двойные значения, которые соответствуют дублированным целочисленным индексам местоположения?

Например, у нас есть массив размером 9, разделенный между двумя процессорами.Вывод на экран значений массива на каждом процессоре будет

    proc=0
    idx value
    1   0.4324
    2   0.5
    3   0.7433

    proc=1
    idx value
    2  1.0
    4  0.432
    5  0.406
    6  0.843

. Требуемое поведение кода состоит в том, чтобы найти, что idx = 2 дублируется, и, следовательно, среднее значение для индекса местоположения = 2 должнобыть (0,5 + 1,0) /2,0 = 0,75.

Я думаю сделать MPI_Send / Recv и сравнить целые числа.Затем каким-то образом для этих дублированных значений усредните соответствующие двойные значения и замените среднее значение в массиве.

    sbuf(:) = indexarr(:)
    sbufdouble(:) = values(:)
    do iproc=1,nproc
       call MPI_Send(sbuf, size(sbuf), MPI_REAL, iproc... 
      ! Should I send the double values as well? 
    enddo

    do iproc=1,nproc
       call MPI_Recv(rbuf,...) 
    enddo

   !  Do some comparison between rbuf and the array chunk 
      indexarr owned by this processor

   !  If integers match, average the corresponding double values 
      between the two

   !  Replace the averaged value in indexarr(:) 
...