Могу ли я передать ссылку на cudaStream в функцию, где он вызывает глобальный метод - PullRequest
1 голос
/ 15 марта 2012

Я создаю 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?
}

Здесь я не вызываю cudaStreamSynchronize () после вызова ядра в методе callKernel, почему cudaStreamQuery возвращает cudaSuccess? Это потому, что мы не можем передать ссылку cudaStream_t на другую функцию? Я что-то упускаю в этом?

Спасибо.

1 Ответ

3 голосов
/ 15 марта 2012

cudaStreamQuery() возвращает cudaSuccess, если все команды в потоке завершены. Это означает, что в вашем примере он возвращает cudaSuccess, потому что ядро ​​уже завершено.

Цель cudaStreamQuery() - позволить вам написать код, который выполняет другие действия в потоке хоста, ожидая завершения потока. Вы можете сделать это примерно так:

while (cudaSuccess !=cudaStreamQuery(stream)) { doUsefulWork(); }

Обратите внимание, что это не простой цикл ожидания.

Если вам нужна семантика цикла ожидания простоя, а не пустой блок while, лучше использовать либо cudaStreamSynchronize(), либо cudaEvent и cudaStreamWaitEvent(). Последнее дает вам больше гибкости, поскольку вы можете ждать определенного события, записанного (cudaEventRecord()) после определенного ядра или другого вызова в указанном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...