Announcement

Collapse
No announcement yet.

Cache-Optimierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Cache-Optimierung

    Hi Leute.

    ich hoffe es kann mir hier geholfen werden. ich versuche als kleines projekt u.a. auf einem 386 (32 KByte extern),468 (8 KByte interner Datencache) und pentium (16 KByte interner Datencache) zu untersuchen, wie effizient die Caches auf den systemen sind. hierzu gehören u.a. folgende aufgabenteile:

    1.)
    ich will die systeme einmal mit und ohne cache betreiben. ichh habe gelesen, dass man caches auf diesen prozessoren ausschalten kann, weiß aber nicht wie das geht? kann mir jemand weiterhelfen? dazu muss man auf die assemblerebene absteigen ????

    2.)
    ich versuche die datenarrays unterschiedlich groß zu machen, um den cache zu überfluten. daraus soll eine kennzahl ermittelt werden, die in etwa die datenmenge angibt, die ganz in den cache passt und somit schnell (d.h. ohne speicherzugriffe) arbeitet.


    Probleme:
    bei einer arraygröße von ca. 32000 Integerwerten = 2 Byte (wobei das nicht die untere grenze ist, welche ich noch nicht rausgefunden habe) sagt der Compiler, dass das array zu groß ist. bei der cache größe der o.g. prozessoren erweist sich die untersuchung unter diesen bedingungen als sehr hinderlich.

    Die Programmierumgebung
    Ich arbeite unter DOS mit Borland C++ 3.1 (für DOS). In jeder dieser Umgebungen wird diese Meldung ausgegeben.

    Ich habe schon die Speicher-Modelle umgestellt und auch die Übersetzung des Zielcode auf den x86, 286, 386, 486 in den Optionen ausprobiert. Aber leider ergab das immer wieder den o.g. übersetzungsfehler. Wieso?

    Würde mich freuen, wenn ihr eine antwort darauf wißt. aber bitte leicht verständlich ausführen, da ich neu in der C Programmierung unter Borland bin :-).


    Nachtrag
    Für die Cache-Überflutung des L1 Cache sollte ja eigentlich das, durch das speichermodell LARGE oder HUGE bereitgestellte, Datensegment groß genug Beide Modelle erlaufen ein 1 MB großes Datensegment. Das sollte auch ausreichen um den Nutzen des L2 Cache in die Knie zu zwingen ???

    Umso weniger kann ich verstehen, dass mir der Compiler bereits bei ca. 32000 Integerwerte = ca. 64 KB einen strich durch die rechnung macht.

  • #2
    ca. 32000 Integerwerten = 2 Byte
    Du hast mit Sicherheit die 64KB Grenze ueberschritten.
    Abhilfe schaft hier eine dyn. Alloziierung von Speichern.
    int *ptInt = malloc (sizeof(int) * Anzahl);

    Comment


    • #3
      Ja, wenn er die Werte - was er ja nicht mitteilt - statisch alokiert hat. Man fragt sich allerdings, warum man sich nocht mit 10 Jahre alter Technik befassen muss?
      Christian

      Comment


      • #4
        ca. 32000 Integerwerten = 2 Byte
        Das sollte bedeuten, das mein Array aus 32000 Integern besteht, wobei int = 2 Bytes


        Du hast mit Sicherheit die 64KB Grenze ueberschritten.
        jau, das hab ich mir auch gedacht, wobei ich nicht verstehe, dass es eine solche 64-KB Grenze gibt, da dei wahl des Speichermodells LARGE oder HUGE mir einen Datenbereich von max. 1 MB zusichern sollte - laut Buch.

        Leider steht in meinem Buch nicht, ob man den 1MB nutzbaren Speicher selbst verwalten muss: oder wie bereits bemerkt wurde, ob man den Speicher dynamisch ansprechen muss, um diese 1MB ausnutzen zu können.
        Im ersten Fall hätte ich erwartet, dass der Compiler bei Überschreitung von 64-KB selbst das Daten-Segment mit einem neuen Wert lädt oder ähnliches.

        Daraus ergibt sich, dass der Compiler immer bei globalen Daten (statisch angelegten Daten) auf eine 64-KB Grenze hin prüft ????? Oder gibt es eine Möglichkeit per Option, die den Compiler veranlasst eine autom. Verwaltung bei Überschreitung von 64-KB zu übernehmen?????

        Man fragt sich allerdings, warum man sich nocht mit 10 Jahre alter Technik befassen muss?
        Weil es einfacher ist unter DOS, zumindest wird der Cache nicht durch andere prozesse zugemüllt.

        Comment


        • #5
          jau, das hab ich mir auch gedacht, wobei ich nicht verstehe, dass es eine solche 64-KB Grenze gibt, da dei wahl des Speichermodells LARGE oder HUGE mir einen Datenbereich von max. 1 MB zusichern sollte - laut Buch.
          Das ist schon richtig. Dies bezieht sich jedoch auf dein gesamtes Programm.
          Unter Dos wird der Speicher ueber "Segmente" angesprochen.
          Dies bedeuted du hast pro Daten-Segment 64KB. Fuer jedes Modul (Quelltext) wird ein eigenes Daten Segment angelegt wenn in den Optionen eingestellt). In Summe koennen dies mehr als 64KB sein. Jedoch pro Segment max. 64KB.

          Comment

          Working...
          X