В моем коде у меня есть произвольное число процессов, обменивающих некоторые части своих локальных векторов. Локальные векторы — это векторы пар, и по этой причине я использовал тип данных, полученный из MPI. В принципе, я не знаю, сколько элементов каждый процесс отправляет другим, и поэтому я также должен отправить размер буфера. В частности, каждый процесс обменивается данными с процессом ранга myrank-1 и процессом ранга myrank + 1. В случае процесса 0 вместо myrank-1 он обменивается с процессом с рангом comm_size-1. И также в случае процесса comm_size-1 вместо myrank + 1 он обменивается с процессом с рангом 0.
Это мой код:
unsigned int size1tobesent;
size1tobesent=last.size();//Buffer size
int slpartner = (rank + 1) % p;
int rlpartner = (rank - 1 + p) % p;
unsigned int sizereceived1;
MPI_Sendrecv(&size1tobesent, 1, MPI_UNSIGNED, slpartner, 0,&sizereceived1,1,
MPI_UNSIGNED, rlpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
Vect first1(sizereceived1);
MPI_Sendrecv(&last[0], last.size(), mytype, slpartner, 0,&first1[0],sizereceived1,
mytype, rlpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
unsigned int size2tobesent;
size2tobesent=first.size();//Buffer size2
unsigned int sizereceived2;
MPI_Sendrecv(&size2tobesent, 1, MPI_UNSIGNED, rlpartner, 0,
&sizereceived2,1,MPI_UNSIGNED, slpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
Vect last1(sizereceived2);
MPI_Sendrecv(&first[0], first.size(), mytype, rlpartner, 0,&last1[0],
sizereceived2 ,mytype, slpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
Теперь, когда я запускаю свой код с 2 или 3 процессами, все работает как положено. С более чем 3 результаты непредсказуемы. Я не знаю, связано ли это с определенной комбинацией входных данных или есть какие-то теоретические ошибки, которые я пропускаю.
Наконец, учтите, что этот код является частью цикла for.
Задача ещё не решена.
Других решений пока нет …