定时CUDA流

时间:2015-06-27 18:33:39

标签: cuda

我在理解这段代码时遇到了一些麻烦(在非Hyper-Q兼容的GPU上运行):

CHECK(cudaEventRecord(start, 0));

// dispatch job with depth first ordering
for (int i = 0; i < n_streams; i++)
{
    kernel_1<<<grid, block, 0, streams[i]>>>();
    kernel_2<<<grid, block, 0, streams[i]>>>();
    kernel_3<<<grid, block, 0, streams[i]>>>();
    kernel_4<<<grid, block, 0, streams[i]>>>();
}

// record stop event
CHECK(cudaEventRecord(stop, 0));
CHECK(cudaEventSynchronize(stop));

// calculate elapsed time
CHECK(cudaEventElapsedTime(&elapsed_time, start, stop));
printf("Measured time for parallel execution = %.3fs\n",
       elapsed_time / 1000.0f);

也可以找到整个程序here

问题是:在计算经过的时间之前,我们怎样才能确定所有其他内核是否完整?

在非Null流和其他已启动的流之间似乎没有任何同步。即使stop事件是队列中的最后一个,基于我的理解,其他流中的其他内核似乎仍然可以运行。

1 个答案:

答案 0 :(得分:2)

我在专业CUDA C编程中找到答案:

  

默认流上指定的事件适用于所有CUDA流中的所有先前操作。

换句话说,在所有流中的所有前面的操作完成之后,默认的非NULL流中的事件就完成了。