我正在尝试通过使用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