[問題] 多個矩陣做點對點乘法再相加怎樣最快

作者: doasgloria (青柳立夏)   2020-04-07 11:07:49
現在想要做的是
假設有矩陣 A,B,C,...J共約10個
要與同樣數量shape的矩陣a,b,c,...,j
每個shape大約是 (3500,2500,3)
做 A*a + B*b + C*c +...+ J*j
點對點相乘再全部加總
所以出來的結果也是一個(3500,2500,3)的矩陣
該怎麼做最快呢 @[email protected]"
type都是numpy array,嘗試了幾種方法
1. 直接使用np multiply方法再相+
當然這是最慢的, 要好多秒
2. 使用numexpr把"A*a+B*b+.."的算式寫在evaluate裡面
這個很強 快超多 大概30%以上 但還是不夠快
3. 使用Cupy
這個當然是最快的 可是存在一個問題
我把20個矩陣用cp.array()轉到cupy
計算完後用cp.asnumpy()轉回來
這兩個過程滿耗時的 加起來又比上面兩個慢了 Q.Q
目前嘗試了上面三種方法 都沒辦法達到理想的速度
假設在 i5-7400CPU , 16G記憶體 , 1050Ti的GPU上
有方法可以達到一秒鐘計算50次 甚至100次嗎 ??
希望版上的計算達人們指教還是小蛇的小魯 >///<
作者: TuCH (謬客)   2020-04-07 12:12:00
所以還差兩個數量級嗎?
作者: doasgloria (青柳立夏)   2020-04-07 12:36:00
沒有細算 但是用方法2 大概0.12秒做完一次理想的話 希望加快10倍 0.012秒一次就達到目標了 !
作者: watashino (我同學數學很爛)   2020-04-07 12:57:00
算法的部分直接轉成3d array,兩個乘完再按照第三個dimension加就好了吧,但可能在gpu上加速才有感
作者: LiloHuang (十年一刻)   2020-04-07 21:20:00
numba 可以試試
作者: napyang (愛唱歌的大男孩)   2020-04-08 17:53:00
推樓上的numba,速度真的快很多。
作者: mike0227 (我又小看了那複雜的世界)   2020-04-11 00:42:00
這運算是卡在頻寬 丟去GPU不會比較快 除非資料本來就在

Links booklink

Contact Us: admin [ a t ] ucptt.com