News Smart Access Memory: Ryzen 3000 und Vorgängern fehlt es an Hardware-Support

@ZeroStrat

der Tweet ist durchaus interessant, aber wir müssen hier jetzt durchaus etwas aufpassen. Wir haben bereits festgestellt, dass es pext und pdep nicht braucht, aber dass diese Funktionen verwendet werden, sofern sie vorhanden sind, weil die PCI-Kommunikation auch über diese Masken arbeitet.

Das Addressmapping ist jedoch nicht in der pci.c, sondern das ist im Treiber (amdgpu) und da wird es dann kompliziert und auch hier ist es so, dass ich über viele Dateien hinweg den Hinweis finde, dass für die VRAM-Verwaltung entsprechende Maskierungsfunktionen genutzt und gesetzt werden. Hier wird es zum Beispiel erneut angedeutet: amdgpu_mes.h. Es geht dann von hier aus dann in den Bereich DMA und ebenso VFIO und zum Beispiel hier findet man dann wieder den Verweis darauf, dass Adressen maskiert werden: sta2x11-fixup.c werden. Geh ich dann auf die passenden Compiler-Anweisungen, wird wieder, wenn möglich pdep und pext verwendet, es gibt aber eben auch alternative Funktionen.

Nur muss ich jetzt auch ehrlich dazu sagen, dass wir jetzt in einem Bereich sind, in dem ich mich eben auch nicht mehr auskenne und auch nur noch raten kann. Das Problem ist, dass wir hier nicht nur im PCI-Subsystem sind, sondern ebenso in dem DMA-Subsystem - hier finde ich Hinweise auf die Maskierung von Adressen mit Bit-Masken alleine wegen der Sicherheit. Im VFIO-System finde ich diese Hinweise, damit die Adressen in CPU gemappt werden. Zum Beispiel hier:
Code:
static void vfio_bar_fixup(struct vfio_pci_device *vdev)
{
    struct pci_dev *pdev = vdev->pdev;
    int i;
    __le32 *vbar;
    u64 mask;

    if (!vdev->bardirty)
        return;

    vbar = (__le32 *)&vdev->vconfig[PCI_BASE_ADDRESS_0];

    for (i = 0; i < PCI_STD_NUM_BARS; i++, vbar++) {
        int bar = i + PCI_STD_RESOURCES;

        if (!pci_resource_start(pdev, bar)) {
            *vbar = 0; /* Unmapped by host = unimplemented to user */
            continue;
        }

        mask = ~(pci_resource_len(pdev, bar) - 1);

        *vbar &= cpu_to_le32((u32)mask);
        *vbar |= vfio_generate_bar_flags(pdev, bar);

        if (*vbar & cpu_to_le32(PCI_BASE_ADDRESS_MEM_TYPE_64)) {
            vbar++;
            *vbar &= cpu_to_le32((u32)(mask >> 32));
            i++;
        }
    }

    vbar = (__le32 *)&vdev->vconfig[PCI_ROM_ADDRESS];

    /*
     * NB. REGION_INFO will have reported zero size if we weren't able
     * to read the ROM, but we still return the actual BAR size here if
     * it exists (or the shadow ROM space).
     */
    if (pci_resource_start(pdev, PCI_ROM_RESOURCE)) {
        mask = ~(pci_resource_len(pdev, PCI_ROM_RESOURCE) - 1);
        mask |= PCI_ROM_ADDRESS_ENABLE;
        *vbar &= cpu_to_le32((u32)mask);
    } else if (pdev->resource[PCI_ROM_RESOURCE].flags &
                    IORESOURCE_ROM_SHADOW) {
        mask = ~(0x20000 - 1);
        mask |= PCI_ROM_ADDRESS_ENABLE;
        *vbar &= cpu_to_le32((u32)mask);
    } else
        *vbar = 0;

    vdev->bardirty = false;
}

Und genau das ist hier der Punkt: Auch im weiteren Verlauf finden sich diese Hinweise, wenn mit Memory-Adressen gearbeitet wird und dass diese für PCI und die BAR-Breite oder für die CPU und MMIO usw. transformiert werden.

Wir wissen also: Die Adresse werden per Masken verarbeitet. Wir wissen ebenso, wenn möglich werden die Funktionen der CPU genutzt. Wir wissen ebenso: Sie sind nicht notwendig, es gibt ein »Workaround« dafür und jetzt kommt das Letzte: Wir wissen nun, dass rBAR - mit Workaround - keinen nennenswerten Leistungsvorteil bringt, wenn man aber rBAR aktiviert und die langsamen Codes nutzt, langsamer ist, als wenn man den Workaround nutzt.

Nur: Wir bewegen uns jetzt wirklich auf Systemprogrammierung und da kenne ich mich eben nicht aus, ich kenne die Grundlagen, die Techniken, aber nicht die Feinheiten! Sehe ich mir den Code an, wende mein Grundlagenwissen an, gehe ich durch die Dateien, finde ich die »Bestätigungen« für unseren Verdacht, gleichzeitig findet man aber eben nicht den finalen Beweis, denn dafür ist das viel zu aufwendig.

Die anderen haben es leicht, die müssen nur schreiben, dass es nicht stimmt, warum es nicht stimmt, sagt von den ja keiner. Würden die wirklich »wissenschaftlich« arbeiten, dann käme wenigstens ein: Deswegen liegt ihr falsch. Nur die meisten, die sagen das wir falsch liegen, haben noch weniger Ahnung als wir, die sagen nur pauschal alles falsch, weil sie es falsch haben wollen!
 
  • Gefällt mir
Reaktionen: Piktogramm, LukS, ZeroStrat und eine weitere Person
Vielleicht fühlt sich, nachdem recht viele Tech Seiten darüber geschrieben haben, AMD nun doch dazu berufen, ein Statement abzugeben :)
 
ZeroStrat schrieb:
Ok, ab jetzt wird's richtig kompliziert. Schade, dass von AMD kein Statement kommt.
Natürlich wird es kompliziert, die RAM-Verwaltung ist Aufgabe der CPU + des OS und wenn man den vRAM per BAR in die CPU mappt und noch absichert, dann sind da einige Subsysteme beteiligt.

Es wird ja sogar angedeutet, dass rBAR auf AMD-Vi und eben Intel VT-d zurückgreift, also sind es wohl die VFIO, da haben wir den »Beweis« dass die Adressen gemappt werden, doch am Ende? Muss wieder nur einer sagen, dass es nicht stimmt.

Gehe ich dann auf WDDMv2 und v2.7 und beachte, dass sie hier von virtuellem VRAM-Adressierung sprechen, wird es noch komplizierter, weil dann auch dein Hinweis mit dem statischen Mappen durchaus realistisch erscheint, dass man die Funktionen nur am Anfang braucht, wenn man da dann wieder durch geht, findet man wieder Indizien, dass wir recht haben, weil dort sogar auf ein IOMMU-Model verwiesen wird und geht man die WDDMv2 - 2.7 Dokumentation durch, wird für die Adressen sogar entsprechende Konvertierungsmethoden angeboten und das beste ist sogar: Man findet sogar den Hinweis, das hier wieder mit 32Bit - MMIO - gearbeitet wird und da entsprechend auch die 256MB RAM pro Tile erklärt, da ja noch die Device-ID gebraucht wird, damit man weiß zu welchem Device der RAM gehört. 28 Bit für Adressen, 4 Bit für die Devices, wobei man ja sogar noch die Page-Size einstellen kann, damit man mehr Bits für Device usw. freibekommt.

Man kann also an allen Stellen nachweisen, dass auf die 32Bit MMIO geachtet wird, und dass die Adressen der BARs entsprechend angepasst werden müssen, alleine wegen den Device-IDs usw.

Sprich, eine einfache Teilung von 64Bit-BAR in 2 * 32 Bit für die MMIO funktioniert nicht, weil die Device-ID verloren geht! -- Edit -- Allgemein würde sie nicht gehen, weil man sogar erkennen müsste, welche "low" und welche "high" ist bei der Adressierung, es geht also ohnehin mindesten 1 Bit drauf von den 32 Bit bei der Adresse um zu wissen, ob man den High oder Low-Teil hat, weil das in der Tabelle dann nicht erkennbar ist und auf die Dopplung von Adressen hab ich ja schon hingewiesen. Und selbst dann muss man ja auch noch wissen zu welchem Device die Adresse gehört, weiß man das nicht, hat es null Sinn.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: foo_1337 und ZeroStrat
Na ja, die einfachste Erklärung ist - und da kjann er sich auch die WDDM Dokumentation ansehen: Die MMIO, über die die Adressen der GPU angesprochen wird, verstehen nur 32 Bit, die 64Bit-BAR-Adresse muss also für die MMIO in 32 Bit umgewandelt werden.
https://docs.microsoft.com/en-us/windows-hardware/drivers/display/gpu-virtual-memory-in-wddm-2-0

1. https://docs.microsoft.com/en-us/windows-hardware/drivers/display/gpummu-model
2. https://docs.microsoft.com/en-us/windows-hardware/drivers/display/iommu-model

Verweisen beide auf: https://docs.microsoft.com/en-us/wi...ddi/d3dumddi/nc-d3dumddi-pfnd3dddi_allocatecb

Teil des: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/d3dumddi/

Und dort wird eben angeben, dass man entsprechende Konvertierungen implementieren muss, damit die BAR-Adressen in die MMIO-Register passen.
 
  • Gefällt mir
Reaktionen: ZeroStrat
@ZeroStrat
das lustige ist ja, dass er uns erst mal widerspricht der Entwickler von Unity, dann aber einräumt, dass man das für Transformation braucht die Funktioenn, damit es schnell geht und damit quasi wieder unsere Sache bestätigt, der Kerl ist kein Treiber-Entwickler und damit nicht auf der Hardware-Ebene, also ja, das was er zu dem code da sag ist also auch wieder nur: Ich widerspreche, weil ich widersprechen will.
 
  • Gefällt mir
Reaktionen: foo_1337
Ist er nicht der Chef-Entwickler bei Unity? Der ist ziemlich kompetent, macht viel Low Level und Compiler Kram.
 
@ZeroStrat
Ich spreche ihm ja nicht seine Kompetenz ab, sondern ich ärgere mich mal wieder darüber, dass hier einfach nur geschrieben wird, dass es nicht notwendig ist, im weiteren Verlauf gesteht er dann aber zu, dass man damit die Maskierung mit Bit-Masken beschleunigt.

Wir haben nun an zig Stellen nun jedoch die Hinweise, dass für rBAR die 64 Bit auf die 32 Bit der MMIO gemünzt werden müssen und ebenso, dass diese Konvertierung in der »Interface-Datei« von Windows vorhanden ist. Genau so - und das ist ja jetzt der nächste Punkt: Selbst wenn diese 64 Bit auf 32 Bit nicht im »Programm« gemacht werden, dann wird das per UEFI gemacht und dann ist die Frage, wie es im UEFI gemacht wird und auch da können wir nicht wissen, ob AMD dann für den UEFI-Part eben nicht doch auf diese Funktionen zurückgreift um MMIO >4GB umzusetzen.

Verstehst du jetzt, warum ich da gerade angepisst bin und sage, dass hier wieder erst mal Widersprochen wird um des Widerspruchswillen, aber keine neue Informationen vorhanden sind? Er kann der God-Father of Engine sein: ICH WILL INFORMATIONEN! ICH WILL ES WISSEN! Ich will nicht einfach hören, dass ich falsch liege, sondern ICH WILL WISSEN WARUM!
 
  • Gefällt mir
Reaktionen: Tanzmusikus, Piktogramm und foo_1337
Hab AMD ja schon ge@et auf Twitter. Leider reagieren fast immer nur die falschen. :D

Aber was sollen sie auch sagen? Zen 2 hat das Feature nicht, das Haswell schon hat?

Da denken sich die Leute doch, whut, wie mager ist das denn bitte?
 
ZeroStrat schrieb:
Aber was sollen sie auch sagen? Zen 2 hat das Feature nicht, das Haswell schon hat?
Aber ist das nicht wiederum zumindest als Indiz zuwerten, dass wir richtig liegen?
Ergänzung ()

Auch wenn ich ggf. mit den 32 Bit MMIO mich verrenne - ich bin mir da nicht mehr 100% sicher, vergessen die Leute dennoch, dass trotzdem eine Übersetzung der Adressen in der CPU hin zur GPU gemacht werden muss. Das Mappen eben, und auch Dort sind diese Bit-Maskierungen gebräuchlich und damit eine Hardware funktion schneller. Auch wegen der RAM Sicherung.

Mir sind da jetzt aber zu viele Informationen, da hier sowohl BIOS, Treiber, OS und Co involviert sind. Im Endeffekt müsste man hier die CPU analysieren, wie sie intern arbeitet beim Mappen, das BIOS und wie die Memory-Verwaltung von Windows arbeitet und darauf aufbauend die Treiber - Stichwort, Speicherschutz usw.

Ne ich steig aus, das ist ein Vollzeitjob das zu "reverse" zu entwickeln, ich bekomme hier für kein Geld, also,lass ichs.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Tanzmusikus, Piktogramm und foo_1337
Die Bekanntesten, die ich anhauen kann, damit die mal bei AMD nachhaken, sind Digital Foundry. Das mache ich morgen. Und dann wars das auch für mich mit dem Thema.
 
  • Gefällt mir
Reaktionen: Tanzmusikus
Das doofe ist, dass selbst bei Intel die Sheets nicht sehr viel hergeben, weil halt auch noch verschiedne Modi existieren:
https://www.intel.com/content/dam/w...families-datasheet-vol-2-datasheet.pdf#page10

DMI, DMI über Vt-d, MCBAR, dann findest du mal wieder, das bei PCIe alles über 32 Bit noch malm dann wieder hinweise, dass man nicht die vollen 32 Bit hat wegen den Device IDs usw.

Ne danke, ich bin raus und erkläre offiziell: Ich liege falsch, mit allem und die Antwort ist 42, selbst wenn ich doch richtig liege, ich liege falsch und die antwort bleibt 42.
 
Das hier ist bisher das einzige offizielle Statement zu dem Thema.:
https://np.reddit.com/r/Amd/comments/jwji3n/amd_where_gaming_begins_ama_november_18_2020/gcqpvsi/
Azor sagte dann wohl noch in einem Interview: "look into it and see if it is going to be possible to do it with any performance uplift and any reliability, and please stay tuned." (
)
Hilft natürlich beides überhaupt nicht.
 
Zuletzt bearbeitet von einem Moderator:
ZeroStrat schrieb:
Er meint, dass rBar nichts mit pdep/pext zu tun hat. Es geht wohl nur um Tiling von Texturen.

@foo_1337 @Teralios @0x8100

Ja, das wuerde wesentlich mehr Sinn ergeben als die Adressierungstheorie. Letztere hat ja das Problem, dass nicht erklaerbar ist, warum man diese speziellen Funktionen wirklich 1 Million mal pro Frame aufrufen muesste (denn grob diese Groessenordnung ist ja notwendig, um den beobachteten Performance-Unterschied zu erklaeren). Bzgl. Texturtransformationen sind aber verschiedene plausible Faelle denkbar, in denen tatsaechlich 1 Million solche Transformationen notwendig waeren.

Dann ist aber wieder unklar, warum man so eine Transformation ueberhaupt auf der CPU ausfuehren wollen wuerde, wenn die GPU solche Bittransformationen sowieso viel schneller ausfuehren kann als die CPU, mit oder ohne pdep/pext? Und, selbst wenn man es auf der CPU ausfuehren moechte: Warum macht man es nicht einfach in einem separaten Thread oder parallel?

Irgendwie fehlen da immernoch wesentliche Informationen... es sieht aber zunehmend so aus, dass es zwar keinen wirklichen Performance-relevanten Grund gibt, diese Funktionen zu verwenden, aber dass es allgemein hinreichend viele Unterschiede zwischen Zen 2 und Zen 3 gibt, dass es fuer AMD zumindest ein gewisser Zusatzaufwand waere, SAM fuer Zen 2 zu optimieren. Und, das zu tun ergibt fuer AMD aus marktwirtschaftlicher Sicht einfach nicht viel Sinn, da es sie nicht nur Geld in Form von Gehaeltern fuer hochqualifizierte Programmierer kostet, sondern sogar die Zen 3 Verkaeufe verringern koennte. Eine ganz aehnliche Situation gab es ja auch zum Thema der Kompatibilitaet von Zen 3 mit B450 Mainboards: Auch da wurde zunaechst behauptet, dass aus irgendeinem fadenscheinigen technischen Grund Zen 3 nicht auf B450 laufen koenne, aber tatsaechlich gab es garkein fundamentales technisches Problem, es gab nur einfach (zunaechst) keinen Anreiz fuer AMD und die Mainboard-Hersteller, die entsprechenden BIOSe zu programmieren, bis dann AMD und die Mainboardhersteller auf hinreichend viel oeffentlichen Druck doch reagieren mussten.

Sollte also auch hier genuegend "Laerm" bzgl. SAM auf Zen 2 gemacht werden, wird AMD irgendwann reagieren, und SAM auch fuer Zen 2 implementieren - oder es wird niemals ein wirklich klares Statement von AMD zu dem Thema geben, weil es nicht im Interesse von AMD ist, dieses Thema zu klaeren.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Tanzmusikus
Teralios schrieb:
[...]

Und dort wird eben angeben, dass man entsprechende Konvertierungen implementieren muss, damit die BAR-Adressen in die MMIO-Register passen.

In diesen Artikeln werden zwar verschiedene Memory-Remappings beschrieben, aber sie haben nichts mit den von dir beschriebenen MMIO-Registern zu tun, und die von dir postulierte 32-bit Limitation wird auch an keiner Stelle erwaehnt.
 
Zurück
Oben