2010-05-20 25 views
18

CPU x86 hiện đại có khả năng hỗ trợ kích thước trang lớn hơn so với 4K cũ (tức là 2MB hoặc 4MB) và có các cơ sở OS (Linux, Windows) để truy cập chức năng này.Trong những trường hợp nào các trang lớn có thể tạo ra một tăng tốc?

Liên kết Microsoft nêu trên các trang lớn "tăng hiệu quả của bộ đệm dịch, có thể tăng hiệu suất cho bộ nhớ thường xuyên truy cập". Điều này không hữu ích trong việc dự đoán liệu các trang lớn sẽ cải thiện bất kỳ tình huống cụ thể nào. Tôi quan tâm đến bê tông, tốt nhất là định lượng, ví dụ về nơi di chuyển một số logic chương trình (hoặc toàn bộ ứng dụng) để sử dụng các trang lớn đã dẫn đến một số cải thiện hiệu suất. Có ai có câu chuyện thành công không?

Có một trường hợp cụ thể mà tôi biết là myself: sử dụng các trang lớn có thể dramatically giảm thời gian cần thiết để chia nhỏ quy trình lớn (có lẽ là số lượng bản ghi TLB cần sao chép bị giảm theo hệ số 1000). Tôi quan tâm đến việc các trang lớn cũng có thể là một lợi ích trong các tình huống ít kỳ lạ hơn.

Trả lời

10

Tôi đã cố gắng để giành được một số mã mà sẽ tối đa hóa sự đập vỡ của TLB với 4k trang để kiểm tra các lợi ích có thể từ các trang lớn. Nội dung bên dưới chạy nhanh hơn 2,6 lần (hơn 4K trang) khi các trang 2MByte được cung cấp bởi malloc của libhugetlbfs (Intel i7, 64bit Debian Lenny); hy vọng rõ ràng những gì scoped_timerrandom0n làm.

volatile char force_result; 

    const size_t mb=512; 
    const size_t stride=4096; 
    std::vector<char> src(mb<<20,0xff); 
    std::vector<size_t> idx; 
    for (size_t i=0;i<src.size();i+=stride) idx.push_back(i); 
    random0n r0n(/*seed=*/23); 
    std::random_shuffle(idx.begin(),idx.end(),r0n); 

    { 
    scoped_timer t 
     ("TLB thrash random",mb/static_cast<float>(stride),"MegaAccess"); 
    char hash=0; 
    for (size_t i=0;i<idx.size();++i) 
     hash=(hash^src[idx[i]]); 
    force_result=hash; 
    } 

Một "đường thẳng" phiên bản đơn giản chỉ với hash=hash^src[i] chỉ tăng 16% so với các trang lớn, nhưng (hoang dã đầu cơ) của Intel fancy prefetching hardware có thể đang giúp trường hợp 4K khi truy cập có thể tiên đoán (Tôi cho rằng tôi có thể disable prefetching để điều tra cho dù đó là sự thật).

+2

Phần cứng nạp trước sẽ không vượt qua ranh giới 4k trang, nhưng những gì bạn đang có thể nhìn thấy trong trường hợp đường thẳng là truy cập bảng trang là rất có thể dự đoán, vì vậy trang đi bộ xảy ra khi bạn bỏ lỡ trong TLB có khả năng chạm trang mà là tất cả trong L1 (các mục trang này thực sự có thể đã được đưa vào thông qua tìm nạp trước). – BeeOnRope

3

Tôi đã thấy cải thiện trong một số trường hợp HPC/Grid - đặc biệt là các gói vật lý với các mô hình rất, rất lớn trên các máy có rất nhiều RAM. Ngoài ra quá trình chạy mô hình là điều duy nhất hoạt động trên máy. Tôi nghi ngờ, mặc dù chưa được đo lường, rằng một số hàm DB nhất định (ví dụ: nhập hàng loạt) cũng sẽ được hưởng lợi.

Cá nhân, tôi nghĩ rằng trừ khi bạn có hồ sơ truy cập bộ nhớ được lược tả/hiểu rõ và nó có rất nhiều quyền truy cập bộ nhớ lớn, rất có thể bạn sẽ thấy bất kỳ cải thiện đáng kể nào.

2

Tôi nhận được tăng tốc ~ 5% trên các máy chủ có nhiều bộ nhớ (> = 64GB) chạy các quy trình lớn. ví dụ: cho một quá trình java 16GB, đó là các trang 4M x 4kB nhưng chỉ có 4k x 4MB trang.

14

Sự khác biệt lớn nhất trong hoạt động sẽ đến khi bạn đang làm truy cập ngẫu nhiên cách nhau đều đặn đến một vùng rộng lớn của bộ nhớ - nơi "lớn" có nghĩa là lớn hơn nhiều so với phạm vi đó có thể được ánh xạ bởi tất cả các mục trang nhỏ ở TLBs (thường có nhiều cấp độ trong các bộ vi xử lý hiện đại).

Để làm cho mọi thứ trở nên phức tạp hơn, số lượng mục TLB cho trang 4kB thường lớn hơn số lượng mục nhập cho trang 2MB, nhưng điều này thay đổi rất nhiều theo bộ xử lý. Ngoài ra còn có rất nhiều biến thể trong số lượng mục "trang lớn" có sẵn trong TLB Cấp 2.

Ví dụ, trên một bộ xử lý AMD Opteron Family 10h Revision D ("Istanbul") hệ thống, báo cáo CPUID:

  • L1 DTLB: trang 4KB: 48 mục; 2MB trang: 48 mục; 1GB trang: 48 mục nhập
  • L2 TLB: 4kB trang: 512 mục nhập; 2MB trang: 128 mục; trang 1GB: 16 mục

Trong khi trên một hệ thống Intel Xeon 56xx ("Westmere"), báo cáo CPUID:

  • L1 DTLB: trang 4KB: 64 mục; 2MB trang: 32 mục nhập
  • L2 TLB: 4kB trang: 512 mục nhập; 2MB trang: không có

Cả hai có thể lập bản đồ 2MB (512 * 4kB) sử dụng các trang nhỏ trước khi bị 2 cấp TLB, trong khi hệ thống Westmere có thể ánh xạ 64MB sử dụng 32 mục TLB 2MB và hệ thống AMD có thể ánh xạ 352MB các mục TLB 176 2MB trong TL1 L1 và L2 của nó. Một trong hai hệ thống sẽ nhận được một tốc độ đáng kể bằng cách sử dụng các trang lớn để truy cập ngẫu nhiên trên phạm vi bộ nhớ lớn hơn 2MB và nhỏ hơn 64MB. Hệ thống AMD sẽ tiếp tục cho thấy hiệu suất tốt bằng cách sử dụng các trang lớn cho phạm vi bộ nhớ lớn hơn nhiều.

Những gì bạn đang cố gắng tránh trong tất cả các trường hợp này là trường hợp xấu nhất (lưu ý 1) kịch bản đi qua tất cả bốn cấp độ của bản dịch địa chỉ phân cấp x86_64.
Nếu không có cơ chế dịch địa chỉ bộ nhớ đệm (lưu ý 2) làm việc, nó đòi hỏi:

  • 5 chuyến đi đến bộ nhớ để tải dữ liệu ánh xạ trên một trang 4KB,
  • 4 chuyến đi đến bộ nhớ để tải dữ liệu ánh xạ trên trang 2MB và
  • 3 chuyến đi vào bộ nhớ để tải dữ liệu được ánh xạ trên trang 1GB.

Trong mỗi trường hợp chuyến đi cuối cùng vào bộ nhớ là lấy dữ liệu được yêu cầu, trong khi các chuyến đi khác được yêu cầu để có được các phần khác nhau của thông tin dịch trang. Mô tả tốt nhất mà tôi đã thấy là tại mục 5.3 của AMD "AMD64 Kiến trúc Programmer của tay Tập 2: Lập trình hệ thống" (xuất bản 24593) http://support.amd.com/us/Embedded_TechDocs/24593.pdf

Lưu ý 1: Những con số trên là không thực sự là trường hợp tồi tệ nhất. Chạy dưới một máy ảo làm cho những con số này tồi tệ hơn. Chạy trong môi trường khiến bộ nhớ giữ các cấp độ khác nhau của các bảng trang bị hoán đổi vào đĩa khiến hiệu suất nhiều hơn tệ hơn.

Lưu ý 2: Thật không may, ngay cả khi biết mức độ chi tiết này là không đủ, bởi vì tất cả các bộ vi xử lý hiện đại đều có bộ đệm bổ sung cho các cấp trên của phân cấp dịch trang. Theo như tôi có thể nói, những tài liệu này được công bố rất kém.

3

Điều này đang trở nên bí truyền, nhưng các trang TLB lớn tạo sự khác biệt đáng kể về kiến ​​trúc Intel Xeon Phi (MIC) khi thực hiện chuyển bộ nhớ DMA (từ Máy chủ đến Phi qua PCIe). This Intel link describes how to enable huge pages. Tôi thấy việc tăng kích thước chuyển DMA vượt quá 8 MB với kích thước trang TLB bình thường (4K) bắt đầu giảm hiệu suất, từ khoảng 3 GB/s xuống dưới 1 GB/s sau khi kích thước truyền đạt 512 MB.

Sau khi kích hoạt trang TLB lớn (2MB), tốc độ dữ liệu tiếp tục tăng lên hơn 5 GB/s cho chuyển DMA 512 MB.

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