我在理解CUDA同步调用时遇到了一些麻烦。从我个人的理解nvprof
输出,我们的GPU程序的运行时由两部分组成 GPU内核运行时和 CUDA API运行时,我们有
Total Runtime = GPU Kernel Runtime + CUDA API Runtime
但是,假设我们有一个大内核A
和一个小内核B
。很明显,A
的GPU内核时间将大于B
。但是cudaDeviceSynchronize
电话的时间呢?与A
相比,始终保证B
会花更多时间同步吗?哪些因素决定了cudaDeviceSynchronize
来电的长度?
很抱歉,但我想澄清一下我的问题:假设我们有以下程序:
float * a, b, c; time_T tic, toc, t_A, t_B;
tic = time();
kernel_A <<< ... >>> (a, b, c);
cudaDeviceSynchronize();
toc = time(); t_A = toc - tic;
tic = time()
kernel_B <<< ... >>> (a, b, c);
cudaDeviceSynchronize();
toc = time(); t_B = toc - tic;
我们假设kernel_B
元素计算c = a + b
和kernel_A
执行相同的操作,但10
次迭代除外。
显然,从我们的角度来看,与kernel_A
(即kernel_B
)相比,t_A > t_B
应该执行更长的时间。 问题是,为什么执行kernel_A
需要更长的时间?
根据nvprof
给出的运行时公式,其中指出Total Runtime = GPU Kernel Runtime + CUDA API Runtime
,有三种可能的解释:
kernel_A
的{{1}}更长。GPU Kernel Runtime
的{{1}}更长(kernel_A
)。CUDA API Runtime
在两个组件中都较长。答案 0 :(得分:-1)
Cuda在执行时不会等待内核的执行。当你调用内核时,你只需要GPU启动内核。当您使用cudaSyncronize时,您只需等待GPU或CPU完成执行,这样他们就可以在您调用cudaSyncronize的行上进行会面。
回到你的问题: 更长的内核需要更长的时间来同步,因为内核执行需要更长的时间,因为你没有在CPU上做任何其他事情。因此,如果在启动内核后在CPU上执行某些工作,则较短的内核可能需要更长的时间来进行同步。