我想知道多少GPU计算可以帮助我加快模拟速度。
我的代码的关键部分是矩阵乘法。基本上代码看起来像下面的python代码,矩阵为1000,循环为。
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)
注意:我的矩阵很密集,大多是随机的,循环是用cython编译的。
我天真的猜测是我有两个因素:
我希望这种观点是天真的,所以我错过了什么?
答案 0 :(得分: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 - how much slower is transferring over PCI-E?
给定矩阵大小,您实际上可以分别计算出计算和数据传输的绝对时间。这些可以帮助您更好地评估性能。
为了最大限度地提高GPU的性能,您可能需要重新设计程序以最小化数据传输,方法是将所有计算操作移至GPU,而不是仅使用矩阵乘法。
答案 1 :(得分:6)
一般来说,GPU在高度并行的简单任务(这就是它们的用途)上比CPU快得多,比如乘以大矩阵,但GPU计算会出现一些问题:
因此,虽然乘法本身可能会快100倍(或更多),但实际上可能会遇到更小的加速甚至减速
GPU存在更多问题"愚蠢"与分支代码大幅减速等CPU相比,必须手工处理缓存以及其他可能使GPU编写快速程序的CPU非常具有挑战性。
答案 2 :(得分:3)
使用opencl api,我在1280核HD7870(甚至不是主流桌面级gpu)上尝试了8k X 8k 8k X 8k乘法,花了大约0.99秒,这意味着大约有5400亿次增加和5400亿次乘法表示1.1 Tflops(其广告中的峰值的40%表示)。高端台式机CPU只有0.2 - 0.3 Tflops(峰值),不包括它们的集成gpus。所以最好的cpus甚至无法达到每瓦性能和性能以及每美元性能的低中等GPU。
表现的关键选项:
优化硬件差异
使用包含1到4