【问题标题】:Run a parallel python script from C从 C 运行并行 python 脚本
【发布时间】:2014-11-04 16:55:06
【问题描述】:

我有一个通常使用命令并行运行的 python 脚本

mpirun -n x script.py

是否可以将这个并行化的 Python 代码嵌入到 C 程序中?

即python.org 描述了如何在 C here 中嵌入 python 代码。例如

#include <Python.h>

int
main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                      "print 'Today is',ctime(time())\n");
  Py_Finalize();
  return 0;
}

如果代码不是报告时间,而是并行 python 代码,是否可以做类似的事情?我的权宜之计是

sprintf(command_string,"mpirun -n x python script.py");
system(command_string);

但这不会很快成为一种选择。

谢谢, 托马斯

【问题讨论】:

  • "但这不会很快成为一个选项。"为什么不呢?

标签: python c mpi


【解决方案1】:

您的脚本是否完全使用 MPI(例如 mpi4py)?

您可以在 C 程序中运行 Python,如您所描述的,在 other ways 中,但如果程序进行 MPI 调用,可执行文件必须链接到 MPI 库。

一种可能性是使用 mpirun 运行 C 程序。像以前一样编译和运行:

mpirun -n x cprog 

在您的 C 程序中,您可以执行 Python 代码,该代码已经在并行上下文中(因为 C 程序现在正在并行运行)。如果您确实需要使用 MPI 库,这里可能会有额外的工作。

如果您确实需要 MPI 调用(例如 MPI_Comm_rank 等),您可以将 MPI 库链接到您的 C 程序,按上述方式执行它,在 C 级别调用您需要的任何 MPI 命令,然后将数据传递给通过 Python C API 编写 Python 代码。

如果您不需要 MPI 调用(因此您只是使用 mpirun 在集群上启动多个版本的 Python 脚本),那么只需 mpiruning 您的 C 程序即可。

您也可以并行启动 C 程序,并在 Python 脚本中使用 MPI,但请记住,您应该将 MPI_InitMPI_Finalize 都放在 Python 层中(而不是在 Python 和 C 中)。

如果您必须串行运行 C 程序,我认为您需要掏出钱来启动并行作业。

【讨论】:

  • 感谢您的回复。
  • 感谢您的回复,我的脚本使用了为串行和并行编写的库中的函数。 IE。我可以使用“python script.py”或“mpirun -n 4 python script.py”如何具体调用 MPI 对我来说是隐藏的,它全部在我导入的库 (dolfin) 中处理。函数“知道”我是否使用 mpirun。我的印象是“mpirun -n x cprog”只会导致python代码在每个x处理器上串行运行。我不知道它实际上会继承 mpirun。
猜你喜欢
  • 2023-04-07
  • 2016-02-05
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多