矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 794|回复: 8

测试不同矩阵乘法的效率

[复制链接]
     
发表于 2024-10-10 10:47:44 | 显示全部楼层 |阅读模式
本帖最后由 Aline744 于 2024-10-10 11:11 编辑

CPU = E52630V4  GPU = K40C
可以看出,python里直接用循环计算矩阵乘法效率极其低下,用多线程速度不升反降,原因是python的多线程不是真正的多线程,并不能充分利用CPU性能。使用numpy和cupy显然能大幅度提升速度。由于cupy是GPU上的库,因此在小规模运算时比numpy慢一些。另外cupy似乎还有一个启动时间,第一次运行明显很慢。
  1. import time
  2. import numpy as np
  3. import cupy as cp
  4. import matplotlib.pyplot as plt
  5. from threading import Thread as TH

  6. arr_size = 12
  7. time_libFree = []
  8. time_multiTh = []
  9. time_np = []
  10. time_cp = []
  11. if_cal_1 = True
  12. if_cal_2 = True

  13. def task(a, b, c, x, y):
  14.     for index in range(arr_size):
  15.         c[x][y] += a[x][index] * b[index][y]

  16. for iter in range(120):
  17.     arr_size = 50*iter

  18.     a = np.random.rand(arr_size, arr_size)
  19.     b = np.random.rand(arr_size, arr_size)

  20.     #矩阵乘法耗时测试
  21.     #只用循环
  22.     t1 = time.time()
  23.     c = np.zeros((arr_size, arr_size))
  24.     if if_cal_1:  #循环做矩阵乘法,耗时相当长,因此当时间过长时不再计算此项
  25.         for x in range(arr_size):
  26.             for y in range(arr_size):
  27.                 for index in range(arr_size):
  28.                     c[x][y] += a[x][index] * b[index][y]
  29.         time_libFree.append(time.time() - t1)
  30.     else :
  31.         time_libFree.append(time_libFree[-1])

  32.     if time_libFree[-1] > 10:
  33.         if_cal_1 = False

  34.     #多线程
  35.     t1 = time.time()
  36.     c = np.zeros((arr_size, arr_size))
  37.     index = 0
  38.     if if_cal_2:  #循环做矩阵乘法,耗时相当长,因此当时间过长时不再计算此项
  39.         for x in range(arr_size):
  40.             for y in range( int(arr_size / 5) ):
  41.                 th1 = TH(target = task, args = (a, b, c, x, 5 * y + 0))
  42.                 th2 = TH(target = task, args = (a, b, c, x, 5 * y + 1))
  43.                 th3 = TH(target = task, args = (a, b, c, x, 5 * y + 2))
  44.                 th4 = TH(target = task, args = (a, b, c, x, 5 * y + 3))
  45.                 th5 = TH(target = task, args = (a, b, c, x, 5 * y + 4))

  46.                 th1.start()
  47.                 th2.start()
  48.                 th3.start()
  49.                 th4.start()
  50.                 th5.start()

  51.                 th1.join()
  52.                 th2.join()
  53.                 th3.join()
  54.                 th4.join()
  55.                 th5.join()

  56.         time_multiTh.append(time.time() - t1)
  57.     else :
  58.         time_multiTh.append(time_multiTh[-1])

  59.     if time_multiTh[-1] > 10:
  60.         if_cal_2 = False

  61.     #numpy
  62.     t1 = time.time()
  63.     c = np.matmul(a, b)
  64.     time_np.append(time.time() - t1)

  65.     #cupy
  66.     a = cp.random.rand(arr_size, arr_size)
  67.     b = cp.random.rand(arr_size, arr_size)
  68.     t1 = time.time()
  69.     c = cp.matmul(a, b)
  70.     time_cp.append(time.time() - t1)

  71.     print(iter)

  72. plt.subplot(2, 1, 1)
  73. plt.plot(time_libFree, label = "libFree")
  74. plt.plot(time_multiTh, 'g', label = "multiTh")
  75. plt.plot(time_np, 'r', label = "np")
  76. plt.legend( )
  77. plt.xlabel('array_size(x50)')
  78. plt.subplot(2, 1, 2)
  79. plt.plot(time_np, label = "np")
  80. plt.plot(time_cp, 'r', label = "cp")
  81. plt.legend( )
  82. plt.xlabel('array_size(x50)')

  83. plt.show()
复制代码
Figure_1.png
     
发表于 2024-10-10 11:01:13 | 显示全部楼层
很正常,Python本身就是库(Native Lib)的模式来加速
回复 支持 反对

使用道具 举报

发表于 2024-10-10 11:33:09 来自手机 | 显示全部楼层
脚本还谈效率啊?要效率就矩阵模版库,C++的一大堆网上,而且大部分免费
回复 支持 反对

使用道具 举报

     
发表于 2024-10-10 14:40:08 | 显示全部楼层
要效率时,谁还会用原生python写啊,不都是调用高性能的c/c++库吗。
回复 支持 反对

使用道具 举报

     
发表于 2024-10-10 15:27:24 | 显示全部楼层
这就是 Python 的成功之处,自己只关心简单灵活好用,把苦力活留给 C/C++ 库去做。
回复 支持 反对

使用道具 举报

发表于 2024-10-10 17:55:39 | 显示全部楼层
脚本都是调用库,就这都差远了。渲染一张图片的测试。
render.jpg
回复 支持 反对

使用道具 举报

     
发表于 2024-10-11 09:27:44 | 显示全部楼层
你了解一下解释语言的底层机制,你就不会想在解释语言中写算法了
回复 支持 反对

使用道具 举报

     
发表于 2024-10-11 09:57:02 | 显示全部楼层
这里都是码农中的高手,为什么不和Matlab也比一下呢?是不是大家都不用它?
回复 支持 反对

使用道具 举报

发表于 2024-10-11 14:50:58 来自手机 | 显示全部楼层
dabfxz 发表于 2024-10-11 09:57
这里都是码农中的高手,为什么不和Matlab也比一下呢?是不是大家都不用它?

教学用就是教学用,易用程度被脚本甩出去8条街,效率被命令式语言甩出去8条街,价格被免费和商用SDK甩出银河系…
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 22:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表