为啥在这段代码中 CPU 运行速度比 GPU 快?

     2023-03-16     127

关键词:

【中文标题】为啥在这段代码中 CPU 运行速度比 GPU 快?【英文标题】:Why does CPU run faster than GPU in this code?为什么在这段代码中 CPU 运行速度比 GPU 快? 【发布时间】:2022-01-19 14:52:13 【问题描述】:

我正在尝试使用gpuArray 来加快我的计算速度。但是,下面的代码并非如此。

for i=1:10
    calltest;
end

function [t1,t2]=calltest
N=10;
tic
u=gpuArray(rand(1,N).^(1./[N:-1:1]));
t1=toc
tic
u2=rand(1,N).^(1./[N:-1:1]);
t2=toc
end

我在哪里

t1 =

   4.8445e-05


t2 =

   1.4369e-05

我有一块 Nvidia GTX850M 显卡。我是否错误地使用了gpuArray?这段代码被包裹在一个函数里面,这个函数被循环调用了上千次。

【问题讨论】:

请注意,timeit 将返回更可靠的结果。 您正在将最终结果复制到 GPU,这不是您想要的。你应该做类似u=gpuArray(rand(1,N)).^(1./gpuArray([N:-1:1]))); (untested) 查看gpuArray 文档。 实际上使用您建议的方法要慢得多。我编辑了代码,使用gpuArray 时,似乎循环和调用函数使其变慢!有什么想法吗? 将数据传输到 GPU 可能需要一些时间。您可以通过预先传输来仅计时计算时间。 【参考方案1】:

为什么?因为两者都有a) 小问题规模&b) 不是“数学密集”的 GPU 内核

比较的方法模糊了问题的根源

第 0 步:将数据集(向量)创建与被测部分分开:

N = 10;
R = rand( 1, N );
tic; < a-gpu-based-computing-section>; GPU_t = toc
tic; c = R.^( 1. / [N:-1:1] );         CPU_t = toc

第一步:测试缩放:

只尝试 10 个元素,不会使观察变得清晰,因为 开销天真 formulation of Amdahl Law 没有明确强调增加的时间,花费在基于 CPU 的GPU 内核组装和传输 +(CPU 到 GPU + GPU 到 CPU)数据处理阶段。如果与 a) 一个真正大规模的矢量/矩阵 GPU 内核处理(N ~10 显然不是 或b) 确实是“数学密集”的 GPU 内核处理,R.^() 显然不是 所以, 不要责怪 GPU 计算获得了必须做的部分(开销),因为如果没有这些先前的附加组件,它就无法正常工作(并且 CPU 可能在相同的时间内产生最终结果 - QED )

每个 CPU-GPU-CPU-工作流部分的细粒度测量:

N = 10;                                     %% 100, 1000, 10000, 100000, ..
tic; CPU_hosted     = rand( N, 'single' );  %% 'double'
CPU_gen_RAND        = toc

tic; GPU_hosted_IN1 = gpuArray( CPU_hosted );
GPU_xfer_h2d        = toc

tic; GPU_hosted_IN2 = rand( N, 'gpuArray' );
GPU_gen__h2d        = toc

tic; <kernel-generation-with-might-be-lazy-eval-deferred-xfer-setup>;
GPU_kernel_AssyExec = toc

tic; CPU_hosted_RES = gather( GPU_hosted_RES );
GPU_xfer_d2h        = toc

【讨论】:

您确定要在 GPU 上执行任何计算吗? 虽然我不确定,如果 MathWorks 实现测试生成的 GPU 内核是否有效地成为指令数据集上的 NOP/身份运算符,我很确定 a)b) 成立。然而,GPU 内核 + ( h2d & d2h ) 数据传输的代码相关和数据相关开销仍然存在。您的观点在系统上是正确的,而我怀疑(由于其巨大的计算成本)MathWorks 是否执行预测试,有效地预验证所有 GPU 内核确实在每个要输入的数据元素上输出一个标识(b4捷径 GPU-step) 你不是。 gpuArray 将东西放入 GPU。您的代码首先执行R.^( 1. / [N:-1:1] ),然后将结果放入GPU。你说的对,但你的代码错了

在 GPU 上训练比在 CPU 上慢得多 - 为啥以及如何加快速度?

】在GPU上训练比在CPU上慢得多-为啥以及如何加快速度?【英文标题】:TrainingonGPUmuchslowerthanonCPU-whyandhowtospeeditup?在GPU上训练比在CPU上慢得多-为什么以及如何加快速度?【发布时间】:2020-10-1802:30:50【问题描述】:我正在使用Goog... 查看详情

为啥在这段代码中向量比指针使用更少的内存?

】为啥在这段代码中向量比指针使用更少的内存?【英文标题】:whyvectoruselessmemorythanpointersinthiscode?为什么在这段代码中向量比指针使用更少的内存?【发布时间】:2015-05-2816:37:48【问题描述】:我使用指针编写了基于Strassen乘... 查看详情

为啥字典比列表快得多?

】为啥字典比列表快得多?【英文标题】:Whyisdictionarysomuchfasterthanlist?为什么字典比列表快得多?【发布时间】:2013-06-0309:10:47【问题描述】:我正在测试从DictionaryVS列表中获取数据的速度。我用这段代码测试过:internalclassProgr... 查看详情

写入 Linux 管道的速度比文件快,但在内核级别,为啥?

】写入Linux管道的速度比文件快,但在内核级别,为啥?【英文标题】:WritingtoLinuxpipefasterthanfile,butonakernellevel,why?写入Linux管道的速度比文件快,但在内核级别,为什么?【发布时间】:2020-12-3112:35:00【问题描述】:我正在研究... 查看详情

Google Colab 运行速度比 Jupyterlab 快,Google Colab 为啥以及如何运行?

】GoogleColab运行速度比Jupyterlab快,GoogleColab为啥以及如何运行?【英文标题】:GoogleColabisntrunningfasterthanJupyterLab,WhyandHowdoesGoogleColabfunction?GoogleColab运行速度比Jupyterlab快,GoogleColab为什么以及如何运行?【发布时间】:2021-11-0407:22:... 查看详情

为啥在 GPU 中执行方法的时间比在混合器项目中的 CPU 中执行的时间更多?

】为啥在GPU中执行方法的时间比在混合器项目中的CPU中执行的时间更多?【英文标题】:WhythetimetoexecuteamethodinGPUismorecomparetoinCPUinhybridizerprojects?为什么在GPU中执行方法的时间比在混合器项目中的CPU中执行的时间更多?【发布时间... 查看详情

为啥 OpenCV Gpu 模块的性能比 VisionWorks 快?

】为啥OpenCVGpu模块的性能比VisionWorks快?【英文标题】:WhyisOpenCVGpumoduleperformingfasterthanVisionWorks?为什么OpenCVGpu模块的性能比VisionWorks快?【发布时间】:2016-08-0114:15:21【问题描述】:我尝试了OpenCvgpu模块的几个功能,并将相同的... 查看详情

为啥这段代码的执行速度比预期的要快?

】为啥这段代码的执行速度比预期的要快?【英文标题】:Whyisthiscodeexecutingfasterthanexpected?为什么这段代码的执行速度比预期的要快?【发布时间】:2009-04-0314:49:20【问题描述】:我有这个代码:publicvoidreplay()longprevious=DateTime.Now... 查看详情

为啥 std::string_view 比 const char* 快?

】为啥std::string_view比constchar*快?【英文标题】:Whyisstd::string_viewfasterthanconstchar*?为什么std::string_view比constchar*快?【发布时间】:2020-02-0109:37:26【问题描述】:还是我在测量其他东西?在这段代码中,我有一堆标签(integers)。每... 查看详情

为啥tensorflow训练用gpu比cpu更慢了

最主要的可能是GPU的利用率不足。例如我的机器跑fashionmnist,GPU利用率只有3%左右,GPU比CPU慢一倍。参考技术A安装GPU版本的tensorflow就可以了pipinstall--upgrade还需要安装GPU加速包,下载CUDA和cuDNN的安装包了,注意版本号分别是CUDA8.0... 查看详情

为啥实体框架在直接选择语句中的执行速度比 Dapper 快 [关闭]

】为啥实体框架在直接选择语句中的执行速度比Dapper快[关闭]【英文标题】:WhyEntityFrameworkperformsfasterthanDapperindirectselectstatement[closed]为什么实体框架在直接选择语句中的执行速度比Dapper快[关闭]【发布时间】:2017-04-2310:06:56【问... 查看详情

训练某些网络时,GPU 上的 Keras(Tensorflow 后端)比 CPU 上慢

...似(CPU有时更快),而GPU在大型网络中更快。问题底部的代码在i7-6700k上运行时间为10 查看详情

为啥 arr = [] 比 arr = new Array 快?

】为啥arr=[]比arr=newArray快?【英文标题】:Whyisarr=[]fasterthanarr=newArray?为什么arr=[]比arr=newArray快?【发布时间】:2011-11-1413:32:00【问题描述】:我运行了这段代码,得到了以下结果。我很想知道为什么[]更快?console.time(\'using[]\')fo... 查看详情

为啥我经常在这段代码中得到 ExcBadAccess:

】为啥我经常在这段代码中得到ExcBadAccess:【英文标题】:WhyIoftengotExcBadAccessinthiscode:为什么我经常在这段代码中得到ExcBadAccess:【发布时间】:2014-03-2405:56:23【问题描述】:我使用ARCNSAttributedString*arString=[selfasSchedule:arTimes];self.... 查看详情

为啥 WebGL 比 Canvas 快?

】为啥WebGL比Canvas快?【英文标题】:WhyWebGLisfasterthanCanvas?为什么WebGL比Canvas快?【发布时间】:2015-05-0604:47:03【问题描述】:如果两者都使用硬件加速(GPU)来执行代码,为什么WebGL比Canvas更快?我的意思是,我想知道为什么在底... 查看详情

为啥我在这段代码中得到“未知类型名称 NSManagedObjectContext”?

】为啥我在这段代码中得到“未知类型名称NSManagedObjectContext”?【英文标题】:whyamIgettingan"unknowntypenameNSManagedObjectContext"inthiscode?为什么我在这段代码中得到“未知类型名称NSManagedObjectContext”?【发布时间】:2011-03-3007:... 查看详情

为啥在这个例子中 PyCUDA 比 C CUDA 快

】为啥在这个例子中PyCUDA比CCUDA快【英文标题】:WhyPyCUDAisfasterthanCCUDAinthisexample为什么在这个例子中PyCUDA比CCUDA快【发布时间】:2021-05-3107:20:17【问题描述】:我正在探索从OpenCL迁移到CUDA,并进行了一些测试来衡量CUDA在各种实现... 查看详情

为啥 OpenCV GPU CUDA 模板匹配比 CPU 慢很多?

】为啥OpenCVGPUCUDA模板匹配比CPU慢很多?【英文标题】:WhyisOpenCVGPUCUDAtemplatematchingsomuchslowerthanCPU?为什么OpenCVGPUCUDA模板匹配比CPU慢很多?【发布时间】:2022-01-1902:40:12【问题描述】:我已经编译了最新的可用OpenCV4.5.4版本,以与... 查看详情