Это очень незначительная проблема;хотя я не вижу определения переменной, я сильно подозреваю, что строка MPI_Recv должна быть MPI_Recv(..., COMM, &status)
.
Однако есть еще одна проблема;задача должна избегать отправки сообщений себе, и она должна не выдавать блокирующую отправку (например, MPI_Send
против MPI_Isend
) для себя;для достаточно больших сообщений, отправка которых будет заблокирована, задача 0 отправляет блокирующую отправку, но пока не получает ее активно.
Примерно так будет работать:
if(myid==0){
for(i=1; i<nprocs; i++)
MPI_Send(weights+displs[i], counts[i], MPI_DOUBLE, i, 0, COMM);
memcpy(weights+displs[0], partition, counts[0]*sizeof(double));
} else {
MPI_Recv(partition, counts[myid], MPI_DOUBLE, 0, 0, COMM, &status);
}
Обратите внимание, что на практикенезависимо от того, MPI_Scatterv
должен быть таким же быстрым или быстрым, как отправка по циклу.