Est-il nécessaire d'appeler cudaDeviceSynchronize après l'appel d'une classe CUB à partir d'un noyau CUDA? Quand on utilise dire DeviceReduce :: Somme() de l'appareil, il y a des copies de mémoire implicite qui bloquent l'appareil de se déplacer, mais après avoir connu une certaine instabilité à l'aide du code ci-dessous appelé le GPU:Utilisation de cudaDeviceSynchronize après une classe CUB
__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, lorsqu'il est appelé à partir du code de périphérique, utilise le parallélisme dynamique CUDA, c'est-à-dire qu'il génère des noyaux enfants. Comme tout lancement de noyau, ces lancements de noyau sont asynchrones avec le thread appelant et ne sont pas forcément terminés lorsque le contrôle est renvoyé au thread appelant. Par conséquent, si le thread appelant requiert que les données produites par l'appel CUB soient complètes et prêtes, il est nécessaire de synchroniser et d'attendre la fin du ou des noyaux enfants. Cette idée est vraie en général pour les données produites par les noyaux enfants via le parallélisme dynamique CUDA. –