Я использую CUDA 4.2 на Quadro NVS 295 на машине Win7 x64. Из Руководства по программированию CUDA C Я прочитал это:cudaStreamDestroy() не синхронизирует/блокирует?
»... Потоки освобождаются вызовом cudaStreamDestroy()
for (int i = 0; i < 2; ++i)
cudaStreamDestroy(stream[i]);
cudaStreamDestroy() ждет всех предыдущих команд в данном потоке в. , прежде чем уничтожить поток и вернуть управление хост-потоку ».
Действительно ли это так? Я написал небольшой код, где я делаю более или менее следующее (я буду ставить только псевдокод):
//transfer input buffer to device
cudaMemcpyToArrayAsync(... , stream[1]);
//launch kernel
my_kernel <<<dimGrid, dimBlock, 0, stream[1]>>> (...);
//transfer from device to host
cudaMemcpyAsync(.., cudaMemcpyDeviceToHost, stream[1]);
//Destroy stream. In theory this should block the host until everything on the stream is completed!
ret = cudaStreamDestroy(stream[1]);
В этом примере, кажется, что cudaStreamDestroy() вызов немедленно вернуться к хозяину, то есть не дожидаясь для вызова cudaMemcpyAsync() и других инструкций strem. Если я поставлю «cudaStreamSynchronize (поток [1]); звоните перед уничтожением потока, все идет хорошо, но медленнее. Итак, что я делаю неправильно?
Большое спасибо за ваши ответы!
Большое спасибо! Я читал точно ту же документацию (4.2), но, возможно, другую главу/раздел. Я имею в виду, что в этом разделе было не очень понятно, и я думаю, что это было немного вводить в заблуждение. Еще раз спасибо! – ACRay
@ user1449129: если это решит вашу проблему, возможно, вы можете быть настолько любезны [принять это] (http://meta.stackexchange.com/a/5235/163653). – talonmies