繁体   English   中英

我应该运行来自 Python 的单个并行化 C 脚本还是一组并行的串行 C 脚本?

[英]Should I run a single parallelized C script from Python or a parallel set of serial C scripts?

概述

我正在为计算密集型科学计算应用程序重写和优化一组 MATLAB 脚本,并将其优化为一组 Python 脚本,其中内核使用 Z0D61F8370CAD1D412F80B84D143E125 编写(使用 cruntype)。 为了便于最终用户应用和配置,Python 封装是必要的。 我目前的硬件是具有 64 GB RAM 的 12 核 Ryzen 7 3700X,但它也适用于在更大和更低时钟频率的集群上运行。

输入输出

这个问题涉及的代码部分是高度可并行化的。 输入将是类似于 100-200 组(在工作内存中连续排序)的几百万个统一组织的浮点数(您可以将它们想象为 100-200 个相当高分辨率的黑白图像,所有图像都具有相同的比例和类似的结构)。 对于大部分过程,每个这样的“集合”都可以独立且不间断地处理。 在这些上执行了许多计算(可能还有内存)密集型计算——其中一些适合使用 BLAS 实现,但也有更复杂的上采样、插值、滤波、反投影和投影等。 我使用的 MATLAB 实现作为基础,它是通过 Parfor 循环调用几个子例程并使用一些用 C 编写的 MEX 函数来实现的。 每次迭代的 output 将再次成为几百万个浮点数。 如果我没记错的话(目前运行脚本的实际试验非常混乱 - 我的任务是修复另一件事 - 所以我不能轻易检查),计算可能足够密集,以至于循环的每次迭代都可以预计需要几分钟。

难题

我最可能的做法是将整个代码部分变成一个用 C 编写的大“内核”。 我已经用混合 C/Python 编写了它的子函数,与实际计算所需的时间相比,这些子函数已经有太多的 Python 开销 - 所以我想替换所有这些,以及所有这些易于并行化的代码的其余部分,与 C。 因此,我有两种方法可以用来并行化代码:

  1. 我有 Python 创建子进程,每个子进程分别触发串行 C 代码及其数据部分。
  2. 我有 Python 启动一个 C 进程,我将所有数据交给它,让 C 进程使用 OpenMP 创建子进程来并行化代码。

I'm familiar with both Python and C multiprocessing, but I have never tried to run multiprocessing C scripts through Python. 那么我的问题是,从性能的角度来看,其中哪一个更可取,还有哪些我应该考虑的方面我没有在这里考虑?

先感谢您!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM