关于 python 并行计算的问题

2016-11-25 20:46:16 +08:00
 fffflyfish

大家好,这两天遇到一个运算速度的问题,就是我的程序是关于图像处理的,有的函数是要通过把一张图片的每个像素点扫描,然后计算一些值,比如这样一个场景:有一张画布,上面有 3 个元素,我现在要计算每个空白位置的像素点与这三个元素之间的最短距离,这样如果画布面积太大,就会导致算法运行时间过长,实测的话 800x600 的画布,将这个函数循环迭代 600 次,就得耗时 10 个小时+,所以我想通过并行计算来试试,因为目前的服务器配置是 8 核 E5 2650V3 的,感觉自己的程序只用到了一个核。但是关于这方面的知识我不是很懂,所以请教一下各位,谢谢!

3997 次点击
所在节点    Python
27 条回复
xujunfu
2016-11-25 20:47:45 +08:00
cuda mpi openmp
justou
2016-11-25 21:00:32 +08:00
这种问题用 GPU 算比 CPU 并行高效得多
比如 opengl 还有 1L 提到的 cuda, 都有 python 接口
zhuangzhuang1988
2016-11-25 21:17:42 +08:00
奇怪! 为何要循环做, 计算这个问题应该有数学方法直接解决的。。
sagaxu
2016-11-25 21:23:05 +08:00
自己搜索 python gil
fffflyfish
2016-11-25 21:25:34 +08:00
@justou 用的是阿里云服务器,貌似没看见有 GPU ,我想的是把一张图片切割然后分配到各个线程里去计算, cuda 的话感觉只是对矩阵运算的时候优势会大一点
fffflyfish
2016-11-25 21:33:24 +08:00
@zhuangzhuang1988 我这个问题就是来自一篇论文的函数,按照文章的说法,就是逐个像素的计算,我想的优化方法就是类似卷积神经网络里的汇聚层一样,但是现在是想先利用下当前服务器 8 核这个优势
fffflyfish
2016-11-25 21:33:57 +08:00
@sagaxu 看起来不错,谢谢
justou
2016-11-25 21:40:03 +08:00
哦, 我以为就用自己 PC 算...
上面打错了, 想写 opencl, 虽然 opengl 的计算着色器也能完成
图片就是一个矩阵, 放到显卡上, 每个计算单元计算一个像素跟三个元素的距离, 最后得到最短距离跟对应像素, 不需要任何循环
zhuangzhuang1988
2016-11-25 21:49:22 +08:00
如果没有 gpu
用 tbb 吧。。
这货参数配置得好,能让你的服务器爽死。。
fffflyfish
2016-11-25 22:19:38 +08:00
@zhuangzhuang1988 看起来不错,我研究下,谢谢!


@justou 嗯,我试试我本地的电脑可不可以,听起来有点厉害啊,我研究下吧,谢谢啦
stamaimer
2016-11-25 23:47:01 +08:00
我感觉你这个问题,写个多进程程序就能解决。
lll9p
2016-11-26 00:08:59 +08:00
想办法向量化啊, py 的循环多慢啊。。
tigerstudent
2016-11-26 00:12:54 +08:00
如果只是简单地改成多进程,也不过是将 10 小时缩短到一两个小时吧,效果并不太大。
henices
2016-11-26 11:45:21 +08:00
pool.map
stamaimer
2016-11-26 12:01:10 +08:00
@tigerstudent 你测试过了?
fffflyfish
2016-11-26 12:01:43 +08:00
@lll9p
@tigerstudent 嗯,还是要在算法方面想办法,图像逐像素处理确实不是一个长久的方法
Jblue
2016-11-26 20:16:54 +08:00
将三个图片等分,然后并行跑如何呢, pillow 优于 pil 。
fffflyfish
2016-11-26 22:20:49 +08:00
@Jblue 哈我用的就是 pillow ,这个方法我也想过,但是因为要求元素之间最短距离,分开的话就不知道怎么处理了,毕竟元素的位置分散在画布上
wjidea
2016-11-27 11:19:49 +08:00
multiprocessing
congeec
2016-11-27 13:41:33 +08:00
@fffflyfish 你用 pillow-simd 了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/323341

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX