Zauważyłem, że moje opóźnienie odczytu/zapisu MMIO jest nieuzasadnione wysokie. Mam nadzieję, że ktoś może dać mi jakieś sugestie.Opóźnienie odczytu/zapisu MMIO
W przestrzeni jądra napisałem prosty program do odczytu 4-bajtowej wartości w adresie BAR0 urządzenia PCIe. Urządzenie jest kartą PCI 10g Intel 10G i podłączoną do szyny PCIe x16 na moim serwerze Xeon E5. Używam rdtsc zmierzyć czas pomiędzy początkiem MMIO czytać i koniec, to fragment kodu wygląda następująco:
vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device
rdtscl(init);
ret = readl(vaddr);
rmb();
rdtscl(end);
Czekam czas, jaki upłynął między (koniec init) za mniej niż 1us w końcu dane przechodzące przez łącze danych PCIe powinny być tylko kilka nanosekund. Jednak wyniki mojego testu pokazują się w punkcie 5.5, aby wykonać odczyt urządzenia MMIO PCIe. Zastanawiam się, czy to jest rozsądne. Zmieniam swój kod na zdalną barierę pamięci (rmb), ale wciąż mamy około 5 lat opóźnienia.
Ten dokument wspomina o pomiarze opóźnienia PCIe. Zwykle jest to mniej niż 1us. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf Czy muszę wykonać jakąś specjalną konfigurację, taką jak jądro lub urządzenie, aby uzyskać niższe opóźnienie dostępu MMIO? lub Czy ktoś ma już takie doświadczenia?
Zmierzam mniej niż 1 nas, aby przeczytać słowo w BARie urządzeń na lokalnej magistrali PCIe. Nie wiem, dlaczego mój komentarz został odrzucony, ponieważ potwierdzam, że wyniki w gazecie są realistyczne. BAR został zmapowany w przestrzeń użytkownika, po prostu odczytaliśmy adres. Czy liczycie również czas ioremap_nocache()? Jako część mojej pracy, czytam rejestry w BARach w systemach po drugiej stronie pokoju, a zajmuje to mniej niż 5,5 nas. Używam RDMA przez Mellanox FDR Infiniband z przełącznikiem IB pomiędzy systemami. –