我的Linux机器上有一个可执行文件,我知道它已经用OpenMPI或MPICH库编译.
问题:如何确定哪一个?
是否有可能有一个函数来包装MPI_Init和MPI_Init_thread?这样做的目的是在保持向后兼容性的同时拥有更清晰的API.MPI_Init_thread当MPI运行时不支持时调用会发生什么?如果MPI_Init_thread不支持,我如何保持我的包装函数适用于MPI实现?
我已经调试了该程序2周。它只有93行。但是我仍然找不到错误。请帮我。
在我的笔记本电脑上,该程序正常。但是,当我在我的实验室集群(中国上海超级计算中心和中国济南超级计算中心)上运行时,它卡住了。
该程序的逻辑非常简单。有2个MPI流程。一个是主机(pid = 0),另一个是从机(pid = 1)。主机等待标签= 0上的请求。从设备每秒向主机标签0发送消息,并等待ACK消息。一旦主机收到请求,主机将向从机标签100发送ACK消息。
问题是几秒钟后程序将卡住。主机将停留在MPI_Recv上,等待标签0上的请求。从站将停留在MPI_Ssend,尝试向主标记0发送消息。该MPI通信应彼此匹配。但我不知道为什么会卡住。
一些提示:在以下情况下程序不会卡住:
1,在pthread_create(&tid,&attr,master_server_handler,NULL)之后添加sleep()函数; 在void * master_server(void * null_arg)函数中。
要么
2.使用joinable pthread属性而不是detachable属性创建master_server_handler。(pthread_create(&tid,&attr,master_server_handler,NULL);替换为pthread_create(&tid,NULL,master_server_handler,NULL);)
要么
3.使用master_server_handler函数代替pthread_create(&tid,&attr,master_server_handler,NULL);。
要么
4.用MPI_Send替换void * master_server_handler(void * arg)中的MPI_Ssend。
在每种情况下,该程序都可以。所有这些修改都可以在程序的注释中找到。
我不知道为什么会卡住。我尝试过openmpi和mpich2。该程序将卡在它们两个上。
任何提示请...
如果需要,我可以提供我实验室的VPN。您可以在我的实验室中登录集群。(电子邮件:674322022@qq.com)
顺便说一句:我在编译openmpi和mpich2时启用了线程支持的参数。对于openmpi,参数为--with-threads = poxis --enable-mpi-thread-multiple。Mpich2是--enable-threads。
我实验室中的机器是CentOS。uname -a的输出是Linux node5 2.6.18-238.12.1.el5xen#1 SMP Tue May 31 14:02:29 EDT 2011 x86_64 x86_64 x86_64 GNU / Linux。
我使用以下程序运行该程序: mpiexec -n 2 ./a.out
以下是程序输出的源代码,以及程序卡住时的追溯信息。
#include "stdio.h"
#include "pthread.h"
#include "stdlib.h"
#include "string.h"
#include "mpi.h"
void send_heart_beat();
void *heart_beat_daemon(void *null_arg);
void *master_server(void *null_arg);
void *master_server_handler(void *arg); …Run Code Online (Sandbox Code Playgroud) 我已经为使用MPI执行Fox的块矩阵乘法方法的类编写了一个程序。我能够通过在中使用sqrt()函数来做到这一点,但是为了编译程序,我必须输入“ mpicc -lm -o ...”。有关hw状态的说明,可使用“ mpicc -o ...”而不使用-lm来编译程序。我只是想知道是否有一种方法可以找到数字的平方根(无需编写单独的程序即可)。如果没有,我将免责声明放在.txt文件顶部的注释中。以为这可能是个好地方。谢谢!
MPI_Send()如果发送数据的大小大于 MPI 缓冲区大小,如何将数据传送到接收进程?例如,假设我想在单个发送消息中发送 10 个字节的数据(即我的应用程序缓冲区的大小为 10B),但 MPI 缓冲区的固定大小为 6B。那么这种情况下,如何MPI_Send()发送数据呢?是否先传输6B,然后传输剩余的4B?还是只传输6B?
我一直在努力编写一个程序来计算数百万个偶极 - 偶极相互作用张量及其衍生物.因为这些张量可以简单地并行化,并且经常退化,所以我决定构建一个查找表(LUT)并分配工作.最终,它们将组合成一个大矩阵并对角化(我最终将使用scalapack.现在,diag适合nersc的节点).为了跟踪fortran中的所有索引,我构建了一些派生数据类型.
type dtlrdr_lut
sequence
integer p
integer q
integer s
integer i
integer ind
real(dp), dimension(3,3) :: dtlrdr
end type dtlrdr_lut
type dtlrdh_lut
sequence
integer p
integer q
integer ind
real(dp), dimension(3, 3) :: TLR
real(dp), dimension(3, 3, 3, 3) :: dTLRdh
end type dtlrdh_lut
Run Code Online (Sandbox Code Playgroud)
在我想要并行化所有这些的子例程中,我有:
type(dtlrdr_lut), dimension(:), allocatable :: my_dtlrdr, collected_dtlrdr
type(dtlrdh_lut), dimension(:), allocatable :: my_dtlrdh, collected_dtlrdh
integer :: dh_dtype, dr_dtype, dh_types(5), dr_types(6), dh_blocks(5), dr_blocks(6)
INTEGER(KIND=MPI_ADDRESS_KIND) :: dh_offsets(5), dr_offsets(6)
if(.not.allocated(my_dtlrdh)) allocate(my_dtlrdh(my_num_pairs))
if(.not.allocated(my_dtlrdr)) allocate(my_dtlrdr(my_num_pairs*3*nat))
if(me_image.eq.root_image) then
if(.not.allocated(collected_dtlrdh)) allocate(collected_dtlrdh(num_pairs)) …Run Code Online (Sandbox Code Playgroud) 我使用一些随机数作为我的"元启发式优化"计算的初始值.我使用MPI在不同的计算机上运行相同的优化程序.令人惊讶的是,我获得了很多相同的结果.例如,我使用40台主机,结果几乎没有不同的值.几乎6-7个值是相同的.实际上,我的结果可能相似,但它们必须不相同,因为我在程序开头给出了随机数作为首字母(在上面的例子中,我必须得到40个不同的值).如果我在同一台计算机上重复并顺序运行程序,它会产生不同的结果.
我怀疑这种情况是由随机数生成质量不足引起的.我怎么解决这个问题.我打开其他想法,可能会有不同的事情导致这个问题.
PS我srand( (unsigned) time(NULL) )在程序开始时使用一次来生成随机数字.然后,我通过使用生成[0,1]范围内的随机数(float)rand()/32767
我抱怨的结果的一个例子:
15.42161751
19.83328438
3.43446541
23.50453377
23.50453377
3.43446541
19.83328438
23.50453377
3.43446541
7.52127457
7.52127457
23.50453377
7.52127457
7.52127457
23.50453377
19.83328438
19.83328438
19.83328438
7.52127457
15.42161751
3.43446541
19.83328438
19.83328438
15.42161751
23.50453377
23.50453377
5.29145241
19.83328438
19.83328438
19.83328438
19.83328438
7.52127457
23.50453377
3.43446541
19.83328438
23.50453377
7.52127457
3.43446541
7.52127457
5.29145241
Run Code Online (Sandbox Code Playgroud) 线程是什么意思?
我的Intel CPU有6个内核和12个线程.我知道每个核心可以与其他5个核心并行进行计算.因此,如果我在每6个核心上运行一个程序,我会加速6倍.但我无法理解线程.如果我在我的6个内核的12个线程上运行我的程序,我会加速12倍吗?
我有一个关于MPI的基本问题,为了更好地理解它(我是MPI和多个过程的新手,所以请在这个上承担我的责任).我正在使用C++(RepastHPC)中的模拟环境,它广泛使用MPI(使用Boost库)来允许并行操作.特别是,模拟由各个类(即代理)的多个实例组成,它们应该相互交互,交换信息等.现在假设这发生在多个进程上(并且给出了我对MPI的基本理解)我所拥有的自然问题或恐惧是,不同进程的代理不再相互影响,因为它们无法连接(我知道,这与MPI的整个概念相矛盾).
阅读本手册后,我的理解是这样的:Boost.MPI的可用库(以及上面提到的包的库)负责处理所有通信并在进程之间来回发送包,即每个进程都有来自其他进程的实例(我猜这是某种形式的值调用,b/c原始实例不能从只有副本的进程中更改),然后进行更新,以确保实例的副本具有与原件相同的信息等.
这是否意味着,就模拟运行的最终结果而言,我会像在一个进程中完成整个事情一样?换句话说,多个过程只是为了加快速度而不是改变模拟的设计(因此我不必担心它)?