我正在开发一个MPI应用程序,它在进程之间使用线程MPI调用。根据负载要求添加和删除线程。现在,我有一个问题,我在open-mpi论坛上找不到答案。
如果一组MPI进程(“rank”)已经有一个连接,即它们已经在进行发送 - 接收呼叫,然后一个新线程进入(任一进程),这也会进行发送 - 接收呼叫相同的MPI同行,MPI会打开新的套接字吗?
我知道细节是依赖于实现的,所以可能没有一般答案。但是,有没有办法找到答案?
对此技术的可扩展性存在疑问,这是出于其他原因而选择的。获得一些关于每个连接的新套接字数量的统计数据会很棒。
任何人都知道如何做到这一点?例如,查询哪个套接字是MPI_Send写入的特定实例?
我已尝试添加--mca btl self,sm,tcp --mca btl_base_verbose 30 -v -report-pid -display-map -report-bindings -leave-session-attached
非常感谢。
答案 0 :(得分:1)
回答我自己的问题,这是我从Open-MPI的优秀人员那里学到的:
2012年1月24日下午5:34,devendra rai写道:
我试图找出MPI在发送消息时打开了多少个单独的连接。基本上,我对一堆不同的MPI进程进行了线程MPI调用(而这些进程又有线程MPI调用)。
关键是,添加了每个线程后,是否打开了新端口(即使发送方 - 接收方对之间已经有连接)?
在Open MPI中:没有。底层连接与您拥有的线程数无关。
有什么办法可以找到答案吗?我通过了MPI API,我发现的最接近的是与制图信息有关。这还不够,因为这只能告诉我逻辑连接(或者它)?
MPI没有用户级别的连接概念。您发送消息,发生奇迹,并在另一侧收到消息。 MPI没有说明它是如何到达那里的(例如,它甚至可能通过其他一些过程进行了路由)。
阅读Open MPI常见问题解答,我认为将“-mca btl self,sm,tcp --mca btl_base_verbose 30 -display-map”添加到mpirun会有所帮助。但我没有得到我需要的东西。基本上,我想知道每个进程访问的端口数(读取和写入)。
对于Open MPI的TCP实现,它基本上是每个对等体一个TCP套接字(加上一些其他实用程序fd)。但TCP套接字只是懒惰地打开,这意味着在你实际发送给对等体之前我们不会打开套接字。
- 杰夫斯奎尔斯
致Jeff Squyres的信用。