
 CPU/Cache/Speicher-Analyse 
  

CTCM Version 1.6R, c't im Mai 99, Andreas Stiller
-------------------------------------------------

Ursprngliche Aufgabe von CTCM war es, bei
Write-Back-Caches das Vorhandensein oder Fehlen des
sogenannten Dirty-Tags zu ermitteln. Die Rechner laufen
auch ohne dieses zustzliche SRAM, aber langsamer (insbesondere
unter OS/2, NT, Linux, NextStep ..).

Daneben eignet sich CTCM, um Typ und Takt der CPU sowie
die Performance des Datenflusses der CPU/Cache/Hauptspeicher-
Implementation zu bestimmen. CTCM schlsselt auf, ob Cache Hits oder
Cache Miss, Dirty- oder Clean-Zugriffe
vorliegen und bestimmt mit einer durch Simulation gewonnenen
Gewichtung einen Mittelwert fr typische DOS- (640 KB) und
Windows-Anwendungen (4 MByte).

Fr die vielfltigen Speicherzugriffe bentigt CTCM mindestens
etwa 2 MByte Platz im Extended Memory, bei greren L2-Caches
auch mehr (2*L1-Cachesize + 2* L2-CacheSize). Mglichst daher
fr Messungen mit ctcm den Rechner mit 4 MByte und mehr Speicher
ausstatten.


nderungen gegenber der letzten freigegebenen Version ctcm 1.6n:
*****************************************************************
Die nderungen wird man auf den ersten Blick vielleicht nicht
gleich sehen, sie sind aber reichhaltig. Zunchst einmal arbeitete
1.6n nicht mit dem Cyrix-Prozessor zusammen und machte bei Intels
Celeron Fehler bei der Erkennung des L2-Caches und lieferte als
Folge falsche Mewerte. Beides ist nunmehr behoben, zustzlich kennt
ctcm jetzt auch alle aktuellen Prozessoren bis hin zu Intel Dixon,
Pentium III, AMD K6-III, Rise mP6, Winchip 2A.

ctcm 1.zeigt auerdem auch zwei andere, mglicherweise
schnellere Transfermglichkeiten an:
via FPU (Achtung ist nicht mit allen Datenmustern korrekt,
         da bestimmte Daten als NaN gewertet und mglicherweise
         verndert werden. Aber ein schnelles Memclear mit 0
         beispielsweise funktioniert problemlos).
via MMX (ohne Einschrnkung)


Auerdem stoppte e bei gengend Speicherplatz auch den Blocktransfers
eines 4-MByte Speicherblocks aus.

Mit /vid zeigt ctcm V1.6R alle relevanten Meergebnisse der Transfers von
und zum Videospeicher auf einem Bildschirm. Mit /vid=Modus kann man
einen Videomodus whlen (vorangestelltem $ als Hexwert). Ab VESA 2.0 wird
auch der LFB untersttzt, den man mit Modus +$4000 aktiviert, insbesondere:

ctcm /vid=$4105


Adreverschiebung
-----------------
ctcm erster Mewert bezieht sich auf einen Transfer im L1-Cache ohne
Adreverschiebung. Das ist natrlich nicht sehr praxisorientiert, ergab
aber bis hin zum 486-Prozessor den gleichen Wert, den eine echte
Verschiebung im L2-Cache ergibt. Ab Pentium sind die Werte jedoch recht
unterschiedlich, in Abhngigkeit von der jeweiligen Lage der Quell- und
Zieladressen. Fr einen Vergleich ist daher auf die Messung mit dem
Parameter /SCAN zu empfehlen, wobei ctcm verschiedene Dword-alignte Adressen
vermit und das Ergebnis als Mittelwert der Einzelmessungen bestimmt.
Hier zeigte sich brigen unter anderem, da der Pentium-MMX eine erhebliche
Verbesserung im Verhalten gegenber seinem Vorgnger aufweist:
Er kann etwa bei einer Verschiebung um 4 Bytes viel schneller
transferieren (einzelne Verschiebungen sind mit /SHIFT=xxxx
mebar).

Write-Allocation:
----------------
Die Write-Allocation (WA) ist eine Cache-Fll-Strategie, die AMD K6,
K6-2/III und Cyrix 6x86/MX/MII optional ausfhren, und der Pentium-II
immer. Bei den ctcm-Transfermessungen profitieren diese
Prozessoren unverhltnismig stark von der Write-Allocation da
REP-MOVS-Transfers hiermit in den meisten Fllen (jedenfalls bei
L2-Hit) schneller vonstatten gehen. Beim K6 und dem 6x86 lt sich die
Write-Allocation fr die Dauer der Messung mit /WA=off abschalten
bzw. mit /WA=on einschalten

Memory Type Range Register  und Write Combining
-----------------------------------------------
Pentium Pro und Pentium II, K6-2CXT,K6-III, IDT Winchip und Cyrix
6x86/MX/MII verfgen ber Memory Typ Range Register, mit denen man
fr den Linearen Framebuffer einer Grafikkarte das Write Combining
einschalten kann. Das beeinflut erheblich die Video-Performance
(VGA und LFB) Hierzu kann mit den Tools ctppro oder setk6V3 oder
ctchipz cx686 die aktuelle Einstellung berprfen und ggf. ndern.
ctcm1.6 kann fr den Pentium-II ebenfalls auf Write-Combining schalten:
(wird bei Messung der Video-Performance abgefragt)

CacheID
---------
PPRo und Pentium II besitzen neben dem CPUID-Befehl auch
einen CacheID-Befehl.

!!!!!! Voraussetzungen und Einschrnkungen !!!!!!!

ctcm ist ein DOS-Metool, es kann unter Windows nur den Prozessortypen
und -Takt feststellen, aber keine Datenflumessungen ausfhren.

Fr die Messung ist folgendes zu beachten:

ctcm vertrgt sich grundstzlich nicht mit Memory-Managern, wie
EMM386, QEMM, MAX386 usw. Diese mssen vorher auskommentiert werden.

Himem.sys hingegen ist zwar nicht unbedingt ntig, aber von Vorteil.

Wer die CTSI-Shell (Abonnenten-Goodie) benutzt,
mu zuvor Platz im Extended memory reservieren mit

SET DPMIMEM=maxmem 2048

ctcm kennt eine Flle von Parametern, funktioniert aber auch ohne.
Dann stoppt es fr den Datenflu den Transfer-Befehl REP MOVSD aus

Interner Cache (486er, Pentium) sollte eingeschaltet sein
keine aktiven Watchdog-Timer und SMM-Interrrupts

Bei Systemen mit sehr schnellen DRAMs (etwa SDRAM) und schlecht
eingestelltem L2-Cache kann ctcm keinen signifikanten
Timing-Unterschied zwischen beiden herausmessen und findet somit
den L2-Cache nicht.


 Aufruf   : ctcm /parameterliste
 Proz           : ab 386SX
 Parameter: [Transfertyp][Timer][Cachegre]

Standadr-Transfertypen
          /MOVSB
          /MOVSW
          /MOVSD   /Default)
          /STOSB
          /STOSW
          /STOSD
          /LODSB
          /LODSW
          /LODSD

Timer:    /T0     (Default) System-Timer 0
          /T1     Refresh-Timer 1 - ist exakter,
                  kann aber zu Parity-Problemem fhren
                  !!! nicht fr PS/2 !!!
          /T2     Timer 2
          /pent   Pentium-Timer
Cachegre:
          /L1=xxxx  bersteuert die ermittelte L1-Cachegre
          /L2=xxxx  bersteuert die ermittelte L2-Cachegre
          mit xxxx  Gre in Byte (dezimal) oder mit $xxxx (hexadezimal)
              xxxxK Gre in KByte   "
              xxxxM Gre in MByte
              xxxxG Gre in GByte
              xxxxT Gre in TByte (derzeit selten zu finden)
          oder
          /L1=off   L1-Cache aus
          /L2=off   L2-Cache aus (nur Pentium II)

Arbeitsadresse:
         /adr=xxxx bersteuert den ctcm-Adrebereich
                   xxxx wie bei Cachegre
                   Achtung, ctcm erwartet einen freien(!) Speicherbereich,
                   fr den gelten mu: memfree >= 2*L1_Size +L2_Size.
                   ctcm ab V1.6k lt Startadressen nicht zu, die
                   Programm- und/oder Datenbereiche von DOS oder im HiMem
                   berschreiben knnten.
                   /adr=xxx lt sich u.a verwenden um evtl. ungecachete
                   Bereiche zu berprfen, etwa wenn die L2-Werte bei
                    /adr=64M
                   deutlich schlechter sind als normal.


VideoTransfer:
          /Vid     Mit Transfers von und zum Videospeicher
                   (Default Videomodus = $13);
          /Vid=xxxx Mit im Videomodus xxxx (dezimal) oder $XXX
                    (hexadezimal)
                    insbesondere auch VESA-Modi fr den Linearen
                    Frame Buffer ab Vesa VBE 2.0 mglich,
                    (gesetztes Bit 14 im Modus, also insbesondere
                    die Modi $4103 und $4105)
Sonstiges
          /SCAN     mit ber die verschobenen
                    Adrelagen 0, 4, 8 .. 28 und mittelt
         /SHIFT=xxx mit mit einer Verschiebung von xxx
         /F         zeigt Prozessor-Features an
         /NOM       keine Hauptspeicher /Cacheable Area Messung
         /NOC       keine Code-Cache-Erkennung
         /WA=on/off schaltet Write-Allocation bei Cyrix 6x86- und
                    AMD-K6-Prozessoren an bzw. aus
                    Beim AMD K5 (ab Step4) wird hiermit nur die
                    sogenannte Write-Pipeline ein/abgeschaltet,
                    da nach unserer Messung dort die Write-Allocation
                    eh nicht funktioniert (don't Care).

         /ECC=on/off (nur Pentium II): schaltet L2-ECC ein/aus
         /Lat=xx     (nur Pentium II): Latenzwert fr L2-Cache setzen

         /?          Hilfe
         /C=GR/US/NL  In deutsch, englisch, niederlndisch

**************** Spielwiese fr Profis ***********************
ber die Standard-Transfertypen hinaus kennt ctcm V 1.6R eine Vielzahl
weiterer Transfermglichkeiten. Hierber lt sich fr den jeweiligen
Prozessor eine optimale Methode finden.


MOV mit Interleave (nicht sequentielle Zugriffe)
MOV mit Prefetch  (ldt das erste Dword zweier aufeianderfolgender
                   Cachelines und dann den Rest per REP MOVSD)


Alle Transfers werden standardmig im sogenannten Big-Real-Modus
ausgefhrt (Real Modus mit 4-GByte Adreraum fr Daten).
Alternativ kann ctcm 1.6R aber auch die Transfers im 32-Bit-Protected-Mode
durchfhren, was Segemt-Prfixe einspart und somit meist etwas schneller
vonstatten geht. Um die Zugriffe im 32-Bit-Segment durchzufhren mu
man dem gewnschten Transfer eine 32 anhngen. Ein voangestelltes P i
steht fr Interleaved, ein l fr linear und ein p (nur bei MOV) fr prefetch.

Beispiel
ctcm /MOVSD32    ; REP MOVSD im 32-Bit-Segment
ctcm /LODSB32    ; REP LODSB im 32-Bit-Segment

ctcm /FMOV       ; MOV Qword via FPU (default: mit Interleave)
ctcm /FMOVl      ; ebenso aber linear
ctcm /MMOV       ; MOV Qword via MMX (default: mit Interleave)

ctcm /FLD32      ; Load Qword via FPU (default: mit Interleave)
etc.

Insgesamt sind folgende Transfers definiert

Per CPU im Big-Real-Mode:  (immer linear)

              MOVSB,MOVSW,MOVSD,
              LODSB,LODSW,LODSD,
              STOSB,STOSW,STOSD,

Per CPU im 32-Bit-Segment (immer linear)
              MOVSB32,MOVSW32,MOVSD32,
              LODSB32,LODSW32,LODSD32,
              STOSB32,STOSW32,STOSD32,

Per CPU mit Interleave oder Interleaved Prefetch
              MOVI,MOVIP,MOVI32,MOVIP32,

Per CPU nur das erste DWord einer Cacheline:
 (unvollstndiger Transfer)
              MOVif,LODif,MOVif32,LODif32,

Per FPU im Big-Real-Mode (linear/interleaved)
              FMOVi,FLDi,FSTi,
              FMOVl,FLDl,FSTl,

Per FPU im 32-Bit-Segment (linear/interleaved)
	      FMOVi32,FLDi32,FSTi32,
	      FMOVl32,FLDl32,FSTl32,

Per MMX im Big-Real-Mode (linear/interleaved)
              MMOVi,MLDi,MSTi,
              MMOVl,MLDl,MSTl,

Per MMX im 32-Bit-Segment (linear/interleaved)
	      MMOVi32,MLDi32,MSTi32,
	      MMOVl32,MLDl32,MSTl32,



Alle Zugriffe im 32-Bit-Segment lassen sich auch mit Parameter
/page auch mit Paging durchfhren, z. B.

ctcm /FMOV32 /page : MOV Qword via FPU mit Paging (mit Interleave)

Zustzlich kann man Page-Attribute WT (Write Trough) oder NC (No Cache)
setzen:

ctcm /MLDl32 /page=WT






