[问题] 多个矩阵做点对点乘法再相加怎样最快

楼主: 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