是什么决定了CUDA同步调用的长度?

时间:2018-05-04 04:10:57

标签: cuda nvprof

我在理解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 + bkernel_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在两个组件中都较长。

1 个答案:

答案 0 :(得分:-1)

Cuda在执行时不会等待内核的执行。当你调用内核时,你只需要GPU启动内核。当您使用cudaSyncronize时,您只需等待GPU或CPU完成执行,这样他们就可以在您调用cudaSyncronize的行上进行会面。

回到你的问题: 更长的内核需要更长的时间来同步,因为内核执行需要更长的时间,因为你没有在CPU上做任何其他事情。因此,如果在启动内核后在CPU上执行某些工作,则较短的内核可能需要更长的时间来进行同步。