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