一、MPICH2安装配置
下载Windows下的MPI
二、MPI与VS2013关联问题
1.新建项目,打开属性,包含目录为MPICH2安装目录下的include,库目录为lib.
2.在预处理器中添加“ MPICH_SKIP_MPICXX ”:
3.在代码生成中选择多线程调试:MTd
4.在链接器的输入中,选择附加依赖项,添加mpi.lib,如果下载的MPI文件为Microsoft MPI (ms mpi)那么需要添加的文件为msmpi.lib:
三、代码测试
样例1:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <mpi.h>
//#pragma comment(lib,"mpi.lib") //在连接器中配置mpi.lib
using namespace std;
int main(int argc, char**argv){
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0){
cout << "I am rank" << rank << endl;
}
cout << "Size " << size << "Rank " << rank << endl;
MPI_Finalize();
return 0;
}
样例2:
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char *argv[]) // main必须带参数运行
{
int myid, numprocs, source;
MPI_Status status;
char message[100];
MPI_Init(&argc, &argv);//完成MPI程序的所有初始化,启动MPI环境,标志并行代码的开始
printf("Hello World ! \n");
MPI_Comm_rank(MPI_COMM_WORLD, &myid);/*获取进程的id,函数为int MPI_Common_rank(MPI_Comm comm, int *rank) */
MPI_Comm_size(MPI_COMM_WORLD, &numprocs); /*获取进程个数,函数为int MPI_Common_size(MPI_Comm comm, int *size) */
/*MPI_COMMON_WORLD为通讯组,一个通讯组是一个进程组和上下文的集合,上下文可以看作为组的超级标签,用于区分不同的通讯组,该参数用于限定参加通讯的进程的范围*/
printf("I am %d of %d \n", myid, numprocs);
if (myid != 0) //注意进程为非0
{
strcpy(message, "Hello World !");
MPI_Send(message, strlen(message) + 1, MPI_CHAR, 0, 99, MPI_COMM_WORLD);
/*先将字符串拷贝到发送缓冲区message中,然后调用MPI_Send语句将它发出,用
strlen(message)指定消息的长度,用MPI_CHAR指定消息的数据类型1,指明发往进程0, 使
用的消息标识是99 ,MPI_COMM_WORLD是包含本进程 和接收消息的进程进
程0 的通信域,发送方和接收方必须在同一个通信域中,由通信域来统一协调和控制消息
的发送和接收*/
}
else
{
for (source = 1; source < numprocs; source++)
{
MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status);
printf("%s\n", message);
/*进程0直接执行接收消息的操作,这里它使用message作为接收缓冲区,
由此可见,对于同一个变量在发送进程和接收进程中的作用是不同的,
它指定接收消息的最大长度为100,消息的数据类型为MPI_CHAR字符型,
接收的消息来自进程source ,而接收消息携带的标识必须为99,
使用的通信域也是MPI_COMM_WORLD, 接收完成后的各种状态信息存放在status中,
接收完成后它直接将接收到的字符串打印在屏幕上*/
}
}
MPI_Finalize(); // 结束MPI程序的运行,标志并行代码结束,结束除主进程外其它进程
return 0;
}
注:样例2测试代码来源不明,时间太久,自行整理。