linux mpirun np的hostfile总是出错,是什么问题呢

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
MS软件常见问题及解决方法.doc 28页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
MS软件常见问题及解决方法
你可能关注的文档:
··········
Q1:为什么使用Discover进行Dynamics计算时,如果设定了Pressure=1GPa,在计算结果中会出现Pressure等于0,而Stress的XX、YY、ZZ方向为1GPa的情况? 4
Q2:如何在Discover计算中分别对相同环境原子分配不同力场类型? 4
Q3:如何在CASTEP计算中限制某个原子的移动方向? 4
Q4:在安装新的MS时,事先没有停掉License Server,在卸载、安装MS后,发现MS的License Server无法正常启动。 5
Q5:如何修改Windows或者Linux下的端口号: 5
Q6:如何使用DMol3进行动力学计算? 6
Q7:如何让Discover程序输出.arc文件? 7
Q8:如何使用rattle关键词来限制水分子的几何结构? 7
Q9,如何使用Standalone方式运行DMol程序? 7
Q10:如何在DMol中加入外界电场? 7
Q12,如何以Standalone方式运行Discover作业? 8
Q13:为什么我在QSAR模块中无法找到新加入的Jurs和DMol3描述符? 8
Q14:如何在DMol模块中,对某一分子只允许其沿着Z方向进行优化,而XY方向则不变? 8
Q15:如果CASTEP计算过程中断电,怎么能够重新开始计算呢?在Keywords中有两个关键词Reuse和Continuation,它们有什么差异呢? 8
Q16:如果我在Cleave一个平面的时候,选择的是(111)面,或者该晶体原来就是一个三斜晶胞,我怎么才能切出一个长方形的表面来呢? 9
Q17:在使用DMol进行结构优化的时候失败,通过对轨迹的回放发现,整个分子在平面上下进行翻转,并由此导致能量振荡,这种情况应当如何处理? 9
Q18:如何使用XRD数据快速建立相关的晶体结构。 9
Q19:如何在DMol中考虑溶剂化效应? 10
Q20:如何使用MS软件计算高分子的玻璃化温度? 11
Q21:在使用MS进行计算的时候,中间的xcd文件无法及时更新,而其他文件则能正常显示,为什么? 12
Q22:怎么样在MesoDyn中加入各种不同的限制? 12
Q23:MS给出的DOS和能带图不是很清楚,我能不能自己来做图? 12
Q24:怎么样能让CASTEP在并行计算时更有效? 12
Q25:在使用DMol计算过渡态结构时,经常会发现出现不止一个虚频,怎么回事? 13
Q26:怎么在Altix350上安装MS的Castep和DMol的补丁加速运算速度? 13
Q27:为什么我在Linux下安装license的时候,总是报错呢? 13
Q28:在使用SGI Altix350,打补丁后运行RunCASTEP.sh
seedname的时候,出现错误:MPI:asgetnetinfo_array('(null)') failed : array services not available,怎么解决? 14
Q29:MS的GFA是怎么对参数进行杂交的?参数多少与内存有无关系? 14
Q30:DFT方法对计算量和内存的要求是什么样的? 15
Q31:为什么当DMol3在我机器上运行过的时候,总是出现以下错误:floating-point assist fault? 16
Q32:在使用DMol3算频率的时候,突然断电了,怎么才能继续算频率呢? 16
Q33:在Castep模块中,Electronic中的Pseudopotential representation,有Real Space和Reciprocal space,如何取舍? 17
Q34:如何从Discover的输出文件中查看每桢中原子的坐标以及速率等信息? 17
Q35:我使用的是Standalone方式进行Castep和DMol3计算,完成后怎么才能看到最终结构和轨迹呢? 17
Q36:DMol中有TS Conformation也有TS Optimization,应该选取哪一个来搜索过渡态? 17
Q37:在使用CASTEP进行过渡态(TS)搜索时,当用reaction preview产生一个轨迹文件之后,对该轨迹文件进行TS search 运算时,在本机直接计算可以进行,但是进行save files时,却无法完成提示Unable to set UserID. Trajectory file will be invalid. 18
Q38:在Castep中,怎样输出电荷密度?相关数据的单位是什么? 18
Q39:如何在Discover中使用BTCL语言进行多步MD计算? 18
Q40:如何用Dmol3计算Overlay Matrix,并进一步分析? 21
Q41:如何使用Castep程序计算IR振动,为什么计算老
正在加载中,请稍后...12.7k 人阅读
标签:至少1个,最多5个
原文请猛戳:
debug一个并行程序(parallel program)向来是件很麻烦的事情(Erlang等functional programming language另当别论),对于像MPI这种非shared memory的inter-process model来说尤其如此。
与调试并行程序相关的工具
非开源工具
目前我所了解的商业调试器(debugger)有:
据说parallel debug的能力很屌,本人没用过表示不知,说不定只是界面做得好看而已。不过我想大部分人应该跟本屌一样是用不起这些商业产品的,高富帅们请无视。以下我介绍下一些有用的open source工具:
首先推荐valgrind的memcheck。大部分MPI标准的实现(implementation)(如、)支持的是C、C++和Fortran语言。Fortran语言我不了解,但C和C++以复杂的内存管理(memory management)见长可是出了名的XD。有些时候所谓的MPI程序的bug,不过是一般sequential程序常见的内存错误罢了。这个时候用memcheck检查就可以很容易找到bug的藏身之处。你可能会争论说你用了RAII(Resource Allocation Is Initialization)等方式来管理内存,不会有那些naive的问题,但我还是建议你使用memcheck检查你程序的可执行文件,因为memcheck除了检查内存错误,还可以检查message passing相关的错误,例如:MPI_Send一块没有完全初始化的buffer、用来发送消息的buffer大小小于MPI_Send所指定的大小、用来接受消息的buffer大小小于MPI_Recv所指定的大小等等,我想你的那些方法应该对这些不管用吧?。
这里假设你已经安装并配置好了memcheck,例如如果你用的是openmpi,那么执行以下命令
ompi_info | grep memchecker
会得到类似
MCA memchecker: valgrind (MCA v2.0, API v2.0, Component v1.6.4)
的结果。否则请参照进行配置。
使用memcheck需要在compile时下-g参数。运行memcheck用下面的命令:
mpirun [mpirun-args] valgrind [valgrind-args] &application& [app-args]
&!-- more --&
padb其实是个job monitor,它可以显示MPI message queue的状况。推荐padb的一大理由是它可以检查deadlock。
假设你没有parallel debugger,不用担心,我们还有gdb这种serial debugger大杀器。
首先说说mpirun/mpiexec/orterun所支持的打开gdb的方式。
openmpi支持:
mpirun [mpirun-args] xterm -e gdb &application&
执行这个命令会打开跟所指定的进程数目一样多的终端——一下子蹦出这么多终端,神烦~——每个终端都跑有gdb。我试过这个方式,它不支持application带有参数的[app-args]情况,而且进程跑在不同机器上也无法正常跑起来——这一点已经有比较复杂的解决方案。
mpich2支持:
mpirun -gdb &application&
但在mpich较新的版本中,该package的进程管理器(process manager)已经从MPD换为Hydra,这个-gdb的选项随之消失。详情请猛戳这个链接(。像我机器上的mpich版本是3.0.3,所以这个选项也就不能用了。如果你想试试可以用包含MPD的旧版mpich。
好,以下假设我们不用上述方式,只是像debug一般的程序一样,打开gdb,attach到相应进程,完事,detach,退出。&!--- 使用gdb来debugMPI程序 ---&现在我们要面对的一大问题其实是怎么让MPI程序暂停下来。因为绝大多数MPI程序其实执行得非常快——写并行程序的一大目的不就是加速么——很多时候来不及打开gdb,MPI程序就已经执行完了。所以我们需要让它先缓下来等待我们打开gdb执行操作。
目前比较靠谱的方法是在MPI程序里加hook,这个方法我是在UCDavis的Professor Matloff的主页上看到的(猛戳这里:。不过我喜欢的方式跟Prof.Matloff所讲的稍有不同:
#ifdef MPI_DEBUG
int gdb_break = 1;
while(gdb_break) {};
Prof. Matloff的方法没有一个类似MPI_DEBUG的macro。我加这个macro只是耍下小聪明,让程序可以通过不同的编译方式生成debug模式和正常模式的可执行文件。如果要生成debug模式的可执行文件,只需在编译时加入以下参数:
-DMPI_DEBUG
-DMPI_DEBUG=define
如果不加以上参数就是生成正常模式的可执行文件了,不会再有debug模式的副作用(例如在这里是陷入无限循环)。不用这个macro的话,要生成正常模式的可执行文件还得回头改源代码,这样一者可能代码很长,导致很难找到这个hook的位置;二者如果你在「测试-发布-测试-...」的开发周期里,debug模式所加的代码经常要「加入-删掉-加入-...」很是蛋疼。
(什么?你犯二了,在源代码中加了一句
#define MPI_DEBUG
好吧,你也可以不改动这一句,只需在编译时加入
-UMPI_DEBUG
就可以生成正常模式的可执行文件。)
这样只需照常运行,MPI程序就会在while循环的地方卡住。这时候打开gdb,执行
(gdb) shell ps aux | grep &process-name&
找到所有对应进程的pid,再用
(gdb) attach &pid&
attach到其中某一个进程。
Prof. Matloff用的是
gdb &process-name& &pid&
这也是可以的。但我习惯的是开一个gdb,要跳转到别的进程就用detach再attach。
让MPI程序跳出while循环:
(gdb) set gdb_break = 0
现在就可以随行所欲的执行设breakpoint啊、查看register啊、print变量啊等操作了。
我猜你会这么吐嘈这种方法:每个process都要set一遍来跳出无限循环,神烦啊有木有!是的,你没有必要每个process都加,可以只针对有代表性的process加上(例如你用到master-slave的架构那么就挑个master跟slave呗~)。
神马?「代表」很难选?!我们可以把while循环改成:
while(gdb_break)
// set the sleep time to pause the processes
sleep(&time&);
这样在&time&时间内打开gdb设好breakpoint即可,过了这段时间process就不会卡在while循环的地方。
神马?这个时间很难取?取短了来不及,取长了又猴急?好吧你赢了......
类似的做法也被PKU的Jinlong Wu (King)博士写的提及到了。他用的是:
setenv INITIAL_SLEEP_TIME 10
mpirun [mpirun-args] -x INITIAL_SLEEP_TIME &application& [app-args]
本人没有试过,不过看起来比改源代码的方法要优秀些XD。
假设你在打开gdb后会发现no debugging symbols found,这是因为你的MPI可执行程序没有用于debug的symbol。正常情况下,你在compile时下-g参数,生成的可执行程序(例如在linux下是ELF格式,ELF可不是「精灵」,而是Executable and Linkable Format)中会加入DWARF(DWARF是对应于「精灵」的「矮人」Debugging With Attributed Record Format)信息。如果你编译时加了-g参数后仍然有同样的问题,我想那应该是你运行MPI的环境有些库没装上的缘故。在这样的环境下,如果你不幸踩到了segmentation fault的雷区,想要debug,可是上面的招数失效了,坑爹啊......好在天无绝人之路,只要有程序运行的错误信息(有core dump更好),依靠一些汇编(assmebly)语言的常识还是可以帮助你debug的。
这里就简单以我碰到的一个悲剧为例吧,BTW为了找到bug,我在编译时没有加优化参数。以下是运行时吐出的一堆错误信息(555好长好长的):
$ mpirun -np 2 ./mandelbrot_mpi_static 10 -2 2 -2 2 100 100 disable
[PP01:13214] *** Process received signal ***
[PP01:13215] *** Process received signal ***
[PP01:13215] Signal: Segmentation fault (11)
[PP01:13215] Signal code: Address not mapped (1)
[PP01:13215] Failing at address: 0x1123000
[PP01:13214] Signal: Segmentation fault (11)
[PP01:13214] Signal code: Address not mapped (1)
[PP01:13214] Failing at address: 0xbf7000
[PP01:13214] [ 0] /lib64/libpthread.so.0(+0xf500) [0x7f]
[PP01:13215] [ 0] /lib64/libpthread.so.0(+0xf500) [0x7f41a45d9500]
[PP01:13215] [ 1] /lib64/libc.so.6(memcpy+0x15b) [0x7f41a42c0bfb]
[PP01:13215] [ 2] /opt/OPENMPI-1.4.4/lib/libmpi.so.0
(ompi_convertor_pack+0x14a) [0x7f41a557325a]
[PP01:13215] [ 3] /opt/OPENMPI-1.4.4/lib/openmpi/mca_btl_sm.so
(+0x1ccd) [0x7f41a1189ccd]
[PP01:13215] [ 4] /opt/OPENMPI-1.4.4/lib/openmpi/mca_pml_ob1.so
(+0xc51b) [0x7f41a19a651b]
[PP01:13215] [ 5] /opt/OPENMPI-1.4.4/lib/openmpi/mca_pml_ob1.so
(+0x7dd8) [0x7f41a19a1dd8]
[PP01:13215] [ 6] /opt/OPENMPI-1.4.4/lib/openmpi/mca_btl_sm.so
(+0x4078) [0x7f41a118c078]
[PP01:13215] [ 7] /opt/OPENMPI-1.4.4/lib/libopen-pal.so.0
(opal_progress+0x5a) [0x7f41a509be8a]
[PP01:13215] [ 8] /opt/OPENMPI-1.4.4/lib/openmpi/mca_pml_ob1.so
(+0x552d) [0x7f41a199f52d]
[PP01:13215] [ 9] /opt/OPENMPI-1.4.4/lib/openmpi/mca_coll_sync.so
(+0x1742) [0x7f41a02e3742]
[PP01:13215] [10] /opt/OPENMPI-1.4.4/lib/libmpi.so.0
(MPI_Gatherv+0x116) [0x7f41a5580906]
[PP01:13215] [11] ./mandelbrot_mpi_static(main+0x68c) [0x401b16]
[PP01:13215] [12] /lib64/libc.so.6(__libc_start_main+0xfd) [0x7f41a4256cdd]
[PP01:13215] [13] ./mandelbrot_mpi_static() [0x4010c9]
[PP01:13215] *** End of error message ***
[PP01:13214] [ 1] /lib64/libc.so.6(memcpy+0x15b) [0x7f6916cfbbfb]
[PP01:13214] [ 2] /opt/OPENMPI-1.4.4/lib/libmpi.so.0
(ompi_convertor_unpack+0xca) [0x7f6917fae04a]
[PP01:13214] [ 3] /opt/OPENMPI-1.4.4/lib/openmpi/mca_pml_ob1.so
(+0x9621) [0x7f6]
[PP01:13214] [ 4] /opt/OPENMPI-1.4.4/lib/openmpi/mca_btl_sm.so
(+0x4078) [0x7f]
[PP01:13214] [ 5] /opt/OPENMPI-1.4.4/lib/libopen-pal.so.0
(opal_progress+0x5a) [0x7fa]
[PP01:13214] [ 6] /opt/OPENMPI-1.4.4/lib/openmpi/mca_pml_ob1.so
(+0x48b5) [0x7f]
[PP01:13214] [ 7] /opt/OPENMPI-1.4.4/lib/openmpi/mca_coll_basic.so
(+0x3a94) [0x7f]
[PP01:13214] [ 8] /opt/OPENMPI-1.4.4/lib/openmpi/mca_coll_sync.so
(+0x1742) [0x7f]
[PP01:13214] [ 9] /opt/OPENMPI-1.4.4/lib/libmpi.so.0
(MPI_Gatherv+0x116) [0x7f6917fbb906]
[PP01:13214] [10] ./mandelbrot_mpi_static(main+0x68c) [0x401b16]
[PP01:13214] [11] /lib64/libc.so.6(__libc_start_main+0xfd) [0x7f6916c91cdd]
[PP01:13214] [12] ./mandelbrot_mpi_static() [0x4010c9]
[PP01:13214] *** End of error message ***
--------------------------------------------------------------------------
mpirun noticed that process rank 1 with PID 13215
on node PP01 exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------
注意到这一行:
[PP01:13215] [10] /opt/OPENMPI-1.4.4/lib/libmpi.so.0
(MPI_Gatherv+0x116) [0x7f41a5580906]
通过(这跟在gdb中用disas指令是一样的)
objdump -D /opt/OPENMPI-1.4.4/lib/libmpi.so.0
找到MPI_Gatherv的入口:
27f0 &PMPI_Gatherv&:
找到(MPI_Gatherv+0x116)的位置(地址52906):
52931 &PMPI_Gatherv+0x141&
0f 8c 37 02 00 00
52b48 &PMPI_Gatherv+0x358&
地址为52931的&PMPI_Gatherv+0x141&之后的code主要是return,%eax应该是判断是否要return的counter。现在寄存器%eax就成了最大的嫌疑,有理由 相信 猜某个对该寄存器的不正确操作导致了segmentation fault。好吧,其实debug很多时候还得靠猜,记得有这么个段子:「师爷,写代码最重要的是什么?」「淡定。」「师爷,调试程序最重要的是什么?」「运气。」
接下来找到了%eax被赋值的地方:
(%r8),%eax
这里需要了解函数参数传递(function parameter passing)的调用约定(calling convention)机制:
对x64来说:int和pointer类型的参数依次放在rdi、rsi、rdx、rcx、r8、r9寄存器中,float参数放在xmm开头的寄存器中。
对x86(32bit)来说:参数放在堆栈(stack)中。此外GNU C支持:
__attribute__((regparm(&number&)))
其中&number&是一个0到3的整数,表示指定&number&个参数通过寄存器传递,由于寄存器传参要比堆栈传参快,因而这也被称为#fastcall#。如果指定
__attribute__((regparm(3)))
则开头的三个参数会被依次放在eax、edx和ecx中。(关于__attribute__的详细介绍请猛戳)。
如果是C++的member function,别忘了隐含的第一个参数其实是object的this指针(pointer)。
回到我们的例子,%r8正对应MPI_Gatherv的第五個参数。现在终于可以从底层的汇编语言解脱出来了,让我们一睹MPI_Gatherv原型的尊容:
int MPI_Gatherv(void *sendbuf, int sendcnt, MPI_Datatype sendtype,
void *recvbuf, int *recvcnts, int *displs,
MPI_Datatype recvtype, int root, MPI_Comm comm)
第五个参数是recvcnts,于是就可以针对这个「罪魁祸首」去看源程序到底出了什么问题了。这里我就不贴出代码了,bug的来源就是我当时犯二了,以为这个recvcnts是byte number,而实际上官方文档写得明白(这里的recvcounts就是recvcnts):
recvcounts
integer array (of length group size) containing the number of elements that are received from each process (significant only at root)
其实是the number of elements啊有木有!不仔细看文档的真心伤不起!也因为这个错误,使我的recvcnts比recvbuf的size要大,因而发生了access在recvbuf范围以外的内存的情况(也就是我们从错误信息所看到的Address not mapped)。
最后再提一点,我源代码中的recvbuf其实是malloc出来的内存,也就是在heap中,这种情况其实用valgrind应该就可以检测出来(如果recvbuf在stack中我可不能保证这一点)。所以,骚念们,编译完MPI程式先跑跑valgrind看能不能通关吧,更重要的是,写代码要仔细看API文档减少bug。
3 收藏&&|&&8
你可能感兴趣的文章
Mark一个,正准备写MPI程序,希望用得上。
Mark一个,正准备写MPI程序,希望用得上。
我倒是希望不用debug不需要这些技巧~ XDD
我倒是希望不用debug不需要这些技巧~ XDD
请问在执行set gdb_break=0后出现Left operand of assignment is not an lvalue的提示,p gdb_break显示的仍然是1请问这是什么原因?
请问在执行set gdb_break=0后出现
Left operand of assignment is not an lvalue
p gdb_break显示的仍然是1
请问这是什么原因?
你用gcc编译时加了优化参数吗?在gdb_break的声明里加上volatile试试?
你用gcc编译时加了优化参数吗?在`gdb_break`的声明里加上`volatile`试试?
你可能感兴趣的文章
52.7k 浏览
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
9年工龄,11年工作经验,都是加班惹的祸,怨我喽??
RHCSA IN OPENSTACK
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(856)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_094074',
blogTitle:'各种MPI环境的使用方法',
blogAbstract:'各种MPI环境的使用方法MPI,即Message Passing Interface,消息传递接口。\"MPI 其实就',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'9年工龄,11年工作经验,都是加班惹的祸,怨我喽??\nRHCE\nRHCSA IN OPENSTACK',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}关于MPI学习过程记录
1. 集群基本命令:假如集群IP为:172.0.0.1
账户@ 然后会提示输入密码,输入即可登陆。
上传文件:scp test.c 账户@ip:/home/账户也会提示输入密码,输入即可上传。
查看集群启动节点情况 :mpdtrace
启动节点: mpdboot -n 4 -f mpd.
其中4 为要启动节点的个数。
2. MPI 编译运行命令
编译:mpicc -o test test.c
运行分俩种情况:
在集群节点上运行:mpirun -np 4 ./test
(如何要读文件的话,在后面加上文件名) 其中4表示在4个节点上运行。
在本地单机上运行:mpiexec.hydra -f /home/user/hosfle -n 4 ./test (file 可选)
另外:对于在本机上MPI , 首先下载
mpich2-1.3.2p1.tar.gz
然后进行解压安装以及配置环境变量,最后在本机上创建 /home/user/hostfile 文件,然后里面加入 127.0.0.1:4
,就可以在本机上用进程来模拟集群节点来测试程序了。
3. MPI 函数
int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype,
        void* recvbuf, int *recvcounts, int *displs,
     
MPI_Datatype recvtype, int root, MPI_Comm comm)
MPI_Gatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs,
recvtype, root, comm)
发送消息缓冲区的起始地址(可变)
发送消息缓冲区中的数据个数(整型)
发送消息缓冲区中的数据类型(句柄)
接收消息缓冲区的起始地址(可变,仅对于根进程)
recvcounts
整型数组(长度为进程组的大小), 其值为从每个进程接收
的数据个数(仅对于根进程)
整数数组,每个入口i表示相对于recvbuf的位移,此位
移处存放着从进程i中接收的输入数据(仅对于根进程),即各个进程传输数据的位置偏移。
接收消息缓冲区中数据类型(仅对于根进程)(句柄)
接收进程的序列号(句柄)
通信子(句柄),即参与发送和接收的全部进程集合,可用 MPI_COMM_WORLD (代表全部)。
功能描述:每个进程(包括根进程)将其发送缓冲区中的内容发送到根进程,根进程根据发送这些数据的进程的序列号将它们依次存放到自已的消息缓冲区中.其结果就象一个组中的n个进程(包括根进程在内)都执行了一个调用MPI_Send(),同时根进程执行了n次调用 MPI_Recv();
更多详见:http://micro.ustc.edu.cn/Linux/MPI/MPICH/mpi45.htm#fig4.2
int MPI_Reduce(void* sendbuf, void* recvbuf, int count,
MPI_Datatype datatype, MPI_Op op, int root,
MPI_Comm comm)
MPI_REDUCE(sendbuf,recvbuf,count,datatype,op,root,comm)
发送消息缓冲区的起始地址(可变)
接收消息缓冲区中的地址(可变,仅对于根进程)
发送消息缓冲区中的数据个数(整型)
发送消息缓冲区的元素类型(句柄)
归约操作符(句柄)
根进程序列号(整型),0,1,2等
通信子(句柄),进程组集合
其中op 操作可以是:
MPI_MAXLOC
最大值且相应位置
MPI_MINLOC
最小值且相应位置
更多详见:http://micro.ustc.edu.cn/Linux/MPI/MPICH/mpi49.htm
int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root,
MPI_Comm comm )
(4) MPI_Barrier(MPI_COMM_WORLD);
功能描述为:阻塞通信域内的所有进程,直到它们都达到这个时间,即,所有进程相互同步
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.035 (s). 12 q(s)}

我要回帖

更多关于 mpirun hostfile 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信