Machine learning 为什么我的CPU做矩阵运算比GPU快?

Machine learning 为什么我的CPU做矩阵运算比GPU快?,machine-learning,deep-learning,gpu,mxnet,Machine Learning,Deep Learning,Gpu,Mxnet,当我试图验证GPU是否在CPU上执行矩阵运算时,我得到了意想不到的结果。根据我的经验结果,CPU的性能比GPU好,这让我感到困惑 我用cpu和gpu分别做矩阵乘法,编程环境是MXNet和cuda-10.1 使用gpu: import mxnet as mx from mxnet import nd x = nd.random.normal(shape=(100000,100000),ctx=mx.gpu()) y = nd.random.normal(shape=(100000,100000),

当我试图验证GPU是否在CPU上执行矩阵运算时,我得到了意想不到的结果。根据我的经验结果,CPU的性能比GPU好,这让我感到困惑

我用cpu和gpu分别做矩阵乘法,编程环境是MXNet和cuda-10.1

使用gpu:

import mxnet as mx
from mxnet import nd
x = nd.random.normal(shape=(100000,100000),ctx=mx.gpu())
y = nd.random.normal(shape=(100000,100000),ctx=mx.gpu())
%timeit nd.dot(x,y)
每个回路50.8µs±1.76µs(7次运行的平均值±标准偏差,每个10000个回路)

使用cpu时:

x1 = nd.random.normal(shape=(100000,100000),ctx=mx.cpu())
y1 = nd.random.normal(shape=(100000,100000),ctx=mx.cpu())
%timeit nd.dot(x1,y1)
每个回路33.4µs±1.54µs(7次运行的平均值±标准偏差,每个10000个回路)


为什么CPU速度更快?我的CPU型号是i5-6300HQ,GPU型号是Nividia GTX 950M。

我不知道您正在使用的模块,但您的CPU可以更快地访问内存,还可以在缓存中保存大量内容。GPU将数据加载到GPU内存的时间更长,从CPU调用数据的时间也更长。 这总是GPU计算的缺点。当您可以将大量数据加载到GPU内存中时,很有可能会更快。
顺便说一句,这就是为什么深度学习框架可以成批工作。当你不能处理批处理时,我总是使用CPU。您还可以通过多处理提高性能。

TLDR:您的矩阵乘法实际上没有运行:)

MXNet是一个异步框架,它将工作请求堆积在一个队列中,该队列根据其执行引擎的运行需求进行异步处理。因此,您测量的只是发送请求所花费的时间,而不是执行请求所花费的时间。这就是为什么它如此之小(100k*100k矩阵上的微秒速度会惊人地快)并且对于CPU和GPU来说大致相等。要强制执行,您需要添加一个强制生成结果的调用,例如
print
nd.dot(x,y)。wait To read()
。在这里可以看到与基准测试非常相似的代码

额外意见:

  • 使用GPU与CPU的好处在于 并行机会。对于简单的任务,这种收益可能很小 不存在。CPU核心频率实际上要大2到3倍 超过GPU频率(您的i5-6300HQ可以提供2.3GHz和3.2GHz的提升 能力,而你的GTX 950M做0.9GHz与1.1GHz的增强能力)

  • MXNet ndarray(1)异步范式优化了计算顺序(2),它的C++后端并行运行,(3)默认MxNETBug与英特尔MKL一起,大大提高了英特尔CPU的代数容量。 (). 例如,与Numpy相比,它在GPU上在同一API中运行compute的能力也是一大优势

  • 我认为您的测试不会在GPU上运行:在GPU上实例化如此大的矩阵 NVIDIA Tesla V100(16GB男性,比GTX 950M多4倍)在一个 “大张量误差”


  • 首先谢谢你。但正如您所见,在前两个代码执行后,x和y、x1和y1已经存在于CPU/GPU内存中,因此我认为我只对矩阵乘法运算进行了计时,加载时间不包括在内。这不是这种情况的根本原因,请参见下面的答案:)正如您所建议的,我使用nd.dot(x,y).等待读取并将矩阵形状更改为1000*1000,从结果可以看出GPU所需的时间比我的CPU少。非常感谢!