2014-08-28 179 views
0

從CUDA內核調用CUB類後,是否需要調用cudaDeviceSynchronize?當一個人使用從設備說DeviceReduce ::總和(),有移動的阻擋裝置內隱記憶副本,但遇到了一些不穩定使用呼籲GPU下面的代碼後:在CUB類後使用cudaDeviceSynchronize

__device__ void calcMonomerFlux(double* fluxes, double* lengths, double* dt) //temp2 temp1 
{ 

    void *d_temp_storage = NULL; 
    size_t temp_storage_bytes = 0; 

    arrInitToLengths<<< numBlocks, numThreads >>>(lengths); 
    cudaDeviceSynchronize(); 
    arrMult<<< numBlocks, numThreads >>>(fluxes, lengths, lengths); 
    cudaDeviceSynchronize(); 
    double sum = 0; 

    cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, lengths, lengths, maxlength); 
    //cudaDeviceSynchronize(); 

    cudaMalloc(&d_temp_storage, temp_storage_bytes); 
    //cudaDeviceSynchronize(); 

    cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, lengths, lengths, maxlength); 
    //cudaDeviceSynchronize(); 

    cudaFree(d_temp_storage); 

}

回答

0

是的,cudaDeviceSynchronize()在每次CUB調用後都是必需的。注意註釋同步呼叫在問題中的位置。我花了好幾個小時追查爲什麼我的款項計算不正確或者甚至一直不正確。最後,我在通過NSIGHT調試器的時候發現,只有當我在每個CUB函數之後放置斷點時,計算纔是正確的。

+0

當從設備代碼調用CUB時,CUB使用CUDA Dynamic Parallelism,即它產生子內核。與任何內核啓動一樣,這些內核啓動與調用線程異步,並且在控制返回到調用線程時不保證完成。因此,如果調用線程要求由CUB調用產生的數據完整且準備就緒,則需要同步並等待子內核完成。這個想法對於通過CUDA動態並行機制由子核生成的數據來說是正確的。 – 2014-08-28 12:22:02

相關問題