如何解决将使用C ++和Open MPI生成的处理器等级发送到Python脚本
我是C ++和MPI初学者。我在HPC环境中工作,需要执行以下操作:
- 使用C ++代码获取处理器排名。
- 将等级传递给bash脚本。
- 向python脚本提供该排名值并运行它(从bash脚本中获取)。
这是我编写的代码: 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。