Я знаю, что подобные вопросы уже обсуждались ранее, см. ниже, почему они не относятся к моему делу. У меня есть кусок кода, который выглядит следующим образом:
int current_rank;
MPI_Comm_rank(MPI_COMM_WORLD, ¤t_rank);
if (current_rank==ROOT_RANK){
...
#pragma omp for
for (long i = 0; i < num; i++) {
auto &choumbie = catalogue->get()[i];
/* array choumbie is modified */}
...}
а затем я хотел бы синхронизировать массив «чумби» по всем процессам. Я попытался реализовать его после этого пример и документацию. Итак, сразу после if (current_rank==ROOT_RANK) я сделал:
int gsize;
int *rbuf; // address of receive buffer
auto &choumbie = catalogue->get();
MPI_Comm_size(comm, &gsize);
int send_count=num;
rbuf = (int*)malloc(gsize*send_count*sizeof(double));
MPI_Allgather(choumbie,send_count, MPI_DOUBLE, rbuf, send_count, MPI_DOUBLE, comm);
Я думаю, что массив 'choumbie', который я хочу синхронизировать, не входит таким образом, но я также не нашел другого полезного примера. Похоже, что этот первый аргумент должен быть адресом памяти массива, который должен быть отправлен, но это не соответствует приведенному мной примеру выше.
P.S.: число одинаковое для каждого ранга.
Этот вопрос в моем случае не помогло, потому что я хотел бы использовать MPI_Allgather (также на C++, а не на Fortran). Также это не помогло в моем случае, потому что я хотел бы избежать использования MPI_Barrier.
ROOT_RANK
распространялась на все остальные ранги, просто используйтеMPI_Bcast
. С помощьюMPI_Allgather
вы собираете локальные копииchoumbie
и объединяете их в один большой массив вrbuf
. Илиchoumbie
распределяется по блокам? - person Hristo Iliev   schedule 25.06.2020choumbie
. Таким образом, независимо от того, каким образом процессы изменили (или не изменили) массив, я хотел бы, чтобы окончательныйchoumbie
был обновлен любыми изменениями, которые он мог претерпеть со всех рангов. Но для всего, что вы предлагаете, не могли бы вы привести примеры кода, потому что проблема в том, что я не понимаю синтаксис в моем контексте в первую очередь. - person Suyama87   schedule 25.06.2020MPI_Allgather
. Или у вас есть несколько копий одного и того же массива и вы хотите объединить локальные модификации — это совсем не просто, если только модификации не находятся в смежных непересекающихся областях. Судя по принятому ответу, у вас первый случай. - person Hristo Iliev   schedule 26.06.2020