MPICH2用户指南【译文】(2)

本文介绍了MPICH2的进程管理环境及其配置方法,包括SMPD、gforker和remshell进程管理器的使用,以及如何与SLURM和PBS等作业调度系统集成。此外,还详细讲解了调试工具如gdb、TotalView和MPE的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.4 SMPD进程管理环境的扩充(Extensions for SMPD Process Management Environment)

            SMPD是个轮询的进程管理器,可运行在Unix 和 Windows上。如果二进制格式匹配(大/小尾及C类型– int, long, void*等等)的话,它可以跨平台地启动任务。
5.4.1 SMPD的mpiexec参数(mpiexec arguments for SMPD)
            smpd 的mpiexec接受标准的MPI-2选项。执行mpiexec
或者
            mpiexec -help2
可以打印出选项的用法。典型的用法是:
            mpiexec -n 10 myapp.exe
mpiexec的全部选项:
            -n x
            -np x
启动x进程。
            -localonly x
            -np x -localonly
在本地机器上启动x进程。
            -machinefile filename
用一个文件列出要在其上启动的机器名。
            -host hostname
启动指定的主机。
            -hosts n host1 host2 ... hostn
            -hosts n host1 m1 host2 m2 ... hostn mn
启动指定的主机。用第2个版本号
            processes = m1 + m2 + ... + mn
            -dir drive:myworkingdirectory
            -wdir /my/working/directory
用特定的工作目录(-dir 和-wdir是等价的)启动主机。
            -env var val
启动进程之前设置环境变量.
            -exitcodes
每个进程退出时打印出进程退出代码。
            -noprompt
阻止mpiexec提示用户证书。打印出错信息,mpiexec退出。
            -localroot
如果主机是本地的,从mpiexec直接启动根进程。(这就允许根进程创建窗口并可以调试)。
            -port port
            -p port
指定smpd监听的端口。
            -phrase passphrase
指定smpd与其认证连接的安全通行证。
            -smpdfile filename
指定smpd选项包括安全通行证保存的文件(仅unix选项)。
            -path search path
可执行文件搜索路径,用分号隔开。
            -timeout seconds
任务超时。

Windows 特定选项: 
            -map drive:\hostshare
映射一个驱动器到所有的节点上,这个映射在进程退出时删除。
            -logon
提示用户账号及密码。
            -pwdfile filename
从指定的文件读取账号和密码。账号在第一行,密码在第二行。
            -nopopup debug
如果进程崩溃,禁止弹出对话框。
            -priority class[:level]
设置进程启动代码的优先类和选项级别。
            class = 0,1,2,3,4 = idle, below, normal, above, high
            level = 0,1,2,3,4,5 = idle, lowest, below, normal, above, highest
默认的是 -priority 2:3
            -register
加密一个用户名和密码到Windows注册表。
            -remove
从Windows注册表删除加密的身份证明。
            -validate [-host hostname]
为当前或指定主机验证加密的身份证明。
            -delegate
用无密码委托启动进程。
            -impersonate
用无密码认证启动进程。
            -plaintext
不在线上加密。

5.5gforker进程管理环境扩充(Extensions for the gforker Process Management Environment)

            gforker是个在单一机器上期的进程的进程管理系统,之所以这么叫,是因为MPI进程是从mpiexec简单地调用(forked)的。这个进程管理器支持使用 MPI Comm spawn和动态进程子程序的程序,但是不支持从不是mpiexec启动的程序的动态子程序。gforker进程管理器主要是为了作为调试辅助的,因为它在单一节点或处理器上简化了MPI程序的开发与测试。
5.5.1 gforker的mpiexec参数(mpiexec arguments for gforker)
            除了标准的mpiexec命令行参数之外,gforker的mpiexec支持下面的选项:
                  -np <num>   与标准的-n参数意义相同
                  -env <name> <value> 为由mpiexec开始的进程设置变量<name>的值 <value>。
                  -envnone 不传递环境变量(不同于用-env 或-genv参数指定的)给由mpiexec运行的进程。

            默认地,所有的环境变量都提供给每个MPI进程(理论的根据:最少使用户惊讶原则),用其当前值给由mpiexec运行的进程。
            -genv <name> <value> -genv选项与其相应的-env版本意义相同,除了它们适用于所有的可执行文件之外,而不是当前的可执行文件(为此用分号隔开多个指定的可执行文件的句 法)。

            -genvnone 与 -envnone一样,除了对所有的可执行文件之外。
            -genvlist <list> 与 -envlist,一样,除了对所有的可执行文件之外。
            -usize <n>  为MPI UNIVERSE SIZE属性值指定返回值。

            -l 用进程的层级标记出标准输出和标准错误信息(stdout 和 stderr)
            -maxtime <n>  设置一个 <n>秒的时间限度。
            -exitinfo 如果存在一个意外退出,提供每个进程退出有关原因的更多信息。

            除了命令行参数之外,gforker的 mpiexec还提供了一些环节变量,可以用来控制mpiexec的行为:
            MPIEXEC TIMEOUT 以秒表示的mpiexec将结束的最大运行时间。
            MPI 程序所占用时间比
            MPIEXEC TIMEOUT.指定的值要长。
            MPIEXEC UNIVERSE SIZE  设置范围(universe)大小。
            MPIEXEC PORT RANGE   设置mpiexec用来与其启动的进程交互通讯的端口范围。这个设置的格式为: <low>:<high>.。例如,要指定端口在10000 and10100之间,用 10000:10100。
            MPICH PORT RANGE 与MPIEXEC PORT RANGE意义相同,如果MPIEXEC PORT RANGE没设置使用。
            MPIEXEC PREFIX DEFAULT 如果这个环境变量设置了,那么输出到标准输出按进程的MPI COMM WORLD的层级加前缀,到标准错误输出的按层级和文本加前缀;二者都后跟角括号(v)。如果这个变量没设置,那么不加前缀。
            MPIEXEC PREFIX STDOUT 设置用于发送到标准输出的行的前缀。%d为MPI COMM WORLD中的层级替代,a %w为MPI任务中的涉及多个MPI COMM WORLD的MPI COMM WORLD表示替代。(如,MPI Comm spawn或者MPI Comm connect的)。
            MPIEXEC PREFIX STDERR 与 MPIEXEC PREFIX STDOUT 一样,但用于标准错误输出。

            MPIEXEC STDOUTBUF 设置标准输出的缓冲模式。有效的值是NONE(无缓冲),LINE(行缓冲)和BLOCK(字符块缓冲;块大小定义实现)。默认值是NONE。
            MPIEXEC STDERRBUF 与 MPIEXEC STDOUTBUF 一样,只是对标准错误输出。

5.6 remshell进程管理器环境的限制(Restrictions of the remshell Process Management Environment)..

            remshell“进程管理器”提供了利用安全shell命令(ssh)的mpiexec一个很简单的版本,用来在机器的集合上 启动进程。由于这主要是为了诠释如何构造mpiexec的与其他进程管理器协同的一个版本,所以它没有实现本文档中描述的其他mpiexec程序的全部特 征。尤其是,它忽略了对MPI程序控制环境变量的命令行部分。
            它支持mpiexec的gforker版本所提供的标签输出同样的特征。但是这个版本的mpiexec完全可以像MPICH-1 中的 ch p4的mpirun那么用,在一个机器集合上来运行允许远程shell的程序。按机器名的一个文件应该包含可以在其上运行进程的机器名,每行一台机器。必 须列出足够的机器来满足请求的进程数;如果必要的话,你可以列出同一机器名为多项。
            对于更复杂的需要或者更快的启动代码,我们推荐使用mpd进程管理器。

5.7 SLURM 及 PBS一起使用MPICH2(Using MPICH2 with SLURM and PBS)

            MPICH2可以用于SLURM 和 PBS 两种环境。如果配置了SLURM,用SLURM提供的srun任务启动工具。对于PBS,MPICH2任务可以用两种方式启动:(i) 用MPD,或者(ii)用OSC mpiexec。
5.7.1 PBS环境中的MPD(MPD in the PBS environment)
            PBS指定分配在文件$PBS NODEFILE中一个特定任务的机器。但是,PBS所用的格式不同于MPD所用的格式。尤其是,PBS列出单一线上的每个节点;如果一个节点(n0)有 两个进程,那么它被列出两次。另一方面,MPD使用一个标识符(ncpus)来描述一个节点所拥有多少处理器。因此,如果n0有两个处理器,那么它列出为 n0:2。把节点文件转化为MPD格式的方式如下:
                  sort $PBS NODEFILE | uniq -C | awk ’{ printf(”%s:%s”, $2, $1); }’ >mpd.nodes


            一旦PBS节点文件被转换之后,MPD就可以在PBS任务脚本之内,用mpdboot和mpdallexit照常启动了。
                  mpdboot -f mpd.hosts -n [NUM NODES REQUESTED]
                mpiexec -n [NUM PROCESSES] ./my test program
5.7.2 OSC mpiexec
            俄亥俄超级计算机中心的 Pete Wyckoff提供了一个轮询工具,叫做OSC mpiexec,在PBS系统上不用MPD启动MPICH2任务。关于这些更多信息可以在http://www.osc.edu/»pw/mpiexec找到。

6 管理进程管理环境(Managing the Process Management Environment)

            有些进程管理器提供给用户命令,可以用来与进程管理器交互,来控制人物。本节我们描述一些也许很有用的命令。

6.1 MPD

            mpd启动mpd守护进程。
            mpdboot在一些机器上启动一系列mpd。
            mpdtrace列出所有在运行的MPD守护进程。-l 选项列出完整的主机名和mpd监听的端口。

            mpdlistjobs列出mpd正在运行的任务。任务是mpd  由名字区分的,在那提交的名字和一个数字。mpdkilljob杀死由 mpdlistjobs按名字返回的一个任务。mpdsigjob递交给命名任务一个信号。信号是用名字和数字指定的。

            你可以用按键以通常的方式提供信号,其中mpiexec代表了整个应用程序。即,如果mpiexec后台运行在Unix的shell,那么你可以用^C (control-C)发送一个SIGINT给进程,或者用^Z (control-Z)全部挂起他们。一个可挂起的任务可以按通常的方式继续。
            准确的参数格式可以通过传递任何MPD命令--help 或 -h参数得到。更多细节参见mpich2顶层目录中的README,或者MPD目录 mpich2/src/pm/mpd中的README文件。

7 调试(Debugging)

            调试并行程序无疑很难。下面我们描述一些方法,其中某些完全取决于你所使用的MPICH2的版本。

7.1 gdb与mpiexec(gdb via mpiexec)

            如果你使用MPD进程管理器,那么你可以对mpiexec用-gdb参数,来执行一个程序,每个进程控制在gdb后续调试器之下。 -gdb选项有助于控制gdb的多个实例,通过对所有进程,或者对一个选择的进程发送stdin,标签并合并输出。当前的实现还有某些局限。例如,我们不 支持设置你自己的提示。这是因为,我们捕获gdb的输出,在处理之前检查它,例如,合并一致的行。还有,我们在main开始处设置断点,来使得所有进程在 开始时同步。因而,如果在main的第一个可执行行就设置,那么用户会有个重复的、不可用的断点。另外,尽可能的程度上,我们试图简单地传递用户输入给 gdb ,让过程正常进行。
            下面一个-gdb会话的脚本给出了这如何运转的机制。输入键被发送给所有进程,除非用 “z” 命令特别地重定向。
ksl2% mpiexec -gdb -n 10 cpi
0-9: (gdb) l
0-9: 5 double f(double);
0-9: 6
0-9: 7 double f(double a)
0-9: 8 {
0-9: 9 return (4.0 / (1.0 + a*a));
0-9: 10 }
0-9: 11
0-9: 12 int main(int argc,char *argv[])
0-9: 13 {
0-9: 14 int done = 0, n, myid, numprocs, i;
0-9: (gdb)
0-9: 15 double PI25DT = 3.141592653589793238462643 ;
0-9: 16 double mypi, pi, h, sum, x;
0-9: 17 double startwtime = 0.0, endwtime;
0-9: 18 int namelen;
0-9: 19 char processor_name[MPI_MAX_PROCESSOR_NAME];
0-9: 20
0-9: 21 MPI_Init(&argc,&argv);
0-9: 22 MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
0-9: 23 MPI_Comm_rank(MPI_COMM_WORLD,&myid);
0-9: 24 MPI_Get_processor_name(processor_name,&namelen);
0-9: (gdb)
0-9: 25
0-9: 26 fprintf(stdout,"Process %d of %d is on %sn",
0-9: 27 myid, numprocs, processor_name);
0-9: 28 fflush(stdout);
0-9: 29
0-9: 30 n = 10000;
0-9: 31 if (myid == 0)
0-9: 32 startwtime = MPI_Wtime();
0-9: 33
0-9: 34 MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
0-9: (gdb) b 30
0-9: Breakpoint 2 at 0x4000000000002541:
file /home/lusk/mpich2/examples/cpi.c, line 30.

0-9: (gdb) r
0-9: Continuing.
0: Process 0 of 10 is on ksl2
1: Process 1 of 10 is on ksl2
2: Process 2 of 10 is on ksl2
3: Process 3 of 10 is on ksl2
4: Process 4 of 10 is on ksl2
5: Process 5 of 10 is on ksl2
6: Process 6 of 10 is on ksl2
7: Process 7 of 10 is on ksl2
8: Process 8 of 10 is on ksl2
9: Process 9 of 10 is on ksl2
0-9:
0-9: Breakpoint 2, main (argc=1, argv=0x60000fffffffb4b8)
0-9: at /home/lusk/mpich2/examples/cpi.c:30
0-9: 30 n = 10000; * default # of rectangles */
0-9: (gdb) n
0-9: 31 if (myid == 0)
0-9: (gdb) n
0: 32 startwtime = MPI_Wtime();
1-9: 34 MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
0-9: (gdb) z 0
0: (gdb) n
0: 34 MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
0: (gdb) z
0-9: (gdb) where
0-9: #0 main (argc=1, argv=0x60000fffffffb4b8)
0-9: at /home/lusk/mpich2/examples/cpi.c:34
0-9: (gdb) n
0-9: 36 h = 1.0 / (double) n;
0-9: (gdb)
0-9: 37 sum = 0.0;
0-9: (gdb)
0-9: 39 for (i = myid + 1; i <= n; i += numprocs)
0-9: (gdb)
0-9: 41 x = h * ((double)i - 0.5);
0-9: (gdb)
0-9: 42 sum += f(x);
0-9: (gdb)
0-9: 39 for (i = myid + 1; i <= n; i += numprocs)
0-9: (gdb)
0-9: 41 x = h * ((double)i - 0.5);
0-9: (gdb)
0-9: 42 sum += f(x);
0-9: (gdb)
7 DEBUGGING 22
0-9: 39 for (i = myid + 1; i <= n; i += numprocs)
0-9: (gdb)
0-9: 41 x = h * ((double)i - 0.5);
0-9: (gdb)
0-9: 42 sum += f(x);
0-9: (gdb)
0-9: 39 for (i = myid + 1; i <= n; i += numprocs)
0-9: (gdb)
0-9: 41 x = h * ((double)i - 0.5);
0-9: (gdb)
0-9: 42 sum += f(x);
0-9: (gdb)
0-9: 39 for (i = myid + 1; i <= n; i += numprocs)
0-9: (gdb)
0-9: 41 x = h * ((double)i - 0.5);
0-9: (gdb)
0-9: 42 sum += f(x);
0-9: (gdb)
0-9: 39 for (i = myid + 1; i <= n; i += numprocs)
0-9: (gdb)
0-9: 41 x = h * ((double)i - 0.5);
0-9: (gdb)
0-9: 42 sum += f(x);
0-9: (gdb) p sum
0: $1 = 19.999875951497799
1: $1 = 19.999867551672725
2: $1 = 19.999858751863549
3: $1 = 19.999849552071328
4: $1 = 19.999839952297158
5: $1 = 19.999829952542203
6: $1 = 19.999819552807658
7: $1 = 19.999808753094769
8: $1 = 19.999797553404832
9: $1 = 19.999785953739192
0-9: (gdb) c
0-9: Continuing.
0: pi is approximately 3.1415926544231256, Error is 0.0000000008333325
1-9:
1-9: Program exited normally.
1-9: (gdb) 0: wall clock time = 44.909412
0:
0: Program exited normally.
0: (gdb) q
0-9: MPIGDB ENDING
ksl2%

            你可以附加到运行的任务,用
                  mpiexec -gdba <jobid>
            其中<jobid>来自mpdlistjobs。

7.2 TotalView

            MPICH2支持使用Etnus的TotalView调试器,只通过MPD进程管理器。如果MPICH2配置为允许用TotalView调试(参见安装指 南的MPD配置一节),那么就可以用MPD通过给mpiexec加-tv参数调试一个MPI程序了。如,
                  mpiexec -tv -n 3 cpi

            从TotalView你会得到一个弹出窗口,询问你是否要在停止的状态下启动任务。如果是这样,在TotalView窗口出现时,你也许会在源代码窗口中 看到装配的代码,点击堆栈窗口(左上角)中的main,查看main函数的源代码。TotalView会显示程序(所有的进程)在对MPI Init调用处停下来了。当用TotalView使用上面启动序列时,MPICH2任务不执行TotalView就不能重新启动。在MPICH2 1.0.6或以后的,版本中TotalView可以对MPICH2如下地调用:
                  totalview python -a ‘which mpiexec‘ -tvsu
                  <mpiexec args> <program> <program args>
MPICH2任务在TotalView之内是完全可以重新启动的。

            如果你有MPICH2的1.0.6或以后的版本,TotalView 8.1.0或更高版本,那么你可以使用一个叫直接用MPICH2启动的TotalView特征。调用TotalView如下:
                  totalview <program> -a <program args>
            然后选择Process(进程)/Startup Parameters (启动参数)命令。在后面的对话框中选择Parallel(并行)选项卡,选择MPICH2作为并行系统。

            用Tasks(任务)字段设置任务数,并在Additional Starter Arguments(其他的启动参数)输入其他需要的mpiexec参数。
            如果你想要能够用TotalView附加一个MPICH2任务,那么你必须在启动任务时,对mpiexec用-tvsu选项。

            用这个选项会在MPI Init 之内添加一个关卡,因而也许会稍微影响到启动性能。一旦所有的任务从MPI Init返回,它不会影响任务的运行。为了调试一个正在运行的MPICH2任务,你必须把TotalView附加到运行mpiexec脚本的Python 的实例,而且不要有其他的Python脚本运行。如果你只有一个任务运行在你调用mpiexec的节点上,而没有其他的Python脚步运行,那么这个节 点上会有3个Python实例运行。其中之一是那个节点上的MPICH2任务的父进程,一个是Python进程的父进程。其中没有哪个是你要附加到其上的 Python实例--它们都是在运行的MPD脚本。第三个Python实例没有子进程,也不是一个Python进程的子进程。那是运行的mpiexec, 也就是你想要附加的。

8 MPE

            MPICH2有个与MPICH1包含的相同的MPE(多进程环境)工具。 这些工具包含记录MPI程序执行的跟踪库和性能可视化的Jumpshot及SLOG工具,和一个MPI集合的数据类型检查库。这些MPE工具是默认地建立 与安装的,不用额外的查询步骤应该就可用。使用MPE profiling库的最容易的方式是通过MPICH2编译器包装的mpicc, mpicxx, mpif77和 mpif90提供的 -mpe= switch。

8.1 MPI日志(MPI Logging)

            MPE提供自动的MPI登录。例如,要查看一个程序的MPI通讯类型(pattern),fpilog.f,可以简单地如下链接到源文件:
                  mpif90 -mpe=mpilog -o fpilog fpilog.f

-mpe=mpilog选项会链接合适的MPE profiling库。然后通过mpiexec运行的程序会把结果记录到工作目录内一个日志文件logfile,未知的clog2。最后的步骤是通过Jumpshot转换及查看logfile。
                  jumpshot Unknown.clog2

8.2 用户自定义登录(User-defined logging)

            除了使用预定义的MPE日志功能记录MPI调用之外,MPE记录日志调用还可以插入到用户的MPI程序,定义并吧状态记录到日志。这些状态叫用户自定义状 态。状态可以嵌套,允许你定义一个描述一个包含几个MPI调用的用户子程序,既显示用户自定义状态,又显示包含在其中的MPI操作。
            插入用户自定义状态典型的方式如下:
            • 从MPE 日志库获得句柄。MPE Log获得日志状态eventIDs(),必须用来获得唯一的事件ID(MPE日志句柄 )。这是很重要的,如果你正在编写一个MPE系统的使用MPE日志子程序的库。记录下eventID的痕迹不是个好主意,因为它会引起eventID冲 突,因此实践中并不支持。
            • 设置已记录日志的状态特征:MPE描述 state() 设置状态的名称和颜色。
            •  把已记录的状态记录到日志: MPE Log 的event()被调用两次,记录用户自定义状态。
1 更老的MPE库提供MPE Log,获得事件number()还是被支持,但是一直有异议。用户强烈争执要使用 MPE Log获得eventIDs()。

下面是个使用上面所概述的第三步的简单的例子。
      int eventID_begin, eventID_end;
      ...
MPE_Log_get_state_eventIDs( &eventID_begin, &eventID_end );
      ...
MPE_Describe_state( eventID_begin, eventID_end,
"Multiplication", "red" );
...
MyAmult( Matrix m, Vector v )
{

MPE_Log_event( eventID_begin, 0, NULL );
... Amult code, including MPI calls ...

MPE_Log_event( eventID_end, 0, NULL );
}
            由这段代码生成的logfile会使得MPI子程序在MyAmult()之内嵌套。
            除了用户自定义的状态之外,MPE2还提供对用户自定义事件的支持,这自定义事件可以通过MPE Log获得唯一的eventID()和MPE描述的event()而定义。更得细节,例如,参见cpilog.c。

8.3 MPI检查(MPI Checking)

            要通过如下地连接源代码文件验证在一个程序中所有的MPI的合作调用:
                  mpif90 -mpe=mpicheck -o wrong_reals wrong_reals.f
            运行改程序会有下面的输出:
                  > mpiexec -n 4 wrong_reals
            启动MPI的合作与数据类型检查!
                  Process 3 of 4 is alive (4个进程的3个是活动的)。
                  Backtrace of the callstack at rank 3: (callstack的Backtrace运行在层次3:)
                  At [0]: wrong_reals(CollChk_err_han+0xb9)[0x8055a09]
                  At [1]: wrong_reals(CollChk_dtype_scatter+0xbf)[0x8057bff]
                  At [2]: wrong_reals(CollChk_dtype_bcast+0x3d)[0x8057ccd]
                  At [3]: wrong_reals(MPI_Bcast+0x6c)[0x80554bc]
                  At [4]: wrong_reals(mpi_bcast_+0x35)[0x80529b5]
                  At [5]: wrong_reals(MAIN__+0x17b)[0x805264f]
                  At [6]: wrong_reals(main+0x27)[0x80dd187]
                  At [7]: /lib/libc.so.6(__libc_start_main+0xdc)[0x9a34e4]
                  At [8]: wrong_reals[0x8052451]
                  [cli_3]: aborting job:
                  Fatal error in MPI_Comm_call_errhandler:
                  Collective Checking: BCAST (Rank 3) --> Inconsistent datatype signatures
                  detected between rank 3 and rank 0. (在层级3和层级9之间检测到不一致的数据类型签名)
                  The error message here shows that the MPI Bcast has been used with inconsistent
                  datatype in the program wrong reals.f. (这里的错误信息表示,MPI Bcast在程序中使用了不一致的数据类型)

8.4 MPE 选项(MPE options)

            通过MPICH2编译器包装而可用的其他 MPE profiling选项有:
            -mpe=mpilog : 自动的MPI 和 MPE用户自定义状态日志。
            This links against -llmpe -lmpe.
            -mpe=mpitrace : 用printf的Trace MPI 程序。
            This links against -ltmpe.
            -mpe=mpianim : 实时地激活(Animate)MPI程序。
            This links against -lampe -lmpe.
            -mpe=mpicheck : 用合作&数据类型检查MPI程序。
            Checking library(检查库). This links against -lmpe_collchk.
            -mpe=graphics : 与X11一起使用MPE图形子程序。
            This links against -lmpe <X11 libraries>.
            -mpe=log : MPE user-defined states logging.
            This links against -lmpe.

            -mpe=nolog : Nullify MPE user-defined states logging.
            This links against -lmpe_null.
            -mpe=help : Print the help page.
            如何使用MPE profiling工具更多信息,参见mpich2/src/mpe2/README。

9 MPICH2提供的其他工具(Other Tools Provided with MPICH2)

            MPICH2还包含对于MPI-1 和 MPI-2功能的测试套件;这个套件可以在mpich2/test/mpi源代码目录找到,可以用命令行make testing运行。这个测试套件应该可以与任何MPI实现运行起来,不只MPICH2。

10 Windows下的MPICH2(MPICH2 under Windows)

10.1 目录(Directories)

            MPICH2默认的安装在C:Program FilesMPICH2。安装目录下有3个子目录: include, bin和lib。 include 和 lib目录包含编译MPI应用程序必要的头文件和库。bin目录包含进程管理器,smpd.exe,和MPI任务启动器mpiexec.exe。实现 MPICH2的dll被复制到Windows的system32目录。

10.2 编译(Compiling)

            lib目录中的库是用MS Visual C++ .NET   2003和Intel Fortran 8.1编译的。这些编译器和其他的可以与MS .lib文件链接的,都可以用来创建用户应用程序。cygwin的gcc 和 g77可以与libmpich*.a一起用。对于MS Developer Studio用户:创建一个项目,添加 C:Program FilesMPICH2include到包含路径, C:Program FilesMPICH2lib到库路径。添加mpi.lib 和 cxx.lib到连接命令。Cygwin用户应该用libmpich2.a 。.

10.3 运行(Running)

            MPI任务从命令行提示符用mpiexec.exe运行。关于mpiexec选项,对于smpd的描述,参见 5.4节。


常见问题(A Frequently Asked Questions)

This is the content of the online FAQ, as of June 23, 2006.

A.1 一般信息(General Information)

A.1.1 Q: MPICH2是什么(What is MPICH2)?
            MPICH2是自由可用、可移植的MPI实现,是信息传递库的标准。它实现了MPI-1 和 MPI-2。
A.1.2 Q: MPICH是什么意思(What does MPICH stand for)?
... ...
References
[1] Message Passing Interface Forum. MPI2: A Message Passing Interface
standard. International Journal of High Performance Computing Applications,
12(1–2):1–299, 1998.
[2] Marc Snir, Steve W. Otto, Steven Huss-Lederman, David W. Walker,
and Jack Dongarra. MPI—The Complete Reference: Volume 1, The
MPI Core, 2nd edition. MIT Press, Cambridge, MA, 1998.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值