定时CUDA流

定时CUDA流,cuda,Cuda,我在理解此代码(在非Hyper-Q兼容的GPU上运行)时遇到一些问题: 检查(cudaEventRecord(start,0)); //按深度优先顺序分派作业 对于(int i=0;i

我在理解此代码(在非Hyper-Q兼容的GPU上运行)时遇到一些问题:

检查(cudaEventRecord(start,0));
//按深度优先顺序分派作业
对于(int i=0;i
整个程序也可以找到

问题是:在计算运行时间之前,我们如何确保所有其他内核都已完成


非空流和其他启动的流之间似乎没有任何同步。即使stop事件是队列中的最后一个事件,根据我的理解,似乎有可能来自其他流的其他内核仍在运行。

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

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

换句话说,默认非空流中的事件在所有流中的所有先前操作完成后完成

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);