加速GPU与CPU进行矩阵运算

phy*_*Guy 6 python gpu gpgpu matrix-multiplication

我想知道多少GPU计算可以帮助我加快模拟速度.

我的代码的关键部分是矩阵乘法.基本上代码看起来像下面的python代码,矩阵为1000,循环为long.

import numpy as np
m_size = 1000
sim_length = 50

a = np.random.rand(m_size, m_size)
b = np.random.rand(m_size, m_size)

for j in range(sim_length):
    result = np.dot(a,b)
Run Code Online (Sandbox Code Playgroud)

注意:我的矩阵很密集,大多数是随机的,循环是用cython编译的.

我天真的猜测是我有两个因素:

  • 更多并行线程(目前订购1个线程,订单100个线程的GPU?) - >订单加速100?[ 来源已经过时,从2011年开始]
  • 较低的处理器频率(目前3Ghz,GPU通常为2 Ghz) - >忽略

我希望这个观点是天真的,所以我错过了什么?

kan*_*yin 8

矩阵乘法性能

如果您使用numpy,您可能正在使用其中一个BLAS库作为计算后端,例如ATLAS,OpenBLAS,MKL等.当您使用最快的MKL时,您可以在最近的Nvidia GPU之间找到最近的性能基准K40m和Intel Xeon 12核E5-2697 v2 @ 2.70GHz

https://developer.nvidia.com/cublas

其中K40m比12线程E5-2697快6倍.考虑到MKL在多核CPU上可以很好地扩展.K40m比单线程E5-2697快约72倍.请注意,1000-dim几乎是充分利用GPU和CPU的下限.较小的矩阵大小通常会导致GPU上的性能降低.

如果你使用较慢的BLAS后端numpy,比如GNU授权的ATLAS.然后你可以在这里找到MKL和ATLAS之间的比较

https://software.intel.com/en-us/intel-mkl/benchmarks#DGEMM-ATLAS

其中MKL比ATLAS快2~4倍.

对于Nvidia GPU,唯一广泛使用的后端是CUDA的cuBLAS,所以性能不会像ATLAS和MKL那样改变很多.

数据传输

正如@janbrohl所说,主机RAM和GPU设备内存之间的数据传输是影响整体性能的重要因素.这是数据传输速度的基准.

CUDA - 通过PCI-E传输速度有多慢?

给定矩阵大小,您实际上可以分别计算出计算和数据传输的绝对时间.这些可以帮助您更好地评估性能.

为了最大限度地提高GPU的性能,您可能需要重新设计程序以最小化数据传输,方法是将所有计算操作移至GPU,而不是仅使用矩阵乘法.


jan*_*ohl 6

一般来说,GPU在高度并行的简单任务(这就是它们的用途)上比CPU快得多,比如乘以大矩阵,但GPU计算会遇到一些问题:

  • 在普通RAM和图形RAM之间传输数据需要时间
  • 加载/启动GPU程序需要一些时间

因此,虽然乘法本身可能会快100倍(或更多),但实际上可能会遇到更小的加速甚至减速

与CPU相比,GPU更加"愚蠢",比如分支代码大幅减速,不得不手工处理缓存以及其他可能使GPU编写快速程序的问题非常具有挑战性.


hus*_*sik 5

使用opencl api,我在1280核HD7870(甚至不是主流桌面级gpu)上尝试了8k X 8k x 8k X 8k乘法,花费了大约0.99秒,这意味着大约5400亿次加法和5400亿次乘法,这也意味着1.1 Tflops (其广告中称其峰值的40%)。高端桌面级 CPU 不包括集成 GPU,只有 0.2 - 0.3 Tflops(峰值)。因此,最好的 cpu 在性能、每瓦性能和每美元性能方面甚至无法达到中低端 GPU。

性能的关键选项:

  • 以 32x32 或 48x48 等补丁进行计算(对于具有一组线程的每个计算单元,因此每个线程计算补丁的一部分或列/行的所有补丁的总和)
  • 像斯特拉森算法那样以指数级更快的方式进行。
  • 管道化读取、写入和计算操作,以便连续迭代能够获得收益。
  • 针对硬件差异进行优化

  • 使用具有 1 到 4 选项的库