用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);
}
}
}
本文由VS软件圈(vssoft.net)发布,不代表VS软件圈立场,转载联系作者并注明出处:https://vssoft.net/vsazwt/VS2005anzhuangwenti/2020/0721/806.html