2011-07-07 1 views
2

J'ai un noyau lancé plusieurs fois, jusqu'à ce qu'une solution soit trouvée. la solution sera trouvée par au moins un bloc.
donc lorsqu'un bloc trouve la solution, il doit informer le CPU que la solution est trouvée, de sorte que le CPU imprime la solution fournie par ce bloc.
donc ce que je suis actuellement en train de faire est la suivante:utilise cudaHostAlloc bon pour mon cas

__global__ kernel(int sol) 
{ 
    //do some computations 
    if(the block found a solution) 
     sol = blockId.x //atomically 
} 

maintenant à chaque appel au noyau i copier sol sur la mémoire hôte et vérifiez sa valeur. si elle est définie sur 3 par exemple, je sais que blockid 3 a trouvé la solution, donc je sais maintenant où commence l'index de la solution, et recopie la solution vers l'hôte.
Dans ce cas, l'utilisation de cudaHostAlloc sera-t-elle une meilleure option? plus de copierait la valeur d'un seul entier à chaque appel du noyau ralentit mon programme?

Répondre

1

L'émission d'une copie du processeur graphique vers la CPU et l'attente de son achèvement ralentira votre programme un bit. Notez que si vous choisissez d'envoyer 1 octet ou 1 Ko, cela ne fera pas beaucoup de différence. Dans ce cas, la bande passante n'est pas un problème, mais la latence. Mais le lancement d'un noyau consomme aussi du temps. Si la "viande" de votre algorithme est dans le noyau lui-même, je ne passerais pas trop de temps sur ce seul petit transfert.

Do note, si vous choisissez d'utiliser la mémoire mappée, au lieu d'utiliser cudaMemcpy, vous aurez besoin de mettre explicitement un cudaDeviceSynchronise (ou cudaThreadSynchronise avec plus CUDA) barrière (par opposition à une barrière implicite à cudaMemcpy) avant de lire le statut. Sinon, votre code hôte peut lire une ancienne valeur stockée dans votre mémoire épinglée, avant que le noyau ne l'écrase.

+0

Avec CUDA 4.0, c'est 'cudaDeviceSynchronize()', 'cudaThreadSynchronize()' est obsolète. – harrism

+0

OK, corrigé. Merci! – CygnusX1

+0

@harrism Une idée sur quelle est la différence entre cudaDeviceSynchronize() et cudaThreadSynchronize()? Je suppose qu'ils ont l'intention de faire la même chose, mais pourquoi changer le nom? –

Questions connexes