求教单机linux 多核运行命令MPI运行问题

当前位置:
&lammps在windows下的单机多核运算
lammps在windows下的单机多核运算
作者 chibang367
求lammps在windows下单机多核运算实例详细步骤。mpi已安装且cmd窗口输入mpiexec -np 6 lmp_mpi &c.in能够运行,但运行速度和串行一样,不知道是因为哪里的参数没设置好。log文件里有出现WARNING: OMP_NUM_THREADS environment is not set. (../comm.cpp:90)
&&using 1 OpenMP thread(s) per MPI task。
求高手指点!
楼主,你好!问题解决了吗?请问你具体是怎么安装windows下的lammps的,我是先安装的lammps 64的,再安装mpi,后面怎么运行处理,我看到帮助文档中有说先用关于管理员运行cmd,在mpi的bin文件中运行smpd.exe -install,后面再cmd中输入mpiexec -localonly 4 lmp_mpi -in in.crack或者mpiexec -np 4 lmp_mpi -in in.crack,结果就提示错误了,楼主能说一下具体是怎么安装和运行的,谢谢楼主了。
引用回帖:: Originally posted by LZL123456 at
楼主,你好!问题解决了吗?请问你具体是怎么安装windows下的lammps的,我是先安装的lammps 64的,再安装mpi,后面怎么运行处理,我看到帮助文档中有说先用关于管理员运行cmd,在mpi的bin文件中运行smpd.exe -insta ... 你解决问题了没?安装了好几次都没成
windows的话,应该先安装和配置mpich2,官网链接:
下载安装后进行配置。参考
先设置环境变量,对于Win10,我的电脑-属性-高级系统设置-环境变量-系统变量-path,添加安装目录路径,如:D:\Program Files\MPICH2\bin
环境变量设置好后进行注册。在开始菜单找到wmpiregister,打开,注册,注意用户名和密码应该与win管理员一致
配置好后,就可以编辑bat文件进行多核计算了,bat文件内容示例:&D:\Program Files\MPICH2\bin\mpiexec.exe& -n 4 lmp_mpi & in3.txt&&。其中4为核数,
24小时热帖
下载小木虫APP
与700万科研达人随时交流漫谈并发编程:用MPI进行分布式内存编程(入门篇) - 简书
漫谈并发编程:用MPI进行分布式内存编程(入门篇)
本篇是MPI的入门教程,主要是为了简单地了解MPI的设计和基本用法,方便和现在的Hadoop、Spark做对比,并尝试理解它们之间在设计上有什么区别。
身处Hadoop、Spark这些优秀的分布式开发框架蓬勃发展的今天,老的分布式编程模型是否没有必要学习?这个很难回答,但是我更倾向于花一个下午的时候来学习和了解它。
关于并发和并行编程系列的文章请参考
举个最简单的例子,通过这个例子让大家对MPI有一个基本的理解。
解释一些和MPI相关的概念。
列举一些MPI的常用函数,以及基本用法
通过两个例子详细说明MPI的用法
0x01 举个栗子
建议在Ubuntu上安装,不过笔者尝试一下,报了各种错。正好Win10可以安装一个Linux的bash,就安装了一下,用起来和原生Linux没什么区别,挺方便。
一句搞定。
sudo apt-get install libcr-dev mpich2 mpich2-doc
helloworld
MPI的c语言版helloworld。这是一个最简单的版本,相当于是每个进程都打印一下helloworld。
该例子中的一些方法以及概念在后面都会解释,而且会有两个比这个功能更全一点的例子来帮助理解。
#include &mpi.h&
#include &stdio.h&
int main (int argc, char* argv[])
MPI_Init (&argc, &argv);
/* starts MPI*/
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
/* get current process id*/
MPI_Comm_size (MPI_COMM_WORLD, &size);
/* get number of processes*/
printf( "Hello world from process %d of %d\n", rank, size );
MPI_Finalize();
先编译,如果有for循环的话,记得加上后面的参数。
mpicc mpi_hello.c -o hello -std=c99
$ mpirun -np 5 ./hello
Hello world from process 0 of 5
Hello world from process 1 of 5
Hello world from process 2 of 5
Hello world from process 3 of 5
Hello world from process 4 of 5
从上面的简单例子可以看出 一个MPI程序的框架结构可以用下图表示 把握了其结构之后,下面的主要任务就是掌握MPI提供的各种通信方法与手段。
安装时遇到的问题
来一个我在Ubuntu16.04下遇到的错误,实在不想解决这些乱七八糟的,就跳过了。
$sudo apt-get install libcr-dev mpich2 mpich2-doc
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package mpich2 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
mpich:i386 mpich
Package mpich2-doc is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
E: Package 'mpich2' has no installation candidate
E: Package 'mpich2-doc' has no installation candidate
0x02 基本概念
对MPI的定义是多种多样的,但不外乎下面三个方面,它们限定了MPI的内涵和外延:
MPI 是一个库,不是一门语言。MPI 提供库函数/过程供 C/C++/FORTRAN 调用。
MPI 是一种标准或规范的代表,而不特指某一个对它的具体实现。
MPI 是一种消息传递编程模型。最终目的是服务于进程间通信这一目标 。
名词和概念
程序代码:
这里的程序不是指以文件形式存在的源代码、可执行代码等,而是指为了完成一个计算任务而进行的一次运行过程。
进程(Process)
一个 MPI 并行程序由一组运行在相同或不同计算机 /计算节点上的进程或线程构成。为统一起见,我们将 MPI 程序中一个独立参与通信的个体称为一个进程。
一个 MPI程序的全部进程集合的一个有序子集。进程组中每个进程都被赋予一个在改组中唯一的序号(rank),用于在该组中标识该进程。序号范围从 0 到进程数-1。
通信器(communicator):
有时也译成通信子,是完成进程间通信的基本环境,它描述了一组可以互相通信的进程以及它们之间的联接关系等信息。MPI所有通信必须在某个通信器中进行。通信器分域内通信器(intracommunicator)和域间通信器(intercommunicator)两类,前者用于同一进程中进程间的通信,后者则用于分属不同进程的进程间的通信。
MPI 系统在一个 MPI 程序运行时会自动创建两个通信器:一个称为 MPI_COMM_WORLD,它包含 MPI 程序中所有进程,另一个称为MPI_COMM_SELF,它指单个进程自己所构成的通信器。
序号(rank):
即进程的标识,是用来在一个进程组或一个通信器中标识一个进程。MPI 的进程由进程组/序号或通信器/序号唯一确定。
消息(message):
MPI 程序中在进程间传递的数据。它由通信器、源地址、目的地址、消息标签和数据构成。
通信(communication):
通信是指在进程之间进行消息的收发、同步等操作。
0x02 MPI核心接口
用过Hadoop的童鞋应该都记得经典的Map和Reduce接口,我们在写MR程序的时候主要就在写自己实现的Map和Reduce方法。
MPI比Hadoop需要关注的稍微多一点点。
注意: 这几个核心的接口还是要了解一下的。暂时可以看一眼跳过去,后面在看程序的时候回过头多对比一下就能记住了。
我们简单地理解一下这6个接口,其实可以分为3类:
开始和结束MPI的接口:MPI_Init、 MPI_Finalize
获取进程状态的接口:MPI_Comm_rank、MPI_Comm_size
传输数据的接口:MPI_Send、MPI_Recv
关于传输数据的接口,可以看下图的理解。
1. MPI_Init(&argc, &argv)
初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。
2. MPI_Comm_rank(communicator, &myid)
用来标识各个MPI进程的,给出调用该函数的进程的进程号,返回整型的错误值。两个参数:MPI_Comm类型的通信域,标识参与计算的MPI进程组; &rank返回调用进程中的标识号。
3. MPI_Comm_size(communicator, &numprocs)
用来标识相应进程组中有多少个进程。
4. MPI_Finalize()
结束MPI执行环境。
5. MPI_Send(buf,counter,datatype,dest,tag,comm)
buf:发送缓冲区的起始地址,可以是数组或结构指针;
count:非负整数,发送的数据个数;
datatype:发送数据的数据类型;
dest:整型,目的的进程号;
tag:整型,消息标志;comm:MPI进程组所在的通信域
含义:向通信域中的dest进程发送数据,数据存放在buf中,类型是datatype,个数是count,这个消息的标志是tag,用以和本进程向同一目的进程发送的其它消息区别开来。
6. MPI_Recv(buf,count,datatype,source,tag,comm,status)
source:整型,接收数据的来源,即发送数据进程的进程号;
status:MPI_Status结构指针,返回状态信息。
0x03 进阶版HelloWorld
在这里举第二个例子——一个进阶版的HelloWorld。不再像第一个例子那样简单地打印HelloWorld,在这个程序中,我们指派其中一个进程复杂输出,其它的进程向他发送要打印的消息。
在这个程序中,为了方便理解我会注释大部分的代码。
注意注释。
#include &stdio.h&
#include &string.h&
/* For strlen
//MPI相关的库
#include &mpi.h&
/* For MPI functions, etc */
const int MAX_STRING = 100;
int main(void) {
greeting[MAX_STRING];
/* String storing message*/
//当前进程的进程号
//初始化MPI
MPI_Init(NULL, NULL);
//获取进程的数量,并存入comm_sz变量中
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
//获取当前进程的进程号
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
// 进程号不为0的处理逻辑。
// 在该程序中,进程号不为0的进程,只负责发数据给进程0。
if (my_rank != 0) {
//创建要发送的数据
sprintf(greeting, "Greetings from process %d of %d!",
my_rank, comm_sz);
//发送数据给进程0
MPI_Send(greeting, strlen(greeting)+1, MPI_CHAR, 0, 0,
MPI_COMM_WORLD);
// 进程号为0的处理逻辑
// 打印进程0的数据
printf("Hello! Greetings from process %d of %d!\n", my_rank, comm_sz);
// 循环接收其它进程发送的数据,并打印。
for (int q = 1; q & comm_ q++) {
// 接收其它进程的数据
MPI_Recv(greeting, MAX_STRING, MPI_CHAR, q,
0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("%s\n", greeting);
// 关闭MPI
MPI_Finalize();
/* main */
看一下运行结果。
第一条是我们的进程0打印的,其余的4条都是接收其它进程的数据。
$ mpicc mpi_hello.c -o hello
$ mpirun -np 5 ./hello
Hello! Greetings from process 0 of 5!
Greetings from process 1 of 5!
Greetings from process 2 of 5!
Greetings from process 3 of 5!
Greetings from process 4 of 5!
0x04 MPI实现梯形积分法
用梯形积分法来估计函数 y=f(x) 的图像中,两条垂直线与x轴之间的区域大小。即下图(1)中阴影部分面积。
如上图中的(b),基本思想就是,将x轴的区间划分为n个等长的子区间,然后估计每个子区间范围内的图形面积。最后相加即可。(当然了,这是估算的面积)
其中,梯形的面积如下:
梯形面积= h/2 * (f(xi) + f(xi+1))
其中高h是我们等分的一个区间值,h=(b-a)/n。
那么整个图形的面积如下:
根据上面的公式,我们可以得到一个串行版的程序:
h = (b-a)/n
approx = (f(a) + f(b)) /2.0
for(i=1;i&n-1;i++):
x_i = a + i*h
approx += f(x_i)
approx = h*approx
整个MPI程序设计如下:
进程1~n, 负责各自的矩形面积
进程0,负责将所有矩形面积加起来求和
对应到代码如下:
int main(void) {
int my_rank, comm_sz, n = 1024, local_n;
double a = 0.0, b = 3.0, h, local_a, local_b;
double local_int, total_
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
// 区间大小,所有进程一样
h = (b-a)/n;
local_n = n/comm_
// 每个processor需要处理的梯形的数目
/* Length of each process' interval of
* integration = local_n*h.
So my interval
* starts at: */
local_a = a + my_rank*local_n*h;
local_b = local_a + local_n*h;
local_int = Trap(local_a, local_b, local_n, h);
// 将所有的进程的结果相加
if (my_rank != 0) {
MPI_Send(&local_int, 1, MPI_DOUBLE, 0, 0,
MPI_COMM_WORLD);
// 每个进程单独计算梯形面积
total_int = local_
for (source = 1; source & comm_ source++) {
MPI_Recv(&local_int, 1, MPI_DOUBLE, source, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
total_int += local_
// 进程0打印结果
if (my_rank == 0) {
printf("With n = %d trapezoids, our estimate\n", n);
printf("of the integral from %f to %f = %.15e\n",
a, b, total_int);
MPI_Finalize();
Trap是梯形积分法的串行实现。供每一个processor调用。
double Trap(
double left_endpt
double right_endpt /* in */,
trap_count
double base_len
/* in */) {
double estimate,
estimate = (f(left_endpt) + f(right_endpt))/2.0;
for (i = 1; i &= trap_count-1; i++) {
x = left_endpt + i*base_
estimate += f(x);
estimate = estimate*base_
$mpirun -np 6 ./trap
With n = 1024 trapezoids, our estimate
of the integral from 0.000000 to 3.000000 = 8.502e+00
趁着端午假期的一个下午,把MPI做了一个小的总结。 程度不深,主要是了解MPI的一些基本特性。
暂时总结到这里,后续的工作和学习中如果再遇到了和MPI相关的知识点,再继续深入。
完整代码请看github地址。
完整代码地址:
作者: | |
个人主页:
文章可以转载, 但必须以超链接形式标明文章原始出处和作者信息
欢迎关注微信公众号:木东居士
百战程序员_ Java1573题 QQ群:034603 掌握80%年薪20万掌握50%年薪10万 全程项目穿插, 从易到难,含17个项目视频和资料持续更新,请关注www.itbaizhan.com 国内最牛七星级团队马士兵、高淇等11位十年开发经验专...
作者:邵正将PytLab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙特卡洛算法等)与并行化 算法(MPI,OpenMP等多线程以及多进程并行化)以及python优化方法,经常使用C...
国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿: 前言: 排版 by Dr_Ting公众号:庭说移步 tingtalk.me 获得更友好的阅读体验 Q/GDW XXXX-201X《面向对象的用电信息数据交换协议》是根据《国家...
MPI(message passing interface),是一个消息传递接口。MPI的函数总共有287个。 想实现一个MPI并行计算的程序的话,只要掌握MPI的工作机理和6个简单的MPI函数便可以了,本文介绍4个简单MPI函数:MPI_INIT、MPI_COMM_RAN...
不过是场悲剧 深夜上演 何苦为难他人 过客亦有演技尊严 心已伤痕累累 再添一道何妨 只能妥协于时间 最喜欢下雨和洗澡 泪水和伤口会被冲洗的干干净净 然后 假装回到原点
《金雀花王朝》
这本书读起来还是比较费力的,因为其中的人物冗杂,堪比红楼,而且在金雀花王朝覆盖很长的历史时期,涉及很多不同人物,而且人们的名字和头衔会发生变化,很多人有双重身份,既是英格兰人,也是法兰西人。如何正确地称呼这些人,在英语当中可能问题不大,但音译到中...
一个人和他的原生家庭有着千丝万缕的联系, 而这种联系有可能影响他的一生。 耳濡目染这个成语并非空穴来风, 一个人的发展受到孩童时代的影响是巨大的。 孩童时代如同人生这座高楼的地基, 而地基是否深入牢固直接受到父母的影响, 地基不牢即便后天的建设再良好完善, 也无法建造出摩天...
北京时间12月7日,美国时间12月6日,我的爷爷抢救无效于许昌去世。 他晕倒在家里,走的突然,走的无声。 我的爷爷一向是个热爱生活注重养生的人,我怎么也无法料想这样精神矍铄的老人就这么离去。 从昨天到几天,我都还精神恍惚。一抬头,一抬眼我放佛都能看到爷爷就在我面前,我的手机...
重,却从不回头!特别温柔,特别宁静! 时光从未慢过,也从未快过,无论人间悲喜风雨,不记四季,不记岁月,不记爱恨,偶尔热泪盈眶,总能看见星光! 从不敢忘记最初和自己的约定,想要一个美丽的皮囊,一颗有趣的灵魂,要一个不设限的人生,沧桑老去了无憾! 不想来时曾那么“与众不同”,到...大数据并行计算利器之MPI/OpenMP - 文章 - 伯乐在线
& 大数据并行计算利器之MPI/OpenMP
图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出来,为不同的连通域填入数字标记,并且统计连通域的数目。通过对栅格图像中进行连通域标记,可用于静态地分析各连通域斑块的分布,或动态地分析这些斑块随时间的集聚或离散,是图像处理非常基础的算法。目前常用的连通域标记算法有1)扫描法(二次扫描法、单向反复扫描法等)、2)线标记法、3)区域增长法。二次扫描法由于简单通用而被广泛使用!
图1 连通域标记示意图
随着所要处理的数据量越来越大,使用传统的串行计算技术的连通域标记算法运行时间过长,难以满足实际应用的效率需求。随着并行计算技术的发展,利用不同的编程模型,许多数据密集型的计算任务可以被同时分配给单机多核或多机多处理器进行并行处理,从而有可能大幅度缩减计算时间。目前在集群计算领域广泛使用MPI来进行并行化,在单机领域广泛使用OpenMP进行化,本文针对基于等价对的二值图像连通域标记算法的进行了并行化设计,利用不同的并行编程模型分别实现了不同的并行算法,并通过实验对利用不同并行编程模型所实现的连通域标记算法进行了性能对比分析。
2 二次扫描串行算法思想
顾名思义,二次扫描串行算法步骤包含两部分。
2.1 第一次扫描
b)等价关系建立
2.2 第二次扫描
利用并查集链表进行标记更新。
3 并行化策略
3.1 数据划分并行策略
二次扫描的串行算法中,非直接相邻的各像元数据之间是无关的,将图像分割为数据块后,对于各个数据块之间的主体运算也是独立无关的,可并行性较高,因此可通过对图像进行分块来加快计算时间、提高计算效率。
3.2 并行算法步骤
a)各个进程分别使用串行算法计算
b)各个进程将各块的标记值唯一化
c)生成等价对数组
d)主进程生成全局并查集链表
将1到n-1进程中比较获得的等价对数组统一发送给0进程,0进程生成并查集链表。
e)广播全局并查集链表,各进程更改标记值
主进程广播全局并查集链表,各进程接收后更新标记值。
4 程序实现
并行算法详细流程图。
MPI版本和OpenMP版本的并行算法。
5 测试准备
5.1 实验目的
a)正确性;
b)效率:测试不同连通域数目的数据、不同机器环境(单机和集群)、不同并行编程模型(MPI和OpenMP)对二次扫描并行算法效率的影响。
5.2 测试环境
CPU:两颗Intel(R) Quad Core E5645 Xeon(R) CPU,共12核;
内存:80GB ;操作系统:Linux CentOS 64位。
b)高性能集群(4个计算节点,1个存储节点)
CPU:两颗Intel(R) Quad Core E5645 Xeon(R) CPU,共12核;
内存:32GB;操作系统:Linux CentOS 64位;
节点间文件系统:Network File System (NFS)。
c)测试数据
两个相同数据量( 1 )的二值栅格图像,一个连通域为3个(简单图),一个连通域为10433个(复杂图)
效率测试结果
6.1 结果1:复杂图和简单图的运行时间
6.2 为什么复杂图计算时间更长?
6.3 结果2:单节点环境下,复杂图和简单图的加速比
6.4 问题1:为什么会出现超线性加速比?
原因:并查集链表的影响。
连通域标记算法很多时间用于对并查集链表进行大量查询和插入操作。
6.5 问题2:为什么复杂图比简单图加速比高?
6.6 结果3:集群环境下,复杂图和简单图的加速比
6.7 问题:为什么进程数超过12时,复杂图加速比不再上升,而简单图加速比继续上升?
6.8 结果4:OpenMP版本与MPI版本的比较?
6.9问题:为什么MPI 1个进程比OpenMP 1个线程更高效?
6.10 OpenMP开辟线程的开销?
6.11 OpenMP编译制导语句会影响编译结果?
OpenMP编译制导语句会影响编译结果,这也可以解释单线程OpenMP程序比串行程序慢这一现象。
连通域标记算法的并行化研究,马益杭、占利军、谢传节、秦承志,《地理与地理信息科学》
打赏支持我写出更多好文章,谢谢!
打赏支持我写出更多好文章,谢谢!
关于作者:
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2018 伯乐在线在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
在使用mpi4py开发多核并行的程序时,如何使用pycharn进行单步调试?执行mpi4py的程序需要使用类似"mpiexec -np 16 python xxx.py"这样的命令执行。1.我在pycharn里没有找到如何设置这样的启动参数。2.如果我想进行单步调试,又应该如何设置?
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。}

我要回帖

更多关于 fluent 单机多核 的文章

更多推荐

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

点击添加站长微信