VS2013的MPI和OpenMP并行环境配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lusongno1/article/details/82926930

VS2013的MPI和OpenMP并行环境配置

linux下的ddd调试MPI程序

  • 编译时要使用-g选项生成调试信息;
  • 用形如ddd a.out开启ddd调试的GUI;
  • 在代码行上设置断点(通过单击将光标挪到对应代码行上,然后单击的“Break”按钮)。
  • display x 监视变量,Step按钮前进,找到哪一行错误后,可以用kill杀死进程。

这里提ddd调试,是为了说明linux下的调试工具是相当不好使,即使是带GUI的ddd调试,十分丑不说,用起来也十分费劲。对于稍微大一点的程序,或者错误稍微隐蔽一点的程序,Debu无疑是大海捞针。

如果不是以并行为专业方向或者工作的,不建议花费太多时间去在linux环境下利用GDB或者DDD调试。不是吃这碗饭的,何必吃这个苦。

我们可以再win下使用我们惯用的Visual Studio,建立一个项目,配置好项目属性,使之支持MPI和OpenMP,作为一个专门编辑和调试并行程序的模板,以后要调试并行代码,直接拷贝进来即可,等调试好了,再拷贝出去保存。VS不好的地方就是块头太大,有时候显得笨重。

VS2013下MPI环境的配置

  • 下载安装相关库文件:下载地址,找到MS-MPI vx.x.x (new!) ,下载,静静等待,傻瓜式安装。
  • 新建一个空项目Visual C++ >> Win32 >>Win32控制台应用程序>>随意起个名>>在向导中选择控制台应用程序,附加选项选空项目>>完成。这个步骤没有太高要求,你能建出一个项目就行。
  • 打开新建的项目后,点击“调试”->“属性”,点击“配置属性” -> “配置管理器”,在“活动解决方案平台”下选择“新建”“ARM”替换为“X64”,这样就新建了一个新的项目平台。
  • C/C++ ->预处理器->预处理器(下拉)-->编辑,添加:MPICH_SKIP_MPICXX。
  • C/C++ -> 代码生成 -> 运行库,选择:多线程调试(/MTd)
  • 链接器 -> 输入 -> 附加依赖项,添加:msmpi.lib
  • VC++目录中:包含目录中添加D:\Microsoft SDKs\MPI\Include库目录的里面添加:D:\Microsoft SDKs\MPI\Lib\x64
  • 重启VS。

现在,可以新建cpp文件,编写MPI程序,MPI程序的单机调试同VS中C程序的调试方式。下附一个MPI程序简单模板:

#include <stdio.h>
#include "mpi.h"
#include <math.h>

int main(int argc, char *argv[]) {
	int myrank;
	int size;
	MPI_Status status;
	MPI_Init(0, 0);//这个得写在MPI_Comm_rank和MPI_Comm_size前面
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);




//这里编写程序主体




	MPI_Finalize();
	return 0;
}

程序的运行:生成解决方案成功后,在xxx\template\X64\Debug 目录下,代开CMD窗口,运行mpiexec -n 10 ./template.exe

OpenMP支持

在配置属性下,选择C/C++,找到语言,把OpenMPI支持打开即可。
OpenMP程序运行:在程序末尾加上getchar(),保持dos窗口的停留,按F5运行即可。
这有一个简单的程序示例:

#include <stdio.h>
#include <omp.h>

int main()
{
  int x;
  x = 7;
//#pragma omp parallel num_threads(4) shared(x)
#pragma omp parallel private(x)
  {
    // 定义私有变量y。
    int y;
    y = 3;
    if (omp_get_thread_num() == 0)
      {
        x = 5;
        y = 6;
      }
    else
      {
        x = omp_get_thread_num();
      }
    //sleep(4-x);
    fprintf(stderr, "Thread# %d: x = %d, y = %d\n", omp_get_thread_num(), x, y);
  } // end for pragma omp parallle
    fprintf(stderr, "x = %d\n", x);
}

Windows下,VS和Dev C++、Visual C++ 6.0相比,还是十分令人满意的,除了块头大点,写个小脚本还要建个项目外,在很多方面,都是很有优势的。所以,吃过6.0和dev的各种亏后,最后还是决定转战VS。

猜你喜欢

转载自blog.csdn.net/lusongno1/article/details/82926930