我在主机功能中创建cudaStream
void callKernel(cudaStream_t* ptrStream)
{
kernelDoesNotMatter<<<1,12,0,*ptrStream>>>();
//Here i am not calling cudaStreamSynchronize
}
void host_func()
{
cudaStream_t stream;
cudaStreamCreate(&stream);
callKernel(&stream);
cudaError_t err = cudaStreamQuery(stream) //err == cudaSuccess?
}
在这里,我在调用callKernel方法中的内核后没有调用cudaStreamSynchronize()为什么cudaStreamQuery返回cudaSuccess?是因为我们不能将cudaStream_t的引用传递给另一个函数吗?我错过了什么吗?
感谢。
答案 0 :(得分:3)
cudaStreamQuery()
将返回cudaSuccess
。这意味着在您的示例中,它返回cudaSuccess
,因为内核已经完成。
cudaStreamQuery()
的目的是允许您在等待流完成时编写在主机线程上执行其他操作的代码。你可以这样做:
while (cudaSuccess !=cudaStreamQuery(stream)) { doUsefulWork(); }
请注意,这不是空闲的等待循环。
如果你想要一个空闲等待循环的语义,而不是一个空的while
块,最好使用cudaStreamSynchronize()
或使用cudaEvent
和cudaStreamWaitEvent()
。后者为您提供了更大的灵活性,因为您可以在指定流上的特定内核或其他调用之后等待记录的特定事件(cudaEventRecord()
)。