- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我花了一段时间写了一个很长的答案,回答别人的问题,只是在我发布答案之前将其删除。不想浪费精力,所以我在这里发布问题和答案。
这不仅仅是关于发送/接收死锁的标准答案,因为我还发现了一个有趣的半解决方案,仅适用于某些编译器
在并行过程中,我们需要基于主从设计模式进行练习,其中主进程0向其所有从属发送一条消息,该消息将向其左右邻居重新发送该消息(处理器ID +/- 1,除了处理器0(没有左邻居)和最后一个处理器ID(没有右邻居)之外)。在将消息重新传递给邻居之后,从属处理器将作业结束的确认发送给主处理器。
练习很简单,但是我的代码中有问题,因为我在程序开始时收到确认结束消息……我不明白这是什么问题。我尝试使用fflush,但实际上,程序的最后一行仅应在接收后才写入控制台。
有人有主意吗?我是MPI / C概念的新手,所以也许我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char *argv[]){
int np, myId;
char send[100], recv[100];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &np);
MPI_Comm_rank(MPI_COMM_WORLD, &myId);
MPI_Status stat;
if(myId == 0){
int t = sprintf(send, "hey!"); //MPI_get_processor_name
for(int i = 1; i < np; i++){
printf("send %d => %d\n", myId, i);
fflush(stdout);
MPI_Send(send, 50, MPI_CHAR, i, 0, MPI_COMM_WORLD);
}
for(int i = 1; i < np; i++){
MPI_Recv(recv, 50, MPI_CHAR, i, 0, MPI_COMM_WORLD, &stat);
printf("%s\n", recv);
fflush(stdout);
}
}else{
if(myId < (np - 1)){
printf("send %d => %d\n", myId, myId + 1);
fflush(stdout);
MPI_Send(send, 50, MPI_CHAR, myId + 1, 0, MPI_COMM_WORLD);
}
if(myId > 1){
printf("Envoie %d => %d\n", myId, myId - 1);
fflush(stdout);
MPI_Send(send, 50, MPI_CHAR, myId - 1, 0, MPI_COMM_WORLD);
}
MPI_Recv(send, 50, MPI_CHAR, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &stat);
printf("Réception %d <= %d\n", myId, 0);
fflush(stdout);
if(myId != (np - 1)){
MPI_Recv(send, 50, MPI_CHAR, myId + 1, 0, MPI_COMM_WORLD, &stat);
printf("Receive %d <= %d\n", myId, myId + 1);
fflush(stdout);
}
if(myId != 1){
MPI_Recv(send, 50, MPI_CHAR, myId - 1, 0, MPI_COMM_WORLD, &stat);
printf("Receive %d <= %d\n", myId, myId - 1);
fflush(stdout);
}
int t = sprintf(recv, "End for %d.", myId);
MPI_Send(recv, 50 , MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
最佳答案
解决方案1
让我们将所有非0,“从属”内核的实际作用与您说的应该做的事情进行比较。
您希望他们做什么:
主进程0向其所有从属发送一条消息,该从属将重新发送消息至其左右邻居(处理器ID +/- 1,除了没有左邻居的处理器0和最后一个没有ID的处理器ID)没有正确的邻居)。在将消息重新传递给邻居之后,从属处理器将作业结束的确认发送给主处理器。
代码大纲:
Send_To_Right_Neighbour();
Send_To_Left_Neighbour();
Receive_From_Master();
Receive_From_Right_Neighbour();
Receive_From_Left_Neighbour();
Send_To_Master();
Receive_From_Master();
Send_To_Right_Neighbour();
Send_To_Left_Neighbour();
Receive_From_Right_Neighbour();
Receive_From_Left_Neighbour();
Send_To_Master();
MPI_Send
可以是一个阻止函数-即对
MPI_Send
的调用只有在另一个进程调用了匹配的
MPI_Recv
时才会返回(尽管它不一定是阻止函数)。您应该假定在编写代码时它将始终处于阻塞状态。
MPI_Recv
。 MPI_Recv
。 MPI_Recv
。 MPI_Recv
MPI_Recv
。 MPI_Send
和MPI_Recv
调用合并为MPI_Sendrecv
调用。它在同一步骤中向邻居发送和接收,摆脱了死锁问题。以前,从0进行接收的调用是在同一邻居的发送和接收之间,因此编译器无法将其优化为单个操作。MPI_Bcast
,则应该使用它代替所有这些发送和接收。 MPI_Gather
非常简单地完成此操作。 MPI_Send
,另一个进程都可以在的同时调用匹配的MPI_Recv
,而不必等待发送进程执行其他任何操作。问题出在每个核心试图同时发送。Receive_From_Master();
// Make sure all info is sent from left to right
Send_To_Right_Neighbour();
// Make sure any info is received from left to right
Receive_From_Left_Neighbour();
// Now send all info from right to left
Send_To_Left_Neighbour();
// Make sure any info is received
Receive_From_Right_Neighbour();
Send_To_Master();
关于c - MPI发送/接收程序永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12923039/
我有一个存储结构向量的应用程序。这些结构保存有关系统上每个 GPU 的信息,如内存和 giga-flop/s。每个系统上有不同数量的 GPU。 我有一个程序可以同时在多台机器上运行,我需要收集这些数据
我很好奇 MPI 中缺少此功能: MPI_Isendrecv( ... ); 即,非阻塞发送和接收,谁能告诉我其省略背后的基本原理? 最佳答案 我的看法是 MPI_SENDRECV存在是为了方便那些想
当我用以下方法监听TCP或UDP套接字时 ssize_t recv(int sockfd, void *buf, size_t len, int flags); 或者 ssize_t recvfrom
SUM:如何在 azure 事件网格中推迟事件触发或事件接收? 我设计的系统需要对低频对象状态(创建、启动、检查长时间启动状态、结束)使用react。它看起来像是事件处理的候选者。我想用azure函数
我正在 MPI 中实现一个程序,其中主进程(等级 = 0)应该能够接收来自其他进程的请求,这些进程要求只有根才知道的变量值。如果我按等级 0 进行 MPI_Recv(...),我必须指定向根发送请求的
我正在学习DX12,并在此过程中学习“旧版Win32”。 我在退出主循环时遇到问题,这似乎与我没有收到WM_CLOSE消息有关。 在C++,Windows 10控制台应用程序中。 #include
SUM:如何在 azure 事件网格中推迟事件触发或事件接收? 我设计的系统需要对低频对象状态(创建、启动、检查长时间启动状态、结束)使用react。它看起来像是事件处理的候选者。我想用azure函数
我想编写方法来通过号码发送短信并使用编辑文本字段中的文本。发送消息后,我想收到一些声音或其他东西来提醒我收到短信。我怎样才能做到这一点?先感谢您,狼。 最佳答案 这个网站似乎对两者都有很好的描述:ht
所以我正在用 Java 编写一个程序,在 DatagramSocket 和 DatagramPacket 的帮助下发送和接收数据。问题是,在我发送数据/接收数据之间的某个时间 - 我发送数据的程序中的
我是 Android 编程新手,我正在用 Java 编写一个应用程序,该应用程序可以打开相机拍照并保存。我通过 Intents 做到了,但看不到 onActivityResult 正在运行。 我已经在
我有一个套接字服务器和一个套接字客户端。客户端只有一个套接字。我必须使用线程在客户端发送/接收数据。 static int sock = -1; static std::mutex mutex; vo
我正在尝试使用 c 中的套接字实现 TCP 服务器/客户端。我以这样的方式编写程序,即我们在客户端发送的任何内容都逐行显示在服务器中,直到键入退出。该程序可以运行,但数据最后一起显示在服务器中。有人可
我正在使用微 Controller 与 SIM808 模块通信,我想发送和接收 AT 命令。 现在的问题是,对于某些命令,我只收到了我应该收到的答案的一部分,但对于其他一些命令,我收到了我应该
我用c设计了一个消息传递接口(interface),用于在我的系统中运行的不同进程之间提供通信。该接口(interface)为此目的创建 10-12 个线程,并使用 TCP 套接字提供通信。 它工作正
我需要澄清一下在套接字程序中使用多个发送/接收。我的客户端程序如下所示(使用 TCP SOCK_STREAM)。 send(sockfd,"Messgfromlient",15,0);
我正在构建一个真正的基本代理服务器到我现有的HTTP服务器中。将传入连接添加到队列中,并将信号发送到另一个等待线程队列中的一个线程。此线程从队列中获取传入连接并对其进行处理。 问题是代理程序真的很慢。
我正在使用 $routeProvider 设置一条类似 的路线 when('/grab/:param1/:param2', { controller: 'someController',
我在欧洲有通过 HLS 流式传输的商业流媒体服务器。http://europe.server/stream1/index.m3u8现在我在美国的客户由于距离而遇到一些网络问题。 所以我在美国部署了新服
我有一个长期运行的 celery 任务,该任务遍历一系列项目并执行一些操作。 任务应该以某种方式报告当前正在处理的项目,以便最终用户知道任务的进度。 目前,我的django应用程序和celery一起坐
我需要将音频文件从浏览器发送到 python Controller 。我是这样做的: var xmlHttp = new XMLHttpRequest(); xmlHttp.open( "POST",
我是一名优秀的程序员,十分优秀!