并行计算MPI(一):MPI入门

这个学期老板可能让我做并行计算方面的东西并推荐MPI给我学习。私下找了一些资料,这个系列作为学习MPI的一个记录吧,所用的主要有两本书:《高性能计算并行编程技术》,都志辉,清华大学出版社;还有一本《MPI并行程序设计实例》,清华大学出版社。代码有自己写的,书上的,网上的。

说到底,MPI就是一个库,一个抽象了的库,这样在你编写多进程,多线程程序的时候不用关心底层的实现细节。提一句:这些多进程多线程知识可以参考《UNIX环境编程》。当然更重要的是,MPI可以运行在多台计算机上,其中不同计算机之间的通信MPI也做好了封装,你需要了解的是相应的高级抽象层的一点东西学会使用即可。网上有非常详细的关于MPI在VS和LINUX下的配置文章,这里给出VS的配置文章:vs下配置MPI亲试配置成功。

	#include 
	using namespace std;
	int main(int argc, char *argv[]) {
		int rank, size;
		MPI_Init(&argc, &argv);
		MPI_Comm_rank(MPI_COMM_WORLD, &rank);   //rank保存总共的进城数
		MPI_Comm_size(MPI_COMM_WORLD, &size);   //size保存一共机器数
		cout << "Thread : " << rank << "of " << size << endl;
		MPI_Finalize();
		return 0;
	}

上面就是一个MPI程序的框架。MPI_Init()函数是用来初始化MPI环境的,MPI_Finalize()则是结束MPI环境的,和MPI_Init()是相对应的。在这两个函数中间写相应的业务逻辑代码。MPI_Comm_rank()是获得当前进城标号(进城从0开始),MPI_COMM_WORLD表示所有的通信域,简单地说就是和当前电脑当前程序相互通信的所有机器,所有程序。MPI_Comm_size()获得机器数。

#include "mpi.h"
	#include 
	using namespace std;
	int main(int argc, char *argv[]) {
		int rank, size;
		MPI_Init(&argc, &argv);
		MPI_Comm_rank(MPI_COMM_WORLD, &rank);   //rank保存总共的进城数
		MPI_Comm_size(MPI_COMM_WORLD, &size);   //size保存一共机器数
		if(0 == rank) {
			//进城0需要完成的任务
		} else if(1 == rank) {
			//进城1需要完成的任务
		}
		//...
		MPI_Finalize();
		return 0;
	} 


上面的程序是以后所有的程序骨架,以后的程序基本是基于它进行增加的。比如常见的:这样不同的进程就可以做不同的事情了。至于进城之间如何通信等等就之后的文章再说明。第一次接触这个东西,慢慢来。

你可能感兴趣的:(并行计算)