- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题。假设我有 np 个进程。对于每个进程,我根据输入文件计算需要发送到每个其他进程的消息数量(从 0 到...),并且我想向它们发送这个数字。问题是我只能从通过直接连接的节点创建的拓扑发送。所以基本上我希望每个进程向所有其他进程发送一个 int,我有以下算法(将使用伪代码):
for(i=1,np){
if(i!=rankID){
MPI_Send(&nr,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM_WORLD);
MPI_SEND(&i,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM,WORLD); //i send the destination along with the int
}
}
while(1){
MPI_Recv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
MPI_Recv(&destination,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
if(destination == rankID){
ireceive+=recvInt;
receivedFrom++;
//normally i would break if i received all np-1 messages but what if someone sends a message through me for another process ?
}
else{
MPI_Send(&recvInt,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
MPI_Send(&destination,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
}
}
现在对此进行更多解释。在这个小算法结束时,我希望每个进程都知道它们在下一步中将收到多少条消息。
要从每个节点向每个节点发送此消息,我使用之前创建的路由表。基本上每个节点都有一个包含所有节点的矩阵,并且拓扑[节点][1] = 下一跳(这就是我输入 nexthop 的原因)上面的代码)。
每个节点都知道有 np 个进程,因此每个节点必须接收 np-1 条消息(他是目的地)。
我遇到的问题是,在收到 np-1 消息后,我无法中断,因为我可能是其他进程的 next_hop 并且消息不会被发送。所以我想做这样的事情,使用 MPI_TEST 或其他指令来查看我的 Recv 是否实际上正在接收某些内容,或者它是否只是坐在那里,因为如果程序阻塞 1-2 秒,很明显它不会接收不再需要(因为我没有最多 20-30 个进程的大型拓扑)。
问题是我从未使用过 MPI_Test 或其他语法,我不确定如何执行此操作。有人可以帮助我为 Recv 创建超时,或者是否有其他解决方案?谢谢,抱歉文字很长
最佳答案
可能不是最有效的代码,但它应该可以工作(我没有机会测试它)
MPI_Request request;
MPI_Status status;
for(i=1,np){
if(i!=rankID){
MPI_ISend(&nr,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM_WORLD);
MPI_ISend(&i,1,MPI_INT,topology[i][nexthop],DATA,MPI_COMM,WORLD); //i send the destination along with the int
}
}
while(1){
bool over = false;
if(over == true)
break;
if(recievedFrom < np){
MPI_Recv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
MPI_Recv(&destination,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
if(destination == rankID){
ireceive+=recvInt;
receivedFrom++;
//normally i would break if i received all np-1 messages but what if someone sends a message through me for another process ?
}
else{
MPI_Send(&recvInt,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
MPI_Send(&destination,1,MPI_INT,topology[destination][nexthop],DATA,MPI_COMM_WORLD);
}
}
else {
MPI_Irecv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD, request); // non blocking recieve call after you finished receiving everything addressed to you
time_t now = time(NULL);
while(time(NULL) < now + time_you_set_until_timeout){
over = true;
int flag = 0;
MPI_Test(req, flag, status);
if(flag){
over = false;
break; //exit timeout loop if something was received
}
}
}
if(!over){
MPI_Recv(&destination,MPI_INT,MPI_ANY_SOURCE,DATA,MPI_COMM,WORLD);
//route the message and continue
}
}
无论如何,由于您不知道消息通过您的拓扑需要多长时间,因此您应该小心选择超时时间。您可以尝试实现其他类型的信令机制,例如广播一条消息,告诉节点收到了发送给它的所有消息。当然,它会增加发送的消息数量,但它将确保每个人都收到一切。此外,您还可以尝试打包或序列化要发送的数据,这样您就只有一次 Send/Recv 调用,这将使您的代码更易于使用(在我看来)。
关于c - MPI_Recv 和超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446615/
在下面的代码中,如果我没有将它声明为参数(我通常不能这样做),则 xysize 的值会发生变化。它只发生在 gfortran 4.7.2 和 OpenMPI 1.6 中的优化 -O2 和更多。这怎么可
在下面的代码中,如果我没有将它声明为参数(我通常不能这样做),则 xysize 的值会发生变化。它只发生在 gfortran 4.7.2 和 OpenMPI 1.6 中的优化 -O2 和更多。这怎么可
所以我试图自己编写一个使用 MPI(OpenMPI 实现)的矩阵乘法。问题是,尽管通过 MPI_Send/MPI_Recv 将矩阵的一部分从主设备发送到从设备工作正常,但主进程中应该从从设备接收答案的
我有一个问题。假设我有 np 个进程。对于每个进程,我根据输入文件计算需要发送到每个其他进程的消息数量(从 0 到...),并且我想向它们发送这个数字。问题是我只能从通过直接连接的节点创建的拓扑发送。
为了简单起见,向上发送就是发送到rank+1,向下发送就是发送到rank-1 该代码将数组从一个节点发送到另一个节点,并在它们之间来回发送。这是代码: MPI_Request req1, req2;
是否可以将源列表传递给 MPI_Recv(或等效)调用?目前,我的代码看起来像这样: do i=nod1,nod2 call mpi_recv(tmp,n,MPI_REAL,MPI_ANY_S
我在多线程 程序中遇到MPI_Isend/MPI_Recv 问题。 在程序中: 第一台机器有一个线程做一些计算并调用MPI_Isend将缓冲区发送到第二台机器,另一个线程总是试图MPI_Recv 来自
我有邻接矩阵和以下代码: if (is_broadcast_message) { MPI_Send(&broadcast_message,1,MPI_INT,j,3,MPI_COMM_WORL
假设我有一个包含 2 个进程的 MPI 程序,等级 0 和等级 1。 int i[20], j[20], temp, size; 在排名为 0 的进程中,我有 for(temp=0; temp<20;
#include #include #include "mpi.h" int main(int argc, char **argv) { int N; scanf("%d", &N
我在一个与 MPI 开发相关的项目中遇到问题。我正在使用 MPI 实现 RNA 解析算法,在该算法中,我使用主节点根据一些解析规则和解析表(包含不同的状态和相关操作)开始解析输入字符串。在解析表中,每
更新版本 我发现了导致问题的部分,之前已在下面解释过。我也想跟大家分享一下我的情况。我意识到我犯的只是一个荒谬的错误。但是,我想知道即使我犯了如下大错误,这个问题是如何发生的; 我有一个结构定义如下;
当我链接我的 MPI C 程序时,出现以下错误:对 MPI_recv 的 undefined reference 。 我应该怎么做才能解决这个错误? 最佳答案 是MPI_Recv,不是MPI_recv
我在 C 中运行以下程序时遇到上述错误。它使用 MPI 库。 #include "mpi.h" #include #include int main (int argc, char *argv[]
我知道我可以使用 status.MPI_TAG 获取 MPI_Recv 消息的标记,如下所示: MPI_Recv(&buffer, 1, MPI_INT, MPI_ANY_SOURCE, MPI_AN
我正在尝试实现一个 MPI 程序,以迭代方式将数组中的每个元素设置为其自身及其邻居(在前一个时间步长上)的平均值,同时保持第一个和最后一个元素不变。对于一个过程,这很好用;然而,对于多进程,我没有得到
我正在开发一个 C++ 应用程序,我在其中使用 MPI C 绑定(bind)通过网络发送和接收数据。我明白发送 const int VECTOR_SIZE = 1e6; std::vector vec
我有一个 malloc 的整数数组,我用 MPI_Recv 填充它 MPI_Recv(d.current, n, MPI_INT, 0, TAG_CURRENT_ARRAY, MPI_COMM_WOR
对于MPI中的异步通信,以下哪个更好(在性能、可靠性、可读性等方面): MPI_Isend with buffer 然后 MPI_Iprobe & MPI_Recv 一旦接收器准备好,或者 带缓冲区的
我正在尝试将 NxN 矩阵的分区发送到不同的进程。我使用 MPI_Scatterv 成功完成此操作,如下面的代码所示,但如果我尝试使用 MPI_Send 和 MPI_Recv ,结果会出现段错误。为什
我是一名优秀的程序员,十分优秀!