将使用C ++和Open MPI生成的处理器等级发送到Python脚本

问题描述

我是C ++和MPI初学者。我在HPC环境中工作,需要执行以下操作:

  1. 使用C ++代码获取处理器排名。
  2. 将等级传递给bash脚本。
  3. 向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

最后,我将bash脚本作为PBS作业提交。这是输出文件

enter image description here

“ Argument accepted =”行来自python脚本,该脚本只接受排名并打印出来。 为了更好地理解python脚本为什么会得到一个奇怪的值,我将shell脚本更改为不接受来自C ++代码的任何输入。相反,C ++代码只是打印其输出。这是我在输出文件中看到的部分屏幕截图:

New output

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