Re: [讨论] Python 3.10将加入Switch-Case语句

楼主: Muscovy (三分熟的闹钟)   2021-03-28 00:20:24
※ 引述《Muscovy (三分熟的闹钟)》之铭言:
一回神竟然引发这些有趣的讨论.
来稍微介绍一下我的工作背景: 我是在上市公司做高效能运算的单位主管.
算什么无聊东西就不要问了, 不过特别强调, 不是博弈或者加密货币. :D
我的一个 block 通常会吃掉 100%~500% CPU, 生命期介于 2~48 hours.
执行阶段占用内存大概是 20GB~30GB 之间, 偶尔会用到 memory map.
再长的话不敢做, 会分段跑, 因为 windows 会当. XD
(MacOS 稳定一百倍, 但是公司不配发, 所以... )
因此, 我想我比绝大部分的人更在意“运算效能的问题”.
在我的例子里面, 每个循环执行的时间不会低于三十分钟.
所以这些 iteration 本身的 overhead 不是问题, 因为都是毫秒级.
但是如果你关心效能的话, 拆出一堆 for-loop 才是正确的写法.
因为这种写法“对于效能”最大的好处是平行化.
怎么平行化? 几个 for-loop 就拆几只程式跑啊, 简单得很.
接下来讲的就比较难一点.
加速最重要的其实是 cache utilization.
其次是 pipeline utilization.
这种 instruction level optimization, 很重要.
我给各位一个大概的概念...
cache utilization 做得最好与最差, 执行效率大约 x50~x100 倍.
pipeline utilization 的话, 几层 pipeline 就是几倍.
反观你的 CPU 辛辛苦苦买到 12 核心, 全占满大约加速 4~5 倍.
把 12 核通通算到过热它还会降频跑, 又更慢了, 你看多废.
然后 instruction level optimization 的部分.
教科书一开始就会说:
1.) data layout & access pattern 很重要.
2.) 循环里面不要放 branch.
因为 principle 1.) 顾 cache, principle 2.) 顾 pipeline.
当然 python 本身很难做到这件事.
不过你可以去找 hardware accelerated library.
最知名的就是 tensorflow + GPGPU.
tensorflow 这咚咚不只能做 AI, 它也是高效能的线代运算核心.
一样, 为了顾效能, 你也会把自己搞成这种写法. XD
:
作者: yislin (YiieSt2310)   2021-03-28 00:31:00
推解释详细
作者: x9060000456 (你好)   2021-03-28 00:32:00
作者: yislin (YiieSt2310)   2021-03-28 00:37:00
好奇请教一下,如果舍弃 for loop,改成将 subarray 传递至 function,而后再回传,如此一来在优化上是否更好做?再多问些,如果再加上 map 呢
作者: alihue (wanda wanda)   2021-03-28 00:42:00
如果你前提是每个 for-loop 拆出程式分开跑当然效能好
楼主: Muscovy (三分熟的闹钟)   2021-03-28 00:43:00
@yislin, 你给的条件对我来说比较像是维护性的问题.
作者: alihue (wanda wanda)   2021-03-28 00:43:00
,但前篇文章前提是同支程式。此外并不是讲职称就能把你的话直接变成正解,技术要合理才能。
楼主: Muscovy (三分熟的闹钟)   2021-03-28 00:44:00
@alihue, 其实我只是“从效能的观点”来说... XD
作者: alihue (wanda wanda)   2021-03-28 00:45:00
我自己也在每天几千 QPS 的系统工作,但我不会认为我是正解
楼主: Muscovy (三分熟的闹钟)   2021-03-28 00:45:00
从维护性来说, 我的经验也告诉我, for + if 少用为妙.因为出错的时候真的很难 debug, 尤其一群猴子合作的情况对, 我就是说我们的团队... XD
作者: paimin (playl)   2021-03-28 01:17:00
我们都直接买64 core的给大家跑 优化有空再做就好了
作者: taipoo (要成功要积极)   2021-03-28 01:39:00
作者: handsomeLin (DoGLin)   2021-03-28 10:53:00
如果要拆来跑的话当然是拆开for loop跟preprocessing的概念是一样意思,但是这样跟用不用if在for loop里scope就完全不同了
作者: Murasaki0110 (麦当劳欢乐送)   2021-03-28 10:59:00
没平行的时候硬要这样写就是慢啊你前提是平行那也没讨论if的必要
作者: majohnsha (不理不理)   2021-03-28 12:27:00
台湾主管真敢讲 说自己团队是猴子真好奇哪家上市公司
作者: recorriendo (孟新)   2021-03-28 13:33:00
看起来你的loop顺序不影响结果 那直接做data parallel 有几个entry就拆成几个job 不是更快?
作者: j0958322080 (Tidus)   2021-03-28 18:13:00
搞不好人家只是谦虚而已
楼主: Muscovy (三分熟的闹钟)   2021-03-29 00:49:00
不是谦虚! 而是... 薪水用乡民的眼光看, 真的是香蕉等级data parallelism 是其中的部分考量而已.而且运算量大的时候, 常见的拆法也不能用.因为通常也会伴随 bandwidth 的问题.bandwith “不足”... 漏写.bandwidth........一直打错.
作者: vi000246 (Vi)   2021-03-29 11:54:00
同意越接近数学越好维护
作者: shooter555 (shooter)   2021-03-29 12:47:00
指令集的问题就变成要看指令集提供哪些运算了 看可以一次运算几个byte 再来拆loop 毕竟很多余数特例不过讲到这个就要完全舍弃可维护性了 在加速部份每个循环运行的时间不低于三十分钟 那的确可以舍弃掉展开的时间了但如果这个function是不到一毫秒执行一次可能会有差平行化也不是这么好用 毕竟还要考虑到race condition三十分钟这么长的确可以拆几个thread来跑 但必须确保些来的资源不共用 或要另外lock
作者: ShenJing (ShenJing)   2021-03-30 01:18:00
推解释,有所收获
作者: loggan (小小生)   2021-03-30 11:43:00
有问有人知道内文提到的教科书是?
作者: s0914714 (YA)   2021-03-30 17:25:00
如果那么在意效能应该是不要用(原生的)Python

Links booklink

Contact Us: admin [ a t ] ucptt.com