- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想实现一个场景,其中一个进程有一些工作,并且系统中的所有其他进程向该进程发出请求。当然,这些其他进程不知道哪个进程有该作业,因此它们必须向每个其他进程发送消息并检查它们是否有作业。如果进程没有工作,他们会回复-1。当进程收到有作业要捐赠的进程的回复时,它将从中获取作业并忙于执行作业。但是,当它很忙时,如果它收到来自任何其他进程的请求,它将回复 -1。我一直无法让这个工作。到目前为止,我已经实现了 MPI_Send 和 MPI_Recv 的解决方案,如下所示:
/* Master process has all the jobs to donate */
if(rank == MasterProcess)
while(haveJobToDonate){
/* listen to requests with MPI_ANY_SOURCE,MPI_ANY_TAG */
MPI_Recv()
/* when request received send a job to requesting process */
MPI_Send()
}
/* if no job, then finish */
}else if(rank != MasterProcess){
/* find a job */
findJob()
}
findJob()方法如下:
findJob(){
/*set target to 0 */
while(JobNotFound){
MPI_Send(target)
MPI_Recv(fromTarget)
/* if no job returned */
if(req == -1)
target += (target%NumberOfProcesses)
else
return req
}
}
但是正如您可以猜到的,问题是如果一个进程没有作业,它就不会回复请求的进程,并且该进程将阻塞并等待。另一个问题是,如果一个进程得到了一份工作,它就会完成它的工作,而不会监听请求。如果一个进程发送了请求,那么它将阻塞并等待。这将使程序阻塞。MPI 中是否有任何功能可以帮助解决这种情况?
最佳答案
您的问题的一些限制(例如问题中所解释的)对我来说有点太模糊,无法在答案中完全具体。例如,既然主进程是首先分配工作的进程,那么即使在分配了所有工作之后,为什么它不继续记录它,至少表明哪个进程拥有什么?这样,至少你想要更多工作的自由 worker 知道该从哪个其他 worker 那里窃取。
更好的是,我想你的工作最初是由 master 分批分配的(否则,一旦 master 完成分配,任何自由 worker 都知道没有什么可做的)。所以你可以看看the various schedule
policies of OpenMP了解如何更改批处理来管理整体负载平衡。这个问题在 OpenMP 中非常常见,已经通过 schedule(guided)
得到了解决。这是一种您可以在主进程中轻松重新实现的解决方案,它避免了任何类型的工作人员之间的通信,因此比工作窃取更简单。
现在,假设窃取工作确实是您想要/需要做的,一种可能的解决方案是使用一些单方面的通信。每个工作人员都会在公开的内存窗口中记录其拥有的任务列表。然后,每当一个进程想要从中窃取一些工作时,它就会使用MPI_Win_lock()
锁定该窗口,然后使用MPI_Compare_and_swap原子窃取任务()
,最后使用MPI_Win_unlock()
释放窗口。 MPI_Compare_and_swap()
的使用方式相当于将被探测的远程工作进程列表中的任务索引与当前进程想要窃取的任务进行比较。如果两者匹配,则这意味着该任务可以随意被窃取,并且当前进程会窃取该任务并通过已经完成的任何方式替换它,或者例如减去其等级以向任何其他即将到来的进程指示后来它现在拥有它......该操作的原子方面非常重要,因为另一个 worker 可以尝试在同一时间做同样的事情。如果没有原子探测和更新操作,来自不同进程的探测和更新操作可能会相互交错,从而导致错误的解决方案。
在此阶段,根据是否可以从当前工作人员刚刚获取的新任务中窃取某些工作,它必须使用 自动更新其自己的任务列表共享窗口>MPI_Win_lock()
+ MPI_Win_{put,accumulate,fetch_and_op}()
+ MPI_Win_unlock()
调用集。然后,它可以继续开始实际处理新获得的任务。
有关如何原子地使用这些单方面调用的简单示例,您可以查看 this answer .
注意,这仅从 MPI 3.0 开始可用。
关于c - 使用 MPI 在后台收听和回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33849455/
我有监听 unix 套接字的进程。但是,在我阅读之前,我想检查一些有关此传入消息的元数据,例如它的源进程(比如我想删除来自不受信任的发件人的消息)。是否有任何系统调用可以检索此信息。 if(l
我目前正在开发一个使用 Spring AMQP 和 RabbitMQ 的 Java 应用程序,我想监控我的队列并在某些事件发生时得到通知,比如 元素已添加到队列中, 元素被移除,或者 元素再次进入队列
我正在使用如下定义的 spring jms 监听器。它通常工作正常,但我看到它根据 recieveTimeout 设置不断断开连接和重新连接。
我如何在 Java 中监听原始打印机端口 9100。 当我在端口 9100 上创建 ServerSocket 并接受连接时,当我尝试打印到此端口时,没有任何反应。 System.out.println
问题在标题中,但要详细说明一下。如果我使用 Sun/Oracle NIO API 或类似 Netty 的框架在 Java 中编写 NIO 应用程序,是否可以让客户端作为订阅者“连接”,即使没有服务器绑
我需要收听来自 UDP 的网络广播。数据报包含一个 j4cDAC_broadcast 结构。我尝试按照一些教程进行操作,但它们似乎遗漏了一些内容并且没有非常详细的解释(如果有的话)。 我现在得到的是错
我目前正在通过带有参数的拨号协议(protocol)启动 Amazon FireTV 应用程序。可以通过这样的 Intent 在 onCreate() 中访问此参数: Intent intent =
我想听游标的任何变化。是否可以在不使用 android 中的 contentprovider 的情况下实现这一目标? 注意:(我没有使用任何数据适配器) 谢谢 最佳答案 我发现你不需要使用内容提供者。
我想在 Linux 上使用 C 中的 Libpcap 编写一个小型应用程序。 目前,它开始嗅探并等待数据包。但这并不是我真正需要的。我希望它等待 N 秒然后停止收听。 我怎样才能做到这一点? 这是我的
如何在用户关闭 Modal Bottom Sheet 时执行一段代码? showModalBottomSheet( context: context, buil
我如何在 B 类中监听来自 A 类的 PropertyChanged 事件?我想听听 A 类的属性变化。 class A : INotifyPropertyChanged { priv
当新 Activity 开始或android中的任何任务时,有没有办法通过广播或任何其他方式接收事件? 谢谢马哈茂德 最佳答案 您想做什么,一些分析或日志记录或其他什么? 好吧,如果您要监控的是您自己
我在 SWT 事件方面遇到了困难。 有没有办法在 Combo 关闭时收到通知?我需要知道它何时关闭并且选择没有更改。 我注意到有一个事件类型 SWT.Collapse,但据我所知,这只适用于 Tree
我有一个套接字,我正在尝试从客户端向服务器发送信息。两者位于同一网络,具有不同的 LAN IP(如下所示): 我的服务器是我的 C# 应用程序。 - 192.168.0.2我的客户端是我的 Andro
我是 Gstreamer 的新手,我想用它来收听 RTP 流。 为此,我使用此管道: gst-launch-1.0 udpsrc caps=application/x-rtp port=5000 !
我有一个包含大量所有级别日志记录的应用程序。我希望向 Log.Fatal 调用添加一些自定义行为。如果不构建自定义 Appender 是否可以做到这一点? 我试过这个: log4net.Uti
我有我的 android 应用程序,它监听浏览器 Intent ,以便在用户单击某种类型的 URI 时捕获它们。更具体地说,我希望我的应用程序在用户单击指向 torrent 文件的超链接(例如 htt
我想做的是以下内容:一个服务,持续监听 gps(是的:JUST gps)位置更新而不主动请求它们 - 即这个应用程序不应该消耗额外的资源电池生命周期或 CPU 时间,直到其他应用程序请求/接收 GPS
我有一个 Bootstrap 5 accordion看起来像这样: Bar ... 我正
我是 tweepy 的新手。并尝试实现一个 API,它可以监听新推文中的@提及或屏幕名称。 tweets = api.user_timeline(screen_name=username) 但它没有收
我是一名优秀的程序员,十分优秀!