#c #mpi
#c #mpi
Вопрос:
ПРАВКА #1:
итак, РЕШЕНИЕ:
строка
MPI_Gatherv(buffer, rank, MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);
необходимо изменить на
MPI_Gatherv(buffer, receive_counts[rank], MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);
еще раз спасибо за помощь
ОРИГИНАЛЬНОЕ СООБЩЕНИЕ:
мой код из DeinoMPI
когда я запускаю mpiexec -localonly 4 skusamGatherv.exe , все в порядке.
если я изменю строку
int receive_counts[4] = { 0, 1, 2, 3 };
Для
int receive_counts[4] = { 0, 1, 2, 1 };
компиляция все еще в порядке, но когда я запускаю mpiexec -localonly 4 skusamGatherv.exe Я получу ошибку
Я думаю, что это сработает
Спасибо за помощь
Я получу ошибку:
Fatal error in MPI_Gatherv: Message truncated, error stack:
MPI_Gatherv(363)........................: MPI_Gatherv failed(sbuf=0012FF4C, scou
nt=0, MPI_INT, rbuf=0012FF2C, rcnts=0012FEF0, displs=0012FED8, MPI_INT, root=0,
MPI_COMM_WORLD) failed
MPIDI_CH3_PktHandler_EagerShortSend(351): Message from rank 3 and tag 4 truncate
d; 12 bytes received but buffer size is 4
unable to read the cmd header on the pmi context, Error = -1
.
0. [0][0][0][0][0][0] , [0][0][0][0][0][0]
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
1. [1][1][1][1][1][1] , [0][0][0][0][0][0]
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
2. [2][2][2][2][2][2] , [0][0][0][0][0][0]
unable to read the cmd header on the pmi context, Error = -1
.
Error posting readv, An existing connection was forcibly closed by the remote ho
st.(10054)
3. [3][3][3][3][3][3] , [0][0][0][0][0][0]
job aborted:
rank: node: exit code[: error message]
0: jan-pc-nb: 1: Fatal error in MPI_Gatherv: Message truncated, error stack:
MPI_Gatherv(363)........................: MPI_Gatherv failed(sbuf=0012FF4C, scou
nt=0, MPI_INT, rbuf=0012FF2C, rcnts=0012FEF0, displs=0012FED8, MPI_INT, root=0,
MPI_COMM_WORLD) failed
MPIDI_CH3_PktHandler_EagerShortSend(351): Message from rank 3 and tag 4 truncate
d; 12 bytes received but buffer size is 4
1: jan-pc-nb: 1
2: jan-pc-nb: 1
3: jan-pc-nb: 1
Press any key to continue . . .
Мой код:
#include "mpi.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
int buffer[6];
int rank, size, i;
int receive_counts[4] = { 0, 1, 2, 3 };
int receive_displacements[4] = { 0, 0, 1, 3 };
MPI_Init(amp;argc, amp;argv);
MPI_Comm_size(MPI_COMM_WORLD, amp;size);
MPI_Comm_rank(MPI_COMM_WORLD, amp;rank);
if (size != 4)
{
if (rank == 0)
{
printf("Please run with 4 processesn");fflush(stdout);
}
MPI_Finalize();
return 0;
}
for (i=0; i<rank; i )
{
buffer[i] = rank;
}
MPI_Gatherv(buffer, rank, MPI_INT, buffer, receive_counts, receive_displacements, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0)
{
for (i=0; i<6; i )
{
printf("[%d]", buffer[i]);
}
printf("n");
fflush(stdout);
}
MPI_Finalize();
return 0;
}
Ответ №1:
Сделайте шаг назад и рассмотрите, что делает MPI_Gatherv: это MPI_Gather (в данном случае с рангом 0), где каждый процессор может отправлять разные объемы данных.
В вашем примере ранг 0 отправляет 0 целых чисел, ранг 1 отправляет 1 целое число, ранг 2 отправляет 2 целых числа, а ранг 3 отправляет 3 целых числа.
MPIDI_CH3_PktHandler_EagerShortSend(351): Message from rank 3 and tag 4 truncated; 12 bytes received but buffer size is 4
он скрыт под множеством другой информации, но в нем говорится, что 3-й ранг отправил 3 целых числа (12 байт), но в 0-м ранге было место только для 1 целого числа.
Посмотрите на первые три аргумента для gatherv: ‘buffer, rank, MPI_INT’. Независимо от того, что вы установили для приема, ранг 3 всегда будет отправлять 3 целых числа.
обратите внимание, что вы можете недополнить буфер (вы могли бы создать, скажем, последний элемент из receive_counts
100), но вы сказали библиотеке MPI с меньшим значением receive_counts[3]
ожидать только 1 int, хотя вы отправили 3.
Комментарии:
1. спасибо, этот ранг в качестве аргумента меня смутил, я принял его за то, откуда он отправлен, и это размер отправленных данных
2. ну, просто для пояснения, кортеж «буфер, количество, тип данных» часто отображается в MPI. Этот кортеж описывает местоположение и размер памяти.