我有一个runPR.sh
如下的脚本
DIR=/directory/buildagain/bin/Project
FILELIST=$1
while read FILE
do
echo "Processing ${FILE}..."
./makeInp.sh ${FILE} ${FILE} >INP/${FILE}.inp
${DIR} -PR INP/${FILE}.inp
done < ${FILELIST}
对于串行程序,我通过输入然后运行make
该/directory/buildagain
程序./runPR.sh values.txt
。 (values.txt
仅包含该行Chain
)
编辑:这是我的代码的一小部分。
int main( int argc, char *argv[ ] )
{
MPI_Status status;
MPI_Init(&argc,&argv);
if( strcmp(argv[1],"-PR") == 0 )
runPR(argc-2, &argv[2]);
return 0;
}
int runPR(int argc, char* argv[])
{
cout<<"run here"<<endl;
int mynode, totalnodes;
int sum,startval,endval,accum;
int master=0;
MPI_Comm_size(MPI_COMM_WORLD, &totalnodes); // get totalnodes
MPI_Comm_rank(MPI_COMM_WORLD, &mynode); // get mynode
PROpt opt;
Solve* ps = new Solve();
cout<<"here1"<<endl;
cout<<"total nodes "<<totalnodes<<endl;
for(int j=0;j<totalnodes-1;j=j+1){
cout<<"processor"<<mynode<<" received from "<<j<<endl;
ps->getFile(&opt,argv[0]);
}
}
通过输入mpirun -np 4 ../directory/buildagain/bin/Project -PR INP/Chain.inp
,我看到run here
, here
,total nodes1
打印了 4 次。但我没有看到cout<<"processor"<<mynode<<" received from "<<j<<endl;
打印出来,我希望total nodes
显示 4,而不是 1。而且,程序只是停止了。为什么是这样?
答案1
在您报告得到输出后
total nodes=1
和
This node=0
打印了 4 次,我得出的结论是你正在尝试这个:mpirun -np 4 script-name.sh
。这样做是因为 mpirun 正在启动 4 个 shell 脚本副本,该脚本不理解 MPI 通信语义。
如果你能以某种方式在脚本上启动 mpirun,然后记住 (1) 脚本运行在本地“头”节点环境中,而不是远程环境中,(2) 脚本必须exec
将您的程序作为最后一口气,并且 (3 )当程序运行时,它可能位于另一个节点上的环境中——可能无法访问您头上的文件。
所以脚本应该是这样的:
PROG="$1"; shift;
OPT="$2"; shift
for FILE in "$@"
do
echo "Processing ${FILE}..."
./makeInp.sh ${FILE} ${FILE} >INP/${FILE}.inp
done
exec $PROG $OPT "$@"
在 中PROG
,您必须索引ARGV
以对应于当前节点/线程。 (请检查您是否没有超出argc
,否则您将遇到空指针违规。)我认为没有其他/更好的方法。