gpt4 book ai didi

c - 使用带有 ISend 和 IRecv 的三个线程使用 MPI 发送消息

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:45 26 4
gpt4 key购买 nike

我正在尝试并行生成导数矩阵。我有两个线程的整个热方程求解器,但现在我试图找出如何将底行发送到下一个级别的 rec2,并将顶行发送到上一个级别的 rec1。我试着弄乱请求矩阵中的数字,但没有任何效果。出于某种原因,我被告知使用 iSend 时,两个不同的接收是相同的请求。

任何解决此问题或帮助我更好地理解此问题的建议都会很棒。

  double** change = alloc(sizeX,sizeY); 
double* rec1;
double* rec2;
int rank,size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Request req[4];


if(rank != 0)
{
rec1 = calloc(sizeY,sizeof(double));
}
if(rank != size-1)
{
rec2 = calloc(sizeY,sizeof(double));
}

if ( rank == 0 )
{
MPI_Irecv(rec2, sizeY, MPI_DOUBLE, rank+1, 1244, MPI_COMM_WORLD, &req[1]);
MPI_Isend(u[sizeX-1], sizeY, MPI_DOUBLE, rank+1, 1244, MPI_COMM_WORLD, &req[0]);
}
else if ( rank == size-1 )
{
MPI_Irecv(rec1, sizeY, MPI_DOUBLE, rank - 1, 1244, MPI_COMM_WORLD, &req[2]);
MPI_Isend(u[0], sizeY, MPI_DOUBLE, rank - 1, 1244, MPI_COMM_WORLD, &req[3]);
}
else if ( rank != 0 && rank != size -1)
{
MPI_Irecv(rec1, sizeY, MPI_DOUBLE, rank-1, 1234, MPI_COMM_WORLD, &req[1]);
MPI_Isend(u[0], sizeY, MPI_DOUBLE, rank-1, 1234, MPI_COMM_WORLD, &req[0]);

MPI_Irecv(rec2, sizeY, MPI_DOUBLE, rank+1, 1234, MPI_COMM_WORLD, &req[2]);
MPI_Isend(u[sizeX-1], sizeY, MPI_DOUBLE, rank+1, 1234, MPI_COMM_WORLD, &req[3]);

}
// setting elements of most of the points

int xStart = 1;
int xBound = sizeX-1;

for(int x = xStart; x < xBound; x++)
{
for(int y = 1; y < sizeY-1; y++)
{
change[x][y] = fpp(u[x-1][y],u[x][y],u[x+1][y],dx)
+ fpp(u[x][y-1],u[x][y],u[x][y+1],dx);
}
}

MPI_Waitall(size+1,req,MPI_STATUSES_IGNORE );

最佳答案

注意请求的数量和他们的开始! rank 0 和 rank size-1 处理 2 条消息,而其他处理 4 条消息。这可能会导致 MPI_Waitall() 出现问题。并且rank size-1不初始化req[0]和req[1]

使用@JonathanDursi 的reqcnt 技巧:

 int nbreq=0;
if(rank!=0 && size>1){
MPI_Irecv(rec1, sizeY, MPI_DOUBLE, rank - 1, 1244, MPI_COMM_WORLD, &req[nbreq]);
nbreq++;
MPI_Isend(u[0], sizeY, MPI_DOUBLE, rank - 1, 1244, MPI_COMM_WORLD, &req[nbreq]);
nbreq++;
}
if(rank!=size-1){
MPI_Irecv(rec2, sizeY, MPI_DOUBLE, rank+1, 1244, MPI_COMM_WORLD, &req[nbreq]);
nbreq++;
MPI_Isend(u[sizeX-1], sizeY, MPI_DOUBLE, rank+1, 1244, MPI_COMM_WORLD, &req[nbreq]);
nbreq++;
}
...
MPI_Waitall(nbreq,req,MPI_STATUSES_IGNORE );

关于c - 使用带有 ISend 和 IRecv 的三个线程使用 MPI 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23791381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com