2016-11-06 1 views
7

Pour mon projet Je dois utiliser les instructions d'assemblage en ligne telles que rdtsc pour calculer le temps d'exécution de certaines instructions C/C++.Existe-t-il une instruction équivalente à rdtsc dans ARM?

Le code suivant semble fonctionner sur Intel, mais pas sur les processeurs ARM:

{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t0 = ((unsigned long)a) | (((unsigned long)d) << 32);} 
//The C++ statement to measure its execution time 
{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t1 = ((unsigned long)a) | (((unsigned long)d) << 32);} 
time = t1-t0; 

Ma question est:

Comment écrire un code assembleur en ligne similaire à la ci-dessus (à calculer le temps écoulé d'exécution d'une instruction) pour travailler sur les processeurs ARM?

+2

'rdtsc' sur les processeurs multi-coeurs peut avoir des problèmes. voir https://msdn.microsoft.com/en-us/library/ee417693(VS.85).aspx –

+0

Les instructions uniques auront des horaires variables basés sur le cache, etc. Mieux vaut boucler des milliers de fois dessus et utiliser le perf_events() fonctionnalité commune pour le faire fonctionner sur tous les processeurs pris en charge. – BitBank

Répondre

6

Vous devez lire le registre PMCCNTR d'un co-processeur p15 (pas un coprocesseur réel, juste un point d'entrée pour les fonctions de la CPU) pour obtenir un compte de cycles. Notez qu'il est disponible pour une application sans droits que si:

  1. non privilégié PMCCNTR lectures sont alowed:

    Bit 0 de PMUSERENR registre doit être réglé sur 1 (official docs)

  2. PMCCNTR est en fait cycles de comptage:

    bit 31 du registre PMCNTENSET doit être mis à 1 (official docs)

Ceci est a real-world example de comment c'est fait.

+0

@Curious Notez que la réponse ci-dessus est valide pour ARMv6 et supérieur. Les anciennes versions arch peuvent avoir leurs propres méthodes pour obtenir ces données (spécifiques à une puce partielle - donc l'information doit être trouvée dans la feuille de données pour la puce), tandis que certaines puces basées sur ARM ne fournissent pas ces données du tout. –

+0

** Mon processeur ARM est ARM7A **, confirmé qu'en utilisant le compilateur Macro__ARM_ARCH_7A__, cependant, quand j'essaie d'utiliser l'instruction asm volatile ("mrc p15, 0, **% 0 **, c9, c13, 0" : "= r" (pmccntr)), le compilateur donne le message d'erreur: Erreur "aucune instruction" asm volatile ("mrc p15, 0, **% eax **, c9, c13, 0": "= r "(pmccntr)); – Curious

+0

** Mon Build Environment = ** PLATFORM_VERSION_CODENAME = PLATFORM_VERSION = REL 4,3 TARGET_PRODUCT = full_manta TARGET_BUILD_VARIANT = fra TARGET_BUILD_TYPE = libération TARGET_BUILD_APPS = TARGET_ARCH = bras TARGET_ARCH_VARIANT = ARMv7-a-néon TARGET_CPU_VARIANT = Cortex-A15 HOST_ARCH = x86 HOST_OS = linux HOST_OS_EXTRA = Linux-3.16.0-70-générique-x86_64-avec-Ubuntu-14,04- HOST_BUILD_TYPE = fidèle libération BUILD_ID = JWR66V OUT_DIR = out – Curious