- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个程序,其中来自数组的信息被传递到不同的处理器。在下面的代码中,我尝试使用 for 循环反复向处理器发送信息或从处理器发送信息。当我在 5 核和 2 核上运行程序时,所有打印语句都按预期在第一次迭代中执行,但此后不再执行打印语句。该程序不会退出并显示任何错误消息。它只是挂起。有什么想法吗?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
/*MPI Specific Variables*/
int my_size, my_rank, up, down;
MPI_Request reqU, reqD, sreqU, sreqD;
MPI_Status rUstatus, rDstatus, sUstatus, sDstatus;
/*Other Variables*/
int max_iter = 10;
int grid_size = 1000;
int slice;
int x,y,j;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &my_size);
/*Determining neighbours*/
if (my_rank != 0) /*if statemets used to stop highest and lowest rank neighbours arent outside 0 - my_size-1 range of ranks*/
{
up = my_rank-1;
}
else
{
up = 0;
}
if(my_rank != my_size-1)
{
down = my_rank+1;
}
else
{
down = my_size-1;
}
/*cross-check: presumed my_size is a factor of gridsize else there are odd sized slices and this is not coded for*/
if (grid_size%my_size != 0)
{
printf("ERROR - number of procs = %d, this is not a factor of grid_size %d\n", my_size, grid_size);
exit(0);
}
/*Set Up Distributed Data Approach*/
slice = grid_size/my_size;
printf("slice = %d\n", slice);
double phi[slice+2][grid_size]; /*extra 2 rows to allow for halo data*/
for (y=0; y < slice+2; y++)
{
for (x=0; x < grid_size; x++)
{
phi[y][x] = 0.0;
}
}
for (j=0; j<max_iter +1; j++)
{
if (my_rank > 0)
{
printf("1. myrank =%d\n",my_rank);
/*send top most strip up one node to be recieved as bottom halo*/
MPI_Isend(&phi[1][0], grid_size, MPI_DOUBLE, down, 1, MPI_COMM_WORLD, &sreqU);
printf("2. myrank =%d\n",my_rank);
/*recv top halo from up one node*/
MPI_Irecv(&phi[slice + 1][0], grid_size, MPI_DOUBLE, down, 2, MPI_COMM_WORLD, &reqU);
printf("3. myrank =%d\n",my_rank);
}
if (my_rank < my_size -1)
{
printf("4. myrank =%d\n",my_rank);
/*recv top halo from down one node*/
MPI_Irecv(&phi[0][0], grid_size, MPI_DOUBLE, up, 1, MPI_COMM_WORLD, &reqD);
printf("5. myrank =%d\n",my_rank);
/*send bottom most strip down one node to be recieved as top halo*/
MPI_Isend(&phi[slice][0], grid_size, MPI_DOUBLE, up, 2, MPI_COMM_WORLD, &sreqD);
printf("6. myrank =%d\n",my_rank);
}
if (my_rank>0)
{
printf("7. myrank =%d\n",my_rank);
/*Wait for send to down one rank to complete*/
MPI_Wait(&sreqU, &sUstatus);
printf("8. myrank =%d\n",my_rank);
/*Wait for recieve from up one rank to complete*/
MPI_Wait(&reqU, &rUstatus);
printf("9. myrank =%d\n",my_rank);
}
if (my_rank < my_size-1)
{
printf("10. myrank =%d\n",my_rank);
/*Wait for send to up down one rank to complete*/
MPI_Wait(&sreqD, &sDstatus);;
printf("11. myrank =%d\n",my_rank);
/*Wait for recieve from down one rank to complete*/
MPI_Wait(&reqD, &rDstatus);
printf("12. myrank =%d\n",my_rank);
}
}
printf("l\n");
MPI_Finalize();
return 0;
}
最佳答案
这与迭代无关,剩下的问题是 up
/down
的计算。这在代码中是相反的,只要需要 down
就定义 up
...这在您之前的代码中没有显示,因为 MPI_PROC_NULL
只会跳过这些通信。
关于c - MPI_Isend/Irecv 仅在 for 循环的第一次迭代中执行。是什么阻止它在循环的后续迭代中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54378428/
我正在运行以下代码,该代码使用命令 rank 将数组从 0 1 发送到 mpirun -n 2 python -u test_irecv.py > output 2>&1 。 from mpi4py
我使用MPI非阻塞通信(MPI_Irecv, MP_Isend)来监控slaves的空闲状态,代码如下。 排名 0: int dest = -1; while( dest <= 0){ int
我正在创建一个程序,其中来自数组的信息被传递到不同的处理器。在下面的代码中,我尝试使用 for 循环反复向处理器发送信息或从处理器发送信息。当我在 5 核和 2 核上运行程序时,所有打印语句都按预期在
我正在收到 boost::mpi使用 irecv() 的消息功能。我有一个等待循环,调用 test()在 request 上irecv 返回的对象并且,如果请求完成,则执行某些操作。然而,试图找出发件
我的 MPI_Isend 和 MPI_Irecv 代码块有问题。我需要将一个数字 Cin 发送到生产线上的下一个流程,然后当前流程才能处理它的业务。 接收进程需要接收才能继续计算,但是当我没有 MPI
我在 c 中有一个简单的 MPI 代码,我试图在其中学习如何在进程之间进行通信。这是代码: 已编辑代码 -> 问题已解决 #include #include #include #include
一个看似愚蠢的问题,但我似乎无法以任何方式找到明确的答案。 基本问题是我是否需要为 MPI::Isend 提供相应的 MPI::Irecv? 也就是说,即使消息发送是非阻塞的,只要我在重用发送缓冲区之
当我使用 Send/Recv 时,我的代码可以工作,但是当我用 Isend/Irecv 替换 Send/Recv 时,它会产生段错误。但在去其他地方之前,我想验证一下以下代码片段是否看起来很重要。 其
当使用序列化数据对同一标签执行多个 isend/irecv 传输时,我发现 boost::mpi 出现了 MPI_ERR_TRUNCATE 错误。这些不是并发传输,即不涉及线程。同时只有不止一项未完成
我正在尝试并行生成导数矩阵。我有两个线程的整个热方程求解器,但现在我试图找出如何将底行发送到下一个级别的 rec2,并将顶行发送到上一个级别的 rec1。我试着弄乱请求矩阵中的数字,但没有任何效果。出
我正在创建一个程序来使用 MPI 计算两个导体之间的电势。我正在使用非阻塞发送和接收,因此可以在处理器之间发送信息时进行计算。 但是,isend 和 irecv 之间的 if 语句以及包含计算的 wa
我是一名优秀的程序员,十分优秀!