为什么在这段代码中,CPU运行得比GPU快? [英] Why does CPU run faster than GPU in this code?

查看:0
本文介绍了为什么在这段代码中,CPU运行得比GPU快?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用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?此代码包装在一个函数中,该函数被循环调用数千次。

推荐答案

为什么?
因为
a)小问题规模
&
b)不是"数学密集"的图形处理器内核

比较方法模糊了问题的根本原因

第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

第1步:测试伸缩:

只尝试10个元素不会让观察结果变得清晰,因为简单的formulation of Amdahl Law没有明确强调额外的时间,即花费在基于CPU的GPU内核组装和传输+(CPU到GPU+GPU到CPU)数据处理阶段的时间。如果与
相比,这些附加阶段可能会变得微不足道 a)确实是大规模的向量/矩阵GPU内核处理,N~10显然不是

b)确实是"数学密集型"的GPU内核处理,R.^()显然不是
因此,
不要责怪GPU计算获得了一个必须完成的部分(管理费用),因为如果没有这个先前的附加组件,它就无法及时开始工作(CPU可能会在相同的时间内产生最终结果-Q.E.D.)

每个CPU-GPU-CPU-WORKLOW部分的细粒度测量:

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

这篇关于为什么在这段代码中,CPU运行得比GPU快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆