T
Teralios
Gast
Gut, es war unangebracht, dass ich dich so angegangen bin, entschuldige. Aber ich würde dich an der Stelle bitten auch zu lesen, was ich geschrieben habe und ebenso bitte ich, dass du auch auf die Zeitpunkte eingehst, denn das ist jetzt wichtig.0x8100 schrieb:komm mal von der aggro-spur runter... nichts was du schreibst widerspricht dem von mir gesagten.
Vorweg: Was ich jetzt schreibe geht nun tief in die Technik hinein und in dem Fall muss ich auch sagen, dass ich dir auf der einen Seite widerspreche, gleichzeitig aber auch zustimme. Es ist jetzt aber wichtig: Es kommt drauf an!
Fangen wir an: Ja du hast recht Resizable BAR wurde bereits 2008 mit PCIe2.1 oder halt eben PCIe3 eingeführt. Wobei wir jetzt etwas genauer sein müssen: Wir sprechen von der Möglichkeit, dass man per PCIe eben nun neben 32Bit-Adressraum - bis zu 6 - auch einen großen 64Bit-Adressraum. Die bis zu 6 BARs sind wichtig für die »Gast-Virtualisierung«, deswegen benötigt VFIO auch eine Virtualisierungsunterstützung bei i386/x86/x64 eben AMD-VI oder Intel Vt-d. Aber damit genug.
Die MMIO - übernimmt das Addressmapping in der x86-CPU - ist 32Bit-Breit, BAR 64Bit. Man muss nun also aus einem 64Bit-BAR Wort eben 2 32Bit Worte für die MMIO machen. Wie das funktioniert anhand von einer Maskierung habe ich hier gezeigt 64Bit-Wortes auf 2 32Bit-Worte hier gezeigt.
Und genau das ist nun mein (1.) Punkt: Genau diese Maskierung wird im Linux-Kernel genutzt und - auch durch deinen Twitter-Einwurf - vermutlich auch unter Windows. Sie dazu pci.c. Sobald man auf PCI schreibt - PCIe baut auf PCI auf, deswegen heißt es so - findet man hier sehr viele
vfio_mask
und vfio_unmask
Funktionen und in den entscheiden Bestandteilen für die BAR findet man auch entsprechende Wortbreite der BAR, dass entsprechende Fallunterscheidungen genutzt werden. Natürlich weitaus ausgefeilter und eleganter als ich es beschrieben habe. Wir wissen also, welches Prinzip hier genutzt wird um mit den BAR-Adressen hantiert wird. Jetzt kommt der nächste Punkt: Die Entwicklung für den 64Bit-BAR wurde ab 2015 eingeleitet und erst 2017 offiziell in den Linux-Kernel aufgenommen - also zu einem Zeitpunkt, als sowohl AMD als auch Intel pdep
sehr wohl als in die x86-ISA aufgenommen wurde.Natürlich hast du recht: Diese Maskierung lässt sich auch per Bit-Operationen und Byte-Operationen nachbauen und auch das passiert im Linux-Kernel, gleichzeitig haben wir hier aber auch ein nächsten Beweis, dass, sofern möglich in der x86-Welt eben
pdep
verwendet wird:https://github.com/qemu/qemu/blob/master/target/i386/translate.c
https://github.com/qemu/qemu/blob/master/target/i386/int_helper.c
https://github.com/qemu/qemu/blob/master/disas/i386.c
Du kannst dir das nun ansehen. Man hat mit der Einführung der Maskierungsfunktionen von x86 mit der Arbeit an dem erweiterten BAR-Support begonnnen und für Hardware, die diese Funktionen nicht habe, entsprechende Helfer definiert, sodass es funktioniert.
Und damit kommen wir halt zum letzten Punkt: Natürlich kannst du die 64-Bit BAR auch nutzen, wenn eine CPU keine
pdep
oder eine ähnliche Funktion hat - man implementiert es ja für die µArch, nur die Frage ist dann: Bringt es den erhofften Leistungsschub. Wir bisher nur: pdep
wird seit Haswell als Hardware-Funktion mit einer gergingen Latenz - ich nehm jetzt einfach mal die 3 von Zen3, wenn wer die genaue Latenz kennt, bitte sagen. Excavator bis Zen 2 benötigen aber 300 Cyle und damit um den Faktor 100 mehr, in Software könnte es noch schlimmer sein, aber da habe ich keine Zahlen und jetzt auch keine Lust es zu ermitteln, wie lange es braucht. Wir wissen also: Nativ > per Microcode > per Software.Das bis jetzt sind die Fakten! Ab hier wiederum bewegen wir uns durchaus in den Vermutungen und bilden aus den Fakten als auch unserem Wissen Indizien und jetzt bitte beachten: Keiner von uns, weder @ZeroStrat noch @foo_1337 als auch haben bisher gesagt, dass es wirklich so ist, sondern dass es eine Theorie ist und in der Wissenschaft ist es erlaubt eine Theorie auf Fakten sowie auch Vermutungen aufzubauen, sofern man es argumentativ verbinden kann!
Also ja, du hast recht, dass theoretisch alle CPUs einen Support für Resizable-BAR bieten kann, sofern sie PCIe2.1 oder 3.0 beherrscht, man kann in Software sehr viel nachbilden. Die Frage ist dann aber immer: Ist es sicher (
vfio
sichert den VRAM als auch den RAM per AMD-VI als auch Intel Vd-t ab), ist es sinnvoll (ich könnte auch eine 16Bit-CPU mit einem 64Bit-Adressraum schaffen oder eine MMIO mit nur 16 Bit nutzen, um die 64Bit des BAR abzubilden, wird dann nur ein Code-Monster) und ob es auch schnell genug.Und genau dieses »Schnell genug« ist in dem Fall der wichtige Punkt und das ist etwas, was ich von Anfang angesagt habe: Ja BAR/SAM kann man vermutlich auch bei Zen 2 und davor nutzen, die Frage ist dann aber, ob es was bringen würde. Wir sehen bereits jetzt - auf Zen 3, sowie Rocket Lake? Canon Lake? ich komm da durcheinander gerade - dass SAM eben nicht in jeden Fall etwas bring (0 %) oder eben durchaus auch mal 10 % und mehr. Zen 3 braucht für die Maskierung pro Aufruf 3 Cycle und wir haben 0 % - 10 % und laut AMD im Mittel 5%. Alle Intel - seit Haswell - brauchen 3 Cycle (Ja ich weiß, ich nehme es an, wer die genaue Zahl weiß, bitte schreiben) - es zeigt sich auch hier, dass es Intel auch bis zu 10 % bringen kann. Daraus ergeben sich nun folgende Indizien:
Indiz 1:
pdep
wurde zwischen Zen 2 und 3 massiv beschleunigt - Faktor 100. Es ist durchaus valide daraus zuschließen, dass SAM also in Windows pdep
nutzt - Linux nutzt es ja, sofern möglich.Indiz 2:
pdep
wird bei allen Intel CPUs, die nun SAM nutzen können, auch schnell ausgeführt, auch hier beobachten wir die bis zu 10 %. Erneut ist es valide daraus zuschließen, dass SAM genau diese Funktion nutzt.Indiz 3: Tests zu BAR unter Linux zeigen - entschuldige, ich finde den Link gerade nicht - zeigen für BAR teilweise - auf älteren Plattformen - im Schnitt »keine« Verbesserung oder maximal 1 % - ich weiß nicht ob jetzt @foo_1337 oder @Colindo diese Ergebnisse gefunden hatte.
Indiz 4: Ist die Grafikkarte für die CPU »zu schnell«, dann zeigt BAR auf Zen 3 seine Stärken, weil die üblichen Abfragen mit 256 MB (16Bit-BAR) hier durchaus Zeit fressen. BAR mit 64Bit wiederum können bis zu 10 % bringen. Daraus ergibt sich der Schluss, dass BAR im CPU-Limit etwas bringen kann.
Und daraus kann man nun sehr wohl - alle Fakten und die Indizien - nun zumindest die These aufstellen: Sollte eine CPU
pdep
nicht nativ unterstützen oder zu langsam, dann ist der Gewinn gegenüber dem bisher verwendeten 16Bit-BAR mit 256 MB bei »Grafik« nicht vorhanden oder zu vernachlässigen.Eine »Erweiterung« der These - auch das ist valide: Sieht man sich an, dass Zen 2 um den Faktor 100 mehr Latenz hat, kann man durchaus sich Fragen, ob der klassische 16Bit-BAR nicht eventuell schneller arbeitet. Auch hier gilt: Zen 2 benötigt mindesten 300 Cycle für
pdep
. Entscheidend ist hier, wie viele 256 MB-Blöcke kann die CPU in der Zeit effektiv abfragen und wie viele benötigt sie im Schnitt.Die Kombination dieser beiden Thesen ist also: Auf Zen 2, Zen+ sowie Zen könnte es sein, dass SAM keine Leistungssteigerung bringt und im schlimmsten Fall könnte es sogar Leistung kosten.
Und jetzt kommen wir zu dem entscheiden Punk: Wir sprechen hier natürlich immer über Spiele. Bei der »Virtualisierung« - hier arbeitet man aber eher mit den bis zu 6 BARs des PCIe-Protokolls - als auch bei HPC-Anwendungen kann das schon wieder ganz anders aussehen, da stimme ich dir sogar zu und da könnte es schon wieder anders aussehen und selbst ein langsames
pdep
als auch eines per Software könnte was bringen, aber: Darum geht es in dem Fall nicht!Wir haben - also @ZeroStrat, @foo_1337 und ich - nun unsere Argumente - Fakten und Indizien - auf den Tisch gepackt und auf diesen aufbauend eine These entwickelt. Es ist nun an dir als auch die andere Person, wenn ihr diese These für falsch haltet, entweder (1.) neue Fakten zuliefern, die unsere These und/oder Indizien überholen, (2.) zu beweisen, dass unsere Indizien falsch sind oder (3.) dass unsere Schlussfolgerung auf fehlerhafter Logik beruht.
Es reicht dabei aber nicht, dass du als auch die andere Person jedes Mal behaupten, dass alles falsch ist, was wir schreiben und wir es beweisen müssen, denn das haben wir bereits getan mit den Fakten als auch Indizien und wie bereits geschrieben: In der Wissenschaft ist es valide eine Theorie auf Fakten sowie Indizien aufzubauen, sofern man es nicht besser weiß.
Deswegen jetzt als ganzes: Entweder ihr beiden schafft es nun auf einer ordentlichen Ebene argumentativ euch mit unserer These auseinander zusetzten und ihr bringt nun wirklich Gegenargumente mit Fakten sowie eigenen Indizien, dann bin ich auch gerne bereit mit dir als auch dem anderen auf einem sachlichen und auch höflicherem Niveau zu diskutieren.
-- Da es bis jetzt gedauert hat, bleibt es so stehen aber ich reagiere direkt auf deinen Beitrag
Danke, dass du diesen alternativen Code-Pfad hier anbringst, aber ich gebe da jetzt ein paar Sachen zu bedenken, ich habe den Code gesehen.
1. Brauchen wir hier die Latenzen der Befehle.
2. Brauchen wir hier auch noch die Latenz, die durch die Verwendung der SSE/AVX-Register anfällt.
3. MConst und R müssten wir noch auflösen, welche Befehle dahinter stehen.
Das heißt, ich lasse das durchaus gelten als Einwurf, aber es ist halt eben auch kein Beweis, dass unsere Schlussfolgerung falsch ist.
@foo_1337 ich bin jetzt einfach zu müde, hast du nicht Lust mal den Code durch die Maschine zu jagen?
![Zwinkern ;) ;)](/forum/styles/smilies/wink.gif)