CTCM Version 1.6l, c't im Februar 98 Andreas Stiller
------------------------------------------------------

Ursprngliche Aufgabe von ctcm (hie zunchst cmess) 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 die Performance
des Datenflusses der CPU/Cache/Hauptspeicher-Implementation zu
bestimmen. ctcm schlsselt auf, ob Cache Hits oder
Cache Misses, 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 Schreibzugriffe bentigt Ctcm sehr viel Platz, entweder im Heap
oder im Extended Memory. Platzbedarf ist > (2*L1-Cachesize + 1*
L2-CacheSize). Mglichst daher fr Messungen mit ctcm den Rechner
mit 4 MByte und mehr Speicher ausstatten.

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

Bei Aufruf aus der Turbo-Vision-Shell CTSI heraus, daher
zuvor Platz im Extended Memory reservieren mit

SET DPMIMEM=

!! Voraussetzungen und Einschrnkungen !!

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

Zur Messung ist der unbedingt der Real-Mode ntig! DOS-Boxen von
Windows, OS/2, NT fallen daher aus, ebenso Memory Manager  la Qemm,
Max und EMM386

Bie 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.

Defaultmig (ohne Parameter)stoppt CTCM den Transfer-Befehl REP MOVSD aus



Version 1.0  verffentlicht in c't 1/93
Version 1.1  Fassung auf der Heft-Sammeldisk/Mailbox ct0193.zip
             (Korrekturen dazu siehe c't 4/93 S.12)
Version 1.3  Fassung auf der ctsi-Info-Disk V1.0
Version 1.3a Weniger Thrashing zwischen Mecode und Daten
             leicht genderte Cache-Routine
        1.3c Letzte nderung war "Verschlimmbesserung", fhrte dazu, da
             in schnellen Systemen der L2-Cache auf die doppelte Gre
             bestimmt wurde. Eine neue nderung fhrt zu einer krzeren
             Meschleife, so da Timing-Unterschiede prozentual grer
             und daher besser erkannt werden.
             Gleichzeitig wurde fr >486-Systeme die Diskriminate fr
             Write-Back-Erkennung von 1.1 auf 1.04 und fr L2-Erkennung
             von 1.2 auf 1.1 reduziert.
             Einbindung von iDX4. Dieser wurde von < V1.3c wg. der
             16 KByte Cache als IBM486SCL/DLC  erkannt.
Version  1.4 Neue Cachesize-Erkennung
             Arbeitet im Extended Speicher, (nur noch ab 386
             Prozessor). Diverse CPUs hinzugefgt.
             Fehlerhafte Dirty-Erkennung bei Intel Triton
         1.5 TransferRoutine mit noch weniger Thrashing eingebaut
             => etwas grere Datenraten im L1-Cache
             Write-Back-Erkennung fr L1 und L2-Cache
             Assoziativittserkennung fr L1 und L2-Cache
             Dirty-Erkennung gendert fr Systeme mit optimalen
             Castoff-Buffern (Intel Triton).
             CPUID hinzugefgt
             Neue Prozessoren hinzugefgt
             Pentium-Pro  (noch ohne Dirty-Erkennung)
             Cyrix 6x86 (eingeschrnkt wg. Cachefill on Write
             Miss, siehe c't 4/96 S.196ff)
             Optionalen SCAN-Modus eingefgt: Datenraten gemittelt ber
             Adressen  0,4,8,.. 28
         1.6 Meroutinen verbessert (nun gnzlich Thrashing-frei auch bei
             Unified Caches, also insbesondere fr Cyrix 6x86 (M1
             und M2) => bessere Cache/Hit-Werte.
             Einen Fehler bei der Gewichtung eines Messwertes
             beseitigt => etwa 2 Prozent bessere Werte bei der
             Simulation.
             AMD K5 und K6, Pentium MMX und Pentium-II, IDT-C6 hinzugefgt.
             Bestimmung des Code-Caches (Gre, Assoziativitt)
             Bestimmung von Hauptspeicherbereich, Speicherlchern und
             gespiegelten Bereichen.
             Bestimmung der Cacheable Area fr L1 und L2
             VESA-Video-Modi hinzugefgt.
             Messung im Linearen Frame Buffer LFB (ab Vesa 2.0)
             mglich.
             Videomessung umgestrickt: MOVS, LODS und STOS jetzt in
             einem Messvorgang.
             Messung mit oder ohne Write-Allocation bei Cyrix
             6x86 und AMD K6 mglich (Parameter /WA =On oder Off)
             Angabe der CACHEID bei PPro und Pentium II
             Angabe der CPUIDs bei Multiprozessor-Systemen
             Zurckschaltung des A20-Gates, da sonst Win95b nicht
             mehr anstartet ...
             Falls Himem.sys vorhanden, benutzt ctcm 1.6 dazu
             Himem-Funktionen Set/Reset LocalA20enable
       1.6k  -- CPUID, Takt-Ausgabe, LFB-Adresse, Videomodi nun auch
                unter Windows mglich.
             -- kleine Ungereimtheit bei Codecache-Erkennung beseitigt.
             -- VESA-Info ergab zuweilen bei nicht
                VESA-2.0-konformen OEM-Strings wilde Zeichen
                => gendert (nur ASCII-Zeichen erlaubt)
             -- Neu Parameter /F:  CPUID-Features werden angezeigt
             -- Doko-Fehler beseitigt:
                /L1 oder /L2 = xxx ab ctcm V1.5c in Byte, nicht
                in KByte
             -- /adr=xxxx jetzt dokumentiert, ab V 1.6k mit berprfung, ob
                der gewnschte Speicherbereich auch frei ist.

        1.6l -- Fhrt Transfers auch ber FPU-Register aus
                (=>z.T.deutlich schnellere Memory-Fill-Raten)
             -- berprft bei mehrfachassoziativen L1-Caches
                die Cachefill-Strategie (LRU: Least Recent Used)
                (Lin Fill heit: Nach Lesen eines Blockes der Gre von
                 L1 befindet sich der gesamte Block im L1 (Pentium, PII)
                 beim Cx686 jedoch nicht)
                Pseudo-LRU: "Sparstrategie"  bei der >fast< immer der
                der lteste Block ersetzt wird.

             -- berprft Wirkung von Wbinvd auf den L2-Cache. Bei L2-Caches
                ohne Valid-Bit wird das WBINVD-Signal in der Regel ignoriert

 Achtung, beim Pentium II ermittelt ctcm 1.6k fr L1-Cache eine Vierfach-
 Assoziativitt -- im Widerspruch zu Intels Dokumentation des Cache-ID-Befehls.
 (Kennung 0Ch wurde als 2fach-assoziativer Cache spezifiziert )
 Intel mute inzwischen den Fehler in der Dokumention eingestehen.




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

  Transfertyp:
          /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

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)
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
         /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).


!!!!!!!!!!!!!!!!!!!!!! Achtung  !!!!!!!!!!!!!!!!!!!!!!!!!!!

Adrelagen:
-----------
ctcm mit defaultmig im L1-Cache Transfers ohne
Adreverschiebung. Bis einschlielich 486-Prozessor war das auch
korrekt, der Pentium und die anderen 586er haben aber sehr
unterschiedliche Transfergeschwindigkeiten in Abhngigkeit von
der jeweiligen Adrelage. Fr einen Vergleich ist daher auf jeden
Fall die Messung mit dem Parameter /SCAN zu empfehlen, wobei
verschiedene Dword-alignte Adressen vermessen werden. Das
Ergebnis ist dann der Mittelwert der Einzelmessungen. 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 (Cache fill on
Write miss), die AMD K6 und Cyrix 6x86 optional ausfhren. Bei
den ctcm-Transfermessungen profitieren beide Prozessoren
unverhltnismig von der Write-Allocation da REP-MOVS-Transfers
hiermit in den meisten Fllen (jedenfalls bei L2-Hit) schneller
vonstatten gehen. Fr einen korrekten Vergleich mit Pentium oder
IDT-C6 ist daher eine Messung mit abgeschalteter WA (/WA=off)
sinnvoll. Der AMD K6 bricht ohne WA allerdings ziemlich stark
ein. Ein vernnfiger Kompromi ist eine Mittelung zwischen den
Ergebnissen mit WA (/WA=on) und ohne WA.


Memory Type Range Register
--------------------------
Pentium Pro und Pentium II verfgen ber Memory Typ Range
Register, die erheblich die Video-Performance (VGA und LFB)
beeinflussen. Hierzu kann mit dem Tool ctppro die aktuelle
Einstellung berprfen und ggf. ndern. Auch die Cyrix-
Prozessoren haben hnliche Register (ARRG), die die
Video-Performance beeinflussen. Diverse Cx686-Tools sind hierfr
verfgbar u.a. ctchipz mit der cx686-Konfigurationsdatei.

CacheID
---------
PPRo und Pentium II besitzen neben dem CPUID-Befehl auch
einen CacheID-Befehl. Beim Pentium II ermittelt ctcm 1.6k
fr L1-Cache eine Vierfach-Assoziativitt -- im Widerspruch
zu Intels Dokumentation des Cache-ID-Befehls. (Kennung 0Ch
wurde als 2fach-assoziativer Cache spezifiziert). Intel
mute daraufhin den Fehler in der Dokumention eingestehen.


Andreas Stiller
as@ct.heise.de
0511-5352-503











