2014-08-28 1 views
0

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); 

}

Répondre

0

Oui, cudaDeviceSynchronize() est requis après chaque appel CUB. Notez où les appels de synchronisation commentés sont dans la question. J'ai passé de nombreuses heures à rechercher les raisons pour lesquelles mes calculs n'étaient pas calculés correctement ou même de manière cohérente. Finalement, j'ai trouvé en marchant à travers le débogueur NSIGHT que seulement quand j'ai mis des points d'arrêt après chaque fonction CUB que les calculs seraient corrects.

+0

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. –

Questions connexes