问题描述
我是C ++和MPI初学者。我在HPC环境中工作,需要执行以下操作:
这是我编写的代码: C ++(文件名-cpp2bash_test.cpp):
#include <iostream>
#include <mpi.h>
int main(int argc,char** argv)
{
MPI_Init(&argc,&argv);
int size,rank;
MPI_Status status;
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
cout << rank << endl;
MPI_Finalize();
return 0;
}
我将文件编译为:
mpicxx -g -std=c++14 -o PRank cpp2bash_test.cpp
重击:
#!/bin/sh
result=$(./PRank)
python3 bash2py_test.py $result
“ Argument accepted =”行来自python脚本,该脚本只接受排名并打印出来。
为了更好地理解python脚本为什么会得到一个奇怪的值,我将shell脚本更改为不接受来自C ++代码的任何输入。相反,C ++代码只是打印其输出。这是我在输出文件中看到的部分屏幕截图:
Python文件输出(未在第二张图中显示)仍然与之前显示的相似。
我在谷歌上搜索了该警告,但是我对阅读的内容并不太了解。实际上,我什至不知道我正在阅读的内容是否与我的问题有关。 我怀疑C ++代码的完整输出包含警告,该警告在传递给Python时会被截断为仅放在方括号内的那些怪异值。如何删除这些警告并将正确的值传递给python脚本?
解决方法
请注意,对于大多数队列系统,设置了指示进程等级的系统变量。一旦进入脚本(以MPI
开头),您就应该能够从环境中获取脚本(必须查看队列系统手册)。
另一种方法是为信息生成一些包装的日志和grep,例如:
cout << "RANK:" << rank << endl;
然后,您可以执行以下操作:
result=$(echo "RANK:2" | grep RANK | cut -f2 -d':')
echo $result
根据您的情况将是
result=$(./PRank | grep RANK | cut -f2 -d':')
echo $result