Machine learning 为什么我的CPU做矩阵运算比GPU快?
当我试图验证GPU是否在CPU上执行矩阵运算时,我得到了意想不到的结果。根据我的经验结果,CPU的性能比GPU好,这让我感到困惑 我用cpu和gpu分别做矩阵乘法,编程环境是MXNet和cuda-10.1 使用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),
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()
。在这里可以看到与基准测试非常相似的代码
额外意见:
首先谢谢你。但正如您所见,在前两个代码执行后,x和y、x1和y1已经存在于CPU/GPU内存中,因此我认为我只对矩阵乘法运算进行了计时,加载时间不包括在内。这不是这种情况的根本原因,请参见下面的答案:)正如您所建议的,我使用nd.dot(x,y).等待读取并将矩阵形状更改为1000*1000,从结果可以看出GPU所需的时间比我的CPU少。非常感谢!