VS2005与VS2008下编译的MPI程序运行出错的解决办法

来源:互联网 发布:纸黄金分析软件 编辑:程序博客网 时间:2024/05/01 01:40

用VC2008编译的有些MPI程序,拷贝到其他机群结点上,运行时却出现:“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”。

一开始以为是没有安装.net Framework 3.5,辛辛苦苦从网上下载下完整包后,安装在目标节点上,运行还是不行。从网上搜索了下,发现一篇好文章,虽然是VS2005的,使用方法一照着做,也解决了2008的同样问题,原文如下:

在VS2005下用C++写的程序,在一台未安装VS2005的系统上,
用命令行方式运行,提示:
“系统无法执行指定的程序”
直接双击运行,提示:
“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”

以前用VC6和VS2003的话, 如果缺少库文件,是会提示缺少“**.dll”,但是用VS2005却没有这样的提示。

自己实验了一下,感觉以下几种解决办法是可行的:
方法一:
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:

msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest

把这几个文件拷贝到目标机器上,与运行程序同一文件夹(经我验证,放到system32下好像不行!原文作者说也可以),就可以正确运行了。

其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!

方法二:
修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。

方法三:

工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc”
这样生成的exe文件应该就可以在其他机器上跑了。

方法四:

你的vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装

其他需要注意的地方:

1.程序文件在各个结点计算机上必须要放在相同的目录结构下(如:都放在C:\myMPI\下),mpich2才能找到,我一般将那4个VC2008程序执行要用到的文件也一起拷贝到该目录中。

2.各结点计算机要加入相同的工作组或windows域,要关闭防火墙。

3.在各结点计算机上运行wmpiregister.exe注册,很简单输入计算机登录帐号,密码就行了。这里要求各结点运行计算机使用相同的登录帐号和登录密码(不相同是否可以?),并且运行时必须已登陆(这是显而易见的)。

4.在主结点计算机上(也就是启动程序的结点)运行wmpiconfig.exe进行结点的查找配置,先选择domain,然后点击Get Hosts,找到结点计算机,然后点击Scan Hosts,验证正确的结点会使用绿色标出,如图有三台结点验证成功,不知何原因,我的物理主机结点始终验证不成功,不知是不是网络必须使用静态ip地址的原因,我的是长城宽带动态分配ip的,不好改变,这台电脑也就作罢了。

           

3.程序会出现在某个结点能作为主节点启动运行正常,可是转到另一个结点计算机上,会运行不了(没反应,也不报错)的情况。建议使用cmd命令行和mpiexec窗口运行都试试,有时用cmd命令行敲命令可以运行,用mpiexec窗口却不行。有时又反过来,原因不明。



对于三台联网的结点计算机(可以用vmware workstation生成,当然有ESXi的生成效率更高),命令格式:

mpiexec -hosts 3 192.168.110.111 192.168.110.112 192.168.110.113 c:\mpi\sayhello.exe

注意如果程序目录中有空格,要加双引号,没有就算了。以ctrl+C终止运行。

附代码:(注意给工程属性手工加上mpi.lib库,debug和release都要)

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

void Hello( void );
int main(int argc, char *argv[])
{
 int me,  namelen, size;
 char processor_name[MPI_MAX_PROCESSOR_NAME];
 MPI_Init(&argc, &argv);
 MPI_Comm_rank(MPI_COMM_WORLD,&me);
 MPI_Comm_size(MPI_COMM_WORLD,&size);
 
 if (size < 2) {
  
  printf("systest requires at least 2 processes" );
  MPI_Abort(MPI_COMM_WORLD,1);
 }
 MPI_Get_processor_name(processor_name,&namelen);
 
 printf("Process %d is alive on %s\n", me, processor_name);
 fflush(stdout);
// MPI_Barrier(MPI_COMM_WORLD);
 
 Hello();
 
 getchar();
 MPI_Finalize();
}

void Hello( void )

{
 int nproc, me;
 int type = 1;
 int buffer[2], node;
 MPI_Status status;
 MPI_Comm_rank(MPI_COMM_WORLD, &me);
 MPI_Comm_size(MPI_COMM_WORLD, &nproc);
 
 if (me == 0) {
  
  printf("\nHello test from all to all\n");
  fflush(stdout);
 }
 for (node = 0; node<nproc; node++) {
  
  if (node != me) {
   
   buffer[0] = me;
   buffer[1] = node;
   MPI_Send(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD);
   
   MPI_Recv(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD, &status);
   
   if ( (buffer[0] != node) || (buffer[1] != me) ) {
    
    (void) printf("Hello: %d!=%d or %d!=%d\n",
     buffer[0], node, buffer[1], me);
    printf("Mismatch on hello process ids; node = %d\n", node);
   }
   printf("Hello from %d to %d\n", me, node);
   
   fflush(stdout);
  }
 }
}

原创粉丝点击