RDTSC

Pour discuter de l'assembleur
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

RDTSC

Message par Ollivier »

Bonjour, une vieille instruction, mais qui a toujours bon usage.

Voici l'une des approches que j'en.fais en 32 bits, mono-core.

Je zappe le poids fort (EDX) donc il y a risque de tomber tôt ou tard sur une valeur pharaonique que le compteur incrémente au niveau du poids fort tout en annulant le poids faible.

Ceci est donc une approche manuelle. Pour une approche automatique 32 bits, soit l'on rajoute une condition (Si négatif, refaire le test), soit l'on prend en charge le poids fort.

_TickStart et _TickStop sont à placer autour de la routine à mesurer. Ils ne se placent qu'en local.

tDelta est la variable qui contient le nombre de cycles entre _TickStart et _TickStop.

Code : Tout sélectionner

;{
Macro _TickStart
	CompilerIf MacroExpandedCount - 1
		Delay(0)	
		!	RDTSC
		!	MOV		[v_tIni],		EAX
	CompilerElse
		Define tIni
	CompilerEndIf
EndMacro

Macro _TickStop
	CompilerIf MacroExpandedCount - 1
		!	RDTSC
		!	MOV		[v_tFin],		EAX
		tDelta = tFin - tIni - tTare
	CompilerElse
		Define tFin
	CompilerEndIf
EndMacro

Macro _TickInit
	Delay(16)
	CompilerIf MacroExpandedCount = 1
		Define tTare.I
	CompilerEndIf
	_TickStart
	_TickStop
	_TickStart
	_TickStop
	tTare = tDelta
EndMacro

_TickInit
;}
Vous insérez ce code balisé ci-dessus en en-tête de programme.

Puis vous mesurez telle ou telle instruction ou routine comme ceci:

Code : Tout sélectionner

_TickStart
! xor eax, eax
_TickStop
Debug tDelta
Si vous décelez des anomalies ou des valeurs illogiques, il peut être très intéressant d'en parler, car ce type de mesure est très stable (c'est fait pour).

A l'exception de "MacroExpandedCount" qui a été ajouté pour compacter les macros, cela fait 6 ans que je fais des mesures. C'est très intéressant. La première chose à constater, c'est le pipe-line (1 cycle par instruction non achevée).

Prochainement, je tâcherai de vous montrer une approche plus "terre à terre" de cette prise de mesure. J'attends d'éventuelles remarques.

Si mes souvenirs sont bons, et corrigez-moi si je me goure, c'est "tonton" qui m'a montré ce truc.