我的应用程序有3个主要功能,目前正在按顺序运行:
1)将数据加载到内存并对其执行预处理。
2)使用带有theano的GPU对数据执行一些计算。
3)监控GPU上的计算状态并将其打印到屏幕上。
这三个功能通过使用多线程令人尴尬地可并行化。但是在python中,我依次执行所有这三个功能。部分是因为过去我在Python多线程和GIL问题上运气不好。
在这种情况下,我不一定需要利用多CPU的全部功能。我想要做的就是,在执行GPU计算时加载数据并预处理它们,同时监视计算的状态。目前大多数耗时的计算都是在2)执行的,所以我在2)的操作上有时间限制。现在我的问题是:
* python可以并行化这3个操作而不会产生新的瓶颈,例如:由于GIL问题。
*我应该使用多处理而不是多线程吗?
简而言之,如果我应该在Python中,应该如何并行化这三个操作。
自从我上次为CPU编写多线程代码(特别是对于python)以来已经有一段时间了,任何指导都将受到赞赏。
编辑:错别字。
答案 0 :(得分:2)
GIL有时会有点麻烦......
很多内容都围绕着如何使用GPU。您使用的API是否允许您将其设置为运行然后关闭并执行其他操作,偶尔轮询以查看GPU是否已完成?或者也许它可以引发一个事件,召唤一个回调或类似的东西?
我从你的问题中感觉到答案是否定的......在这种情况下,我怀疑你唯一的选择(鉴于你使用的是Python)是多重处理。如果答案是肯定的,那么你可以从GPU开始,然后在此期间进行一些预处理和绘图,然后检查GPU是否已经完成。
我不太了解Python或它如何进行多处理,但我怀疑它涉及序列化和复制在进程之间发送的数据。如果您正在处理的数据量很大(我建议担心100兆字节标记。虽然这只是预感),但您可能希望考虑序列化和复制数据所花费的时间。如果您不喜欢该分析的答案,那么就使用Python而言,您可能会感到非常幸运。
你说最耗时的部分是GPU处理吗?据推测,其他两个部分相当冗长,否则试图将它们并行化将毫无意义。例如,如果GPU是运行时的95%,那么通过并行化其余部分节省5%几乎不值得。