2013-07-21 31 views
7

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?

Trả lời

-1

Nếu thẻ NIC cần phải đi qua mạng, có thể thông qua thiết bị chuyển mạch, để lấy dữ liệu từ máy chủ từ xa, 5.5us là thời gian đọc hợp lý. Nếu bạn đang đọc một thanh ghi trong thiết bị PCIe cục bộ, nó phải nhỏ hơn 1us. Tôi không có bất kỳ kinh nghiệm nào với Intel 10G NIC, nhưng đã làm việc với Infiniband và thẻ tùy chỉnh.

+0

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. –

2

5usec thật tuyệt! Làm điều đó trong một vòng lặp thống kê và bạn có thể tìm thấy nhiều giá trị lớn hơn nhiều.

Có một số lý do cho việc này. Các thanh thường không thể lưu vào bộ nhớ cache và không thể tìm nạp trước - hãy kiểm tra máy của bạn bằng cách sử dụng pci_resource_flags(). Nếu BAR được đánh dấu là có thể lưu trữ được thì cache-coherency - quá trình đảm bảo rằng tất cả các CPU có cùng giá trị được lưu trữ có thể là một vấn đề.

Thứ hai, việc đọc io luôn là vấn đề không được đăng. CPU phải dừng lại cho đến khi nó được phép giao tiếp trên một số bus dữ liệu và dừng lại một chút cho đến khi dữ liệu đến trên bus đã nói. Xe buýt này được thực hiện để xuất hiện như bộ nhớ nhưng trong thực tế thực tế là không và gian hàng có thể là một chờ đợi bận rộn không gián đoạn nhưng không hiệu quả của nó không bao giờ-the-ít. Vì vậy, tôi hy vọng độ trễ trường hợp xấu nhất sẽ cao hơn nhiều so với 5us ngay cả trước khi bạn bắt đầu cân nhắc việc sử dụng tác vụ.

Các vấn đề liên quan