Tôi thấy độ trễ đọc/ghi MMIO của tôi là cao bất hợp lý. Tôi hy vọng ai đó có thể cho tôi một số gợi ý.Độ trễ đọc/ghi MMIO
Trong không gian hạt nhân, tôi đã viết một chương trình đơn giản để đọc giá trị 4 byte trong địa chỉ BAR0 của thiết bị PCIe. Thiết bị này là một NIC Intel 10G PCIe và được cắm vào bus PCIe x16 trên máy chủ Xeon E5 của tôi. Tôi sử dụng RDTSC để đo thời gian giữa đầu MMIO đọc và cuối cùng, một đoạn mã trông như thế này:
vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device
rdtscl(init);
ret = readl(vaddr);
rmb();
rdtscl(end);
Tôi mong thời gian trôi qua giữa (kết thúc, init) để được ít hơn 1us , sau khi tất cả, dữ liệu đi qua liên kết dữ liệu PCIe sẽ chỉ là một vài nano giây. Tuy nhiên, kết quả thử nghiệm của tôi cho thấy tại thuê 5.5use để làm một thiết bị MMIO PCIe đọc. Tôi tự hỏi liệu điều này có hợp lý không. Tôi thay đổi mã của tôi để từ xa các rào cản bộ nhớ (rmb), nhưng vẫn nhận được khoảng 5 độ trễ của chúng tôi.
Bài báo này đề cập đến phép đo độ trễ PCIe. Thông thường nó nhỏ hơn 1us. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf Tôi có cần phải thực hiện bất kỳ cấu hình đặc biệt nào như hạt nhân hoặc thiết bị để có độ trễ truy cập MMIO thấp hơn không? hoặc Có ai có kinh nghiệm làm điều này trước đây không?
Tôi đo ít hơn 1 người để đọc một từ trong BAR của một thiết bị trên xe buýt PCIe địa phương. Không chắc tại sao bình luận của tôi lại bị bỏ phiếu vì tôi vừa xác nhận kết quả trong bài báo là thực tế. BAR đã được ánh xạ vào không gian người dùng, chúng tôi chỉ đọc địa chỉ. Bạn đang đếm thời gian ioremap_nocache()? Là một phần công việc của tôi, tôi đọc sổ đăng ký trong BAR trong các hệ thống trong phòng, và phải mất ít hơn 5.5 chúng tôi. Tôi đang sử dụng RDMA trên Mellanox FDR Infiniband với một chuyển đổi IB ở giữa các hệ thống. –