0

在我的代码中,我有任意数量的进程交换它们的局部向量的某些部分。本地向量是成对的向量,因此我一直在使用 MPI 派生的数据类型。原则上我不知道每个进程向其他进程发送了多少元素,因此我还必须发送缓冲区的大小。特别是,每个进程与rank:myrank-1的进程和rank: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循环的一部分。

4

0 回答 0