Ich fand meine MMIO lesen/schreiben Latenz ist unangemessen hoch. Ich hoffe, jemand könnte mir ein paar Vorschläge machen.MMIO lesen/schreiben Latenz
Im Kernelraum schrieb ich ein einfaches Programm, um einen 4-Byte-Wert in der BAR0-Adresse eines PCIe-Gerätes zu lesen. Das Gerät ist ein PCIe Intel 10G NIC und ist am PCIe x16 Bus meines Xeon E5 Servers eingesteckt. Ich RDTSC verwenden, um die Zeit zwischen dem Beginn des MMIO lesen und das Ende zu messen, sieht ein Code-Schnipsel wie folgt aus:
vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device
rdtscl(init);
ret = readl(vaddr);
rmb();
rdtscl(end);
ich die verstrichene Zeit zwischen erwarten (Ende init) auf weniger als 1 us Schließlich sollten die Daten, die die PCIe-Datenverbindung durchlaufen, nur einige Nanosekunden betragen. Jedoch zeigen meine Testergebnisse mindestens 5.5use, um ein MMIO PCIe Gerät zu lesen. Ich frage mich, ob das vernünftig ist. Ich ändere meinen Code um remote die Speicherbarriere (rmb), aber immer noch um 5 us Latenz.
Dieser Artikel erwähnt die PCIe-Latenzzeitmessung. Normalerweise ist es weniger als 1us. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf Muss ich eine spezielle Konfiguration wie Kernel oder Gerät vornehmen, um eine niedrigere MMIO-Zugriffslatenz zu erhalten? oder Hat jemand schon Erfahrungen damit gemacht?
Ich messe weniger als 1 us, um ein Wort in der BAR eines Geräts auf dem lokalen PCIe-Bus zu lesen. Nicht sicher, warum mein Kommentar abgelehnt wurde, da ich nur bestätige, dass die Ergebnisse in der Zeitung realistisch sind. Die BAR wurde in den User Space gemappt, die wir gerade gelesen haben. Zählen Sie auch die Zeit ioremap_nocache()? Als Teil meiner Arbeit, ich lese Register in BARs in Systemen im Raum, und es dauert weniger als 5,5 us. Ich benutze RDMA über Mellanox FDR Infiniband mit einem IB-Schalter zwischen den Systemen. –