10
votes

Équivalent d'usleep () dans le noyau de Cuda?

J'aimerais appeler quelque chose comme uleep () à l'intérieur d'un noyau Cuda. L'objectif de base est de rendre tous les cœurs GPU de sommeil ou de l'attouille d'un certain nombre de milléshésifs - cela fait partie de certains contrôles de santé mentale que je veux faire pour une application CUDA. Ma tentative de faire est ci-dessous: xxx

i Obtenez l'erreur suivante lorsque j'essaie de compiler cette utilisation à l'aide de NVCC: xxx

clairement, Je ne suis pas autorisé à utiliser une fonction hôte telle que uleep () à l'intérieur d'un noyau. Quelle serait une bonne alternative à cela?


0 commentaires

3 Réponses :


11
votes

Vous pouvez attendre une boucle qui lit horloge () code>.

Pour attendre au moins 10 000 cycles d'horloge: P>

clock_t start = clock();
clock_t now;
for (;;) {
  now = clock();
  clock_t cycles = now > start ? now - start : now + (0xffffffff - start);
  if (cycles >= 10000) {
    break;
  }
}
// Stored "now" in global memory here to prevent the
// compiler from optimizing away the entire loop.
*global_now = now;


5 commentaires

Merci! J'aimerais utiliser Horlock64 () pour que je puisse compter plus longtemps et réduire l'impact du roulement. Lorsque je compile un noyau Cuda qui inclut un appel horloge64 (), je reçois "Erreur: identifiant" Horlock64 "est indéfini." Lorsque j'utilise l'horloge (), le programme compile correctement. J'utilise NVCC 4.0. Basé sur une recherche Google rapide, il apparaît que Horlock64 () est censé être dans Cuda / NVCC 4.0. Des pensées sur la façon de résoudre ce problème?


Vous avez également besoin de capacités de calcul> = 2.0 pour obtenir clock64 () .


intéressant. J'utilise un GTX480, que NVIDIA répertorie comme une capacité calculée 2.0.


Vous compilez également 2,0? Dans Visual Studio 2010, cliquez avec le bouton droit de la souris sur le fichier .cu, accédez à Propriétés de la configuration | Cuda C / C ++ | Dispositif | Génération de code et vérifiez qu'il est défini sur Compute_20, SM_20 .


Aha, oui! C'est ça! J'utilise Linux donc je ne vs2010 pas. Donc, j'ai compilé avec le drapeau -GenCode = arch = Compute_20, code = SM_20 et Clock64 () ne jette plus une erreur de compilation.



22
votes

Vous pouvez tourner sur l'horloge () ou l'horloge64 (). L'échantillon CUDA SDK Concurrentkernels est-ce ce qui suit: XXX

Je recommande d'utiliser Horlock64 (). L'horloge () et l'horloge64 () sont dans les cycles, vous devez donc interroger la fréquence en utilisant cudadeviceProperties (). La fréquence peut être dynamique de sorte qu'il sera difficile de garantir une boucle de spin précise.


0 commentaires

3
votes

avec des versions récentes de Cuda et un dispositif avec une capacité de calcul 7.0 ou une version ultérieure (Volta, Turing, Ampère, etc.), vous pouvez utiliser le __ nanosleep () primitive: xxx

qui évite la nécessité d'être endormi comme suggéré dans les réponses plus anciennes.


0 commentaires