下载MPICH,官方地址:
点击打开链接
Windows下的MPI下载地址为:
点击打开链接
因为MPI在Windows下只能支持到1.4版本,所以我只下载了1.4版本。
安装完成后,在开始菜单可以看到:
下面解决与vs的关联问题:
新建项目,打开属性,包含目录为MPICH2安装目录下的include,库目录为lib:
在预处理器中添加“ MPICH_SKIP_MPICXX ”:
在代码生成中选择多线程调试:
在链接器的输入中,选择附加依赖项,添加mpi.lib,如果下载的MPI文件为Microsoft MPI (ms mpi)那么需要添加的文件为msmpi.lib:
运行代码进行测试:
#include
#include
#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;
}
结果为:
程序已经生成完毕,现在可以进行并行运算:
首先打开“开始-程序-MPICH2-wmpiregister.exe"进行身份登录:
这里的账号密码为计算机登录时的账号密码,填写完成后点击“Register”,结果如下:
点击“ok”,进行下一步,打开“开始-程序-MPICH2-wmpiregister.exe"把刚生成的hello world程序放入到该程序中:
解决this function or variable may be unsafe问题:
需要在“属性”中的预处理器里面添加“ _CRT_SECURE_NO_WARNINGS ”:
解决error LNK2019:无法解析的外部符号问题:
解决控制台窗口闪退问题: