sys*_*ult 5 python parallel-processing multithreading multiprocessing
我有一个应用程序,它有 3 个主要功能,目前正在按顺序运行:
1)将数据加载到内存并对其进行预处理。
2)使用GPU和theano对数据执行一些计算。
3)监视GPU上的计算状态并将其打印到屏幕上。
这 3 个功能可以通过使用多线程实现并行化。但在 python 中,我按顺序执行所有这三个功能。部分原因是过去我在 Python 多线程和 GIL 问题上运气不佳。
在这种情况下,我不一定需要利用手头的多 CPU 的全部功能。我想做的就是在 GPU 上执行计算的同时加载数据并对其进行预处理,同时监视计算的状态。目前,大多数耗时的计算都是在 2) 处执行的,因此我在 2) 处的操作有点受时间限制。现在我的问题是:
*Python 可以并行化这 3 个操作而不产生新的瓶颈,例如:由于 GIL 问题。
*我应该使用多处理而不是多线程吗?
简而言之,如果我应该在 Python 中并行化这三个操作,应该如何并行化。
自从我上次为 CPU(尤其是 python)编写多线程代码以来已经有一段时间了,任何指导将不胜感激。
编辑:错别字。
GIL 有时有点麻烦......
其中很多内容都围绕如何使用 GPU 展开。您使用的 API 是否允许您将其设置为运行,然后执行其他操作,偶尔轮询以查看 GPU 是否已完成?或者它可以引发一个事件,调用回调或类似的东西?
我从你的问题中感觉到答案是否定的......在这种情况下,我怀疑你唯一的选择(假设你正在使用Python)是多重处理。如果答案是肯定的,那么您可以启动 GPU,然后同时进行一些预处理和绘图,然后检查 GPU 是否已完成。
我不太了解 Python 或它如何进行多重处理,但我怀疑它涉及序列化和复制进程之间发送的数据。如果您正在处理的数据量很大(我建议担心 100 兆字节的标记。尽管这只是一种预感),那么您可能希望考虑在序列化和复制该数据时损失了多少时间。如果您不喜欢该分析的答案,那么就使用 Python 而言,您可能不走运。
你说最耗时的部分是GPU处理?想必其他两个部分相当长,否则尝试并行它们就没有什么意义了。例如,如果 GPU 占用了 95% 的运行时间,那么通过并行其余部分来节省 5% 似乎就不值得了。