为什么在此代码中 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(不是
"数学密集"的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

第 1 步:测试缩放:

只尝试 10 个元素,不会让观察变得清晰,因为阿姆达尔定律的开销幼表述并没有明确强调在基于 CPU 的 GPU 内核组装和传输 +(CPU 到 GPU + GPU 到 CPU(数据处理阶段所花费的额外时间。这些附加阶段可能会变得微不足道,如果与 a( 确实大规模的矢量/矩阵 GPU 内核处理相比,N
~10 显然不是

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

根据每个 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

相关内容

最新更新