我可以将cudaStream的引用传递给调用全局方法的函数吗

我可以将cudaStream的引用传递给调用全局方法的函数吗,cuda,Cuda,我正在主机函数中创建cudaStream void callKernel(cudaStream_t* ptrStream) { kernelDoesNotMatter<<<1,12,0,*ptrStream>>>(); //Here i am not calling cudaStreamSynchronize } void host_func() { cudaStream_t stream; cudaStreamCreate(&

我正在主机函数中创建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?
}
void调用内核(cudaStream\u t*ptrStream)
{
kernelDoesNotMatter();

//这里我不是给库达打电话 } void host_func() { cudaStream_t stream; cudaStreamCreate(&stream); 调用内核(&stream); cudaError\u t err=cudaStreamQuery(stream)//err==cudaSuccess? }
在这里,在调用callKernel方法中的内核之后,我没有调用cudaStreamSynchronize(),为什么cudaStreamQuery返回cudaSuccess?是因为我们无法将cudaStream\u t的引用传递给另一个函数吗?我是不是遗漏了什么

谢谢。

cudaStreamQuery()
如果流上的所有命令都已完成,则返回
cudaSuccess
。这意味着在您的示例中,它返回
cudaSuccess
,因为内核已经完成

cudaStreamQuery()
的目的是允许您在等待流完成时编写在主机线程上执行其他操作的代码。您可以通过以下方式实现:

while (cudaSuccess !=cudaStreamQuery(stream)) { doUsefulWork(); }
注意,这不是一个空闲等待循环


如果需要空闲等待循环的语义,而不是使用空的
while
块,最好使用
cudaStreamSynchronize()
或使用
cudaEvent
cudaStreamWaitEvent()
。后者为您提供了更大的灵活性,因为您可以在指定流上的特定内核或其他调用之后等待记录的特定事件(
cudaventrecord()
)。

可能是因为执行在cudaStreamQuery之前完成?我不是在调用cudaStreamSynchronoize,因此流中的操作不会被执行。CUDAStreamSynchronize是为了确保执行已经完成。内核可能在cudastreamsynchronoize之前完成,那么我应该如何检查内核是否仍在工作呢?你是不是告诉我做一些事情,比如忙着等待(cudaSuccess!=cudaStreamQuery(stream));对于我上面提到的情况,我可以使用两个流吗?我不完全理解这个情况,在您的示例中,要保证多个流似乎过于简单。但是,通常没有理由不能使用多个流。您甚至可以在另一个流(从CUDA4.0开始)中记录事件的流等待,这非常方便。我有一个thread1,它不断地旋转和读取套接字中的数据,并将数据分派给另一个调用内核的thread2。我不希望thread2等待内核完成处理。这就是为什么我尝试使用2个流,并根据哪个1不起作用对其中的内核进行排队,这样我就不会经历任何数据包丢失。