2012-11-20 47 views
8

Tôi đang nêu lên một thắc mắc liên quan đến hướng dẫn MONITOR-MWAIT và HLT. Cả hai tạm dừng bộ vi xử lý, cả hai đều tỉnh dậy trên các bộ kích hoạt bên ngoài khác nhau (ngắt vv).MWAIT và HALT về hiệu quả

Trong các thí nghiệm của tôi, HLT và chức năng MWAIT gần như giống nhau, khi chụp trong tài khoản:

  • Nếu bạn là không scheduler OS, một vòng lặp đơn giản với các hướng dẫn nêu trên, sẽ bị gián đoạn khá nhanh chóng, và vì MWAIT yêu cầu kiểm tra lại điều kiện giữa MONITOR và MWAIT, sự khác biệt là gì? (những gì tôi hỏi là, tại sao không sử dụng HLT ở vị trí đầu tiên, và tiết kiệm nỗi đau của việc phân bổ vùng truy tìm (trong đó, nếu không được cấu hình cẩn thận, tránh cơ chế mon/mwait và biến nó thành NOP), vì nếu bạn ' không phải là lịch trình hệ điều hành, không có cơ hội bạn sẽ không thức dậy đủ nhanh để chỉ cần kiểm tra giá trị trong một vòng HLT ... ???

(chắc chắn, MWAIT có thể cao hơn res, i haven 't đo độ phân giải, nhưng có vẻ như nó over-wake-up bởi (tôi giả định) ngắt và như vậy) .. vì vậy tôi không thể nhìn thấy lợi thế lớn.

Cảm ơn, Bất kỳ suy nghĩ theo cách đó sẽ rất nhiều được đánh giá cao

Trả lời

11

Để thực hiện; những gì quan trọng nhất là thời gian cần cho CPU để thoát khỏi trạng thái "chờ đợi" của nó bất cứ khi nào nó đang chờ (IRQ cho HLT, hoặc IRQ hoặc ghi nhớ cho MWAIT) xảy ra. Hiệu ứng này có độ trễ - ví dụ: mất bao lâu trước khi một trình xử lý ngắt được bắt đầu hoặc trước khi một công việc chuyển đổi thực sự xảy ra. Thời gian thực hiện cho một CPU để ra khỏi trạng thái chờ đợi của nó là khác nhau cho các CPU khác nhau, và cũng có thể hơi khác nhau đối với HLT và MWAIT trên cùng một CPU.

Điều tương tự cũng áp dụng cho điện năng tiêu thụ - điện năng tiêu thụ trong khi chờ đợi có thể thay đổi rất nhiều giữa các CPU khác nhau (đặc biệt là khi bạn bắt đầu nghĩ về những thứ như siêu phân luồng); và tiêu thụ điện năng của HLT so với MWAIT cũng có thể hơi khác trên cùng một CPU.

Để sử dụng, chúng dành cho các tình huống khác nhau. HLT là để chờ đợi một IRQ, trong khi MWAIT là để chờ đợi cho một ghi nhớ xảy ra. Tất nhiên nếu bạn đang chờ ghi nhớ xảy ra thì bạn cần phải quyết định xem IRQ có nên làm gián đoạn việc chờ đợi của bạn hay không (ví dụ: bạn có thể thực hiện CLI rồi MWAIT nếu bạn chỉ muốn đợi ghi nhớ).

Tuy nhiên, đối với các hệ thống đa tác vụ, chủ yếu là cả hai đều chỉ được sử dụng cho cùng một thứ - trong các bộ lập lịch nơi CPU không hoạt động. Trước khi MONITOR/MWAIT được giới thiệu, các nhà lập kế hoạch sẽ sử dụng HLT trong khi chờ đợi công việc phải làm (để giảm tiêu thụ điện năng một chút). Điều này có nghĩa rằng nếu một CPU khác unblocks một nhiệm vụ nó không thể chỉ đặt nhiệm vụ đó vào hàng đợi của scheduler và phải gửi một (tương đối đắt) "inter-processor interrupt" tới CPU HLTed để loại bỏ nó ra khỏi trạng thái HLT của nó CPU sẽ tiếp tục làm gì khi có công việc có thể/nên làm). Với MWAIT, "gián đoạn bộ vi xử lý liên" này là (có khả năng) không cần thiết - bạn có thể đặt MONITOR để xem để ghi vào hàng đợi của lịch trình, để hành động đưa nhiệm vụ vào hàng đợi là đủ khiến CPU chờ đợi dừng .

Cũng đã có một số nghiên cứu về việc sử dụng MONITOR/MWAIT cho những thứ như khóa spinlocks và đồng bộ hóa (ví dụ: chờ khóa khóa được phát hành). Kết quả cuối cùng của nghiên cứu này là thời gian để CPU thoát khỏi trạng thái "chờ đợi" quá cao và sử dụng MONITOR/MWAIT như thế này gây mất quá nhiều hiệu năng (trừ khi có lỗi thiết kế - ví dụ như sử dụng spinlock khi bạn nên sử dụng một mutex).

Tôi không thể nghĩ ra bất kỳ lý do nào khác (ngoài lập lịch và khóa/đồng bộ hóa) để sử dụng HLT hoặc MWAIT.

+0

Brendan, Cảm ơn rất nhiều về cái nhìn tổng quan rất nhiều thông tin này, Bạn chắc chắn đã xóa được sương mù tôi có xung quanh vấn đề này. Tôi đã nghĩ đến việc sử dụng mon/mwait để đồng bộ hóa giữa chủ đề và HW (để tránh setEvent từ DPC đến sau mỗi lần ngắt từ HW). Dường như độ trễ xung quanh WaitForSingleObj và SetEvent, so với một spinlock trong chuỗi chờ đợi (và var toàn cục), cao hơn nhiều, vì vậy mwait có vẻ như một điểm nào đó ở giữa .. –

3

MONITOR/MWAIT nên có thể sử dụng được "cho những thứ như spinlocks và đồng bộ hóa (ví dụ: chờ khóa bị khóa được giải phóng)."

Tuy nhiên, MONITOR/MWAIT (a) vì lý do đáng kinh ngạc và gây phiền nhiễu phải bị hạn chế chỉ được sử dụng bởi mã hạt nhân của vòng 0, không phải mã người dùng và (b) được tải xuống với mã micro. trạng thái ngủ.

Một số công ty đã triển khai các hướng dẫn tương tự hoặc tương đương tốt hơn, ví dụ: LL/PAUSE tương đương với MONITOR/MWAIT.

+0

KNL thực hiện vòng 3: https://software.intel.com/en-us/blogs/2016/10/06/intel-xeon-phi-product-family-x200-knl-user-mode-ring-3-monitor-and-mwait – Jeff

+0

Cảm ơn các tin tức về chế độ người dùng MWAIT trong KNL. Tôi mong được thấy dữ liệu hiệu suất. Tôi đoán là trừ khi họ đã thực hiện dự đoán chi nhánh microcode, nó sẽ khá chậm. –

+0

Những gì các đồng nghiệp đã nói với tôi là một vòng quay được điều chỉnh cẩn thận với hướng dẫn tạm dừng nhanh hơn màn hình-mwait, nhưng nếu một người sẵn sàng giao dịch một chút độ trễ, thì giám sát-mwait sẽ là khả thi. Ngay cả khi lợi ích trực tiếp không có ở đó, có một lợi ích gián tiếp khổng lồ từ các chủ đề phần cứng đỗ xe trong một môi trường bị hạn chế về quyền lực, mà nhiều siêu máy tính đang có.Nếu bạn có điểm chuẩn, hãy liên hệ với tôi một cách riêng tư và tôi sẽ cố gắng cung cấp cho bạn một số dữ liệu. – Jeff

7

Lệnh HLT thực hiện trạng thái công suất nhàn rỗi nông nhất (C-State) có sẵn cho một chuỗi riêng lẻ, trong khi lệnh MWAIT cho phép bạn yêu cầu tất cả trạng thái nguồn không có sẵn cũng như các trạng thái con.

Ở cấp phần cứng, thực thi HLT tương đương với thực thi MWAIT với gợi ý trạng thái 0. Điều này đặt bộ xử lý ở trạng thái C1, là xung đồng hồ cho lõi. Nếu bạn muốn nhập C-States sâu hơn để cấp nguồn cho lõi và có khả năng cấp nguồn cho gói, bạn phải sử dụng MWAIT.

Luôn có sự cân bằng giữa tiết kiệm năng lượng và độ trễ thoát cho các trạng thái nguồn khác nhau. C-State càng sâu, tiết kiệm điện nhiều hơn, nhưng càng mất nhiều thời gian để thoát khỏi C-State. Bạn cũng nên lưu ý rằng các bộ vi xử lý x86 hiện đại sẽ giới hạn độ sâu của trạng thái nguồn dựa trên tần số ngắt (tức là nếu bạn nhận các sự cố ngắt mỗi 1 chúng ta, phần cứng sẽ không cố gắng vào một C-State với một lối ra 2 chúng ta độ trễ).

Ngoài phần cứng ức chế C-State đã nhập, một số C-Bang chỉ có thể được nhập thông qua sự phối hợp giữa các luồng. Ví dụ, trên một bộ xử lý Intel x86 với Hyper-threading, cả hai luồng trong lõi phải yêu cầu một C-State có nguồn điện để thực hiện ở cấp độ lõi và tương tự tất cả các lõi trong một gói phải yêu cầu một gói- trạng thái C-trạng thái cấp điện để cấp điện xảy ra ở mức gói. Phần cứng thường tuân theo yêu cầu cạn nhất, vì vậy nếu 1 chuỗi yêu cầu C1 và một yêu cầu C3 khác, bộ xử lý sẽ vào C1.

Nếu bạn không kiểm soát hệ điều hành, thì đó thực sự là điểm tranh luận (vì MWAIT chỉ khả dụng ở CPL0). Nếu bạn "sở hữu" hệ điều hành, thì hầu như luôn có ý nghĩa khi sử dụng MWAIT thay vì HLT, vì nó giúp tiết kiệm năng lượng cao hơn nhiều trong nhiều trường hợp và cung cấp quyền truy cập vào cùng trạng thái nguồn không hoạt động mà HLT thực hiện.