Re[2]: MPI_Gather
От: _hum_ Беларусь  
Дата: 22.03.17 18:59
Оценка:
Здравствуйте, Андрюха, Вы писали:

А>Здравствуйте, _hum_, Вы писали:


__>>Народ, подскажите, какая логика стоит за тем, чтобы использовать одну и ту же функцию и для отсылки, и для сбора данных от процессов? Я имею в виду MPI_Gather.

__>>Заечм делать
__>>
__>>    int MPI_Gather(void*        sendbuf,   //IN     адрес начала размещения посылаемых данных;
__>>                   int          sendcount, //IN     число посылаемых элементов;
__>>                   MPI_Datatype sendtype,  //IN     тип посылаемых элементов;
__>>                   void*        recvbuf,   //OUT     адрес начала буфера приема (используется только в процессе-получателе root);
__>>                   int          recvcount, //IN     число элементов, получаемых от каждого процесса (используется только в процессе-получателе root);
__>>                   MPI_Datatype recvtype,  //IN     тип получаемых элементов;
__>>                   int          root,      //IN     номер процесса-получателя;
__>>                   MPI_Comm     comm)      //IN     коммуникатор.
__>>

__>>заставляя всовывать неиспользующиеся аргументы в функцию?


А>Предполагаю, что так просто короче и удобнее, а "красота" или "логика" принесена в жертву. Такие вспомогательные функции всегда можно заменить алгоритмом на основе MPI_Send/MPI_Recv, но, когда начинаешь писать этот алгоритм, понимаешь, что начинаешь изобретать велосипед.


ммм...с каких пор "короче" стало приоритетнее при написании прог, чем "понятнее"? мне, например, не очень нравится, что вместо того, чтобы писать что-то наподобие
if(0 == proc_rank)
{
  std::vector<int> MPIGatheredValues(nMPIProcessesCount, 0);

  MPI_Gather(MPIGatheredValues.data(), 1, MPI_INT, 0, MPI_COMM_WORLD);

  //<working as for a root process>
}
else
{
    const int value = <something>;

    MPI_SendForGathering(&value, 1, MPI_INT, 0, MPI_COMM_WORLD);

    //<working as for a non root process>
}

приходится мешать все в кучу, наподобие
std::vector<int> MPIGatheredValues(nMPIProcessesCount, 0);

const int value = <something>;

MPI_Gather(&value, 1, MPI_INT, MPIGatheredValues.data(), 1, MPI_INT, 0, MPI_COMM_WORLD);




UPD. Возникла мысль — может быть, так сделано, для того, чтобы гарантировать, что всегда будет отсылающий и собирающий?
Отредактировано 22.03.2017 19:25 _hum_ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.