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