Làm thế nào để mối quan hệ bộ xử lý Windows hoạt động với CPU siêu phân luồng?


27

Làm thế nào để mối quan hệ bộ xử lý Windows hoạt động với CPU siêu phân luồng? Chúng ta hãy sử dụng một ví dụ (trong hình) của một hệ thống có bốn lõi, mỗi lõi có lõi ảo siêu phân luồng.

  1. Những lõi nào tương ứng với từng "CPU" bên dưới?
  2. Liệu (nói) CPU 6 và CPU 7 dưới đây đại diện cho một lõi; HT và cốt lõi thực sự?
  3. Ví dụ, nếu CPU 6 đại diện cho lõi thực và CPU 7 là lõi HT, liệu một luồng được gán chỉ cho CPU7 chỉ nhận được các tài nguyên còn lại của lõi thực? (giả sử lõi đang chạy các tác vụ khác)
  4. Là siêu phân luồng được quản lý hoàn toàn trong bộ xử lý sao cho các luồng được xử lý nội bộ? Nếu vậy, đó là ở phạm vi CPU hoặc phạm vi cốt lõi? Ví dụ: Nếu CPU 6 và 7 đại diện cho một lõi, thì quá trình đó có được gán cho không vì vấn đề gì vì CPU sẽ gán tài nguyên phù hợp với luồng đang chạy?
  5. Tôi nhận thấy rằng các quy trình đơn luồng chạy dài được nảy xung quanh lõi khá ít, ít nhất là theo trình quản lý tác vụ. Điều này có nghĩa là việc chỉ định một quy trình cho một lõi sẽ cải thiện hiệu suất một chút (bằng cách tránh các chuyển đổi ngữ cảnh và vô hiệu hóa bộ đệm, v.v.)? Nếu vậy, tôi có thể biết tôi không gán cho "chỉ là một lõi ảo" không?

Đây là tất cả rất mơ hồ và khó hiểu với tôi. HT là tuyệt vời, nhưng nó chắc chắn sẽ làm giảm tính minh bạch của phân bổ tài nguyên.

Menu ái lực của bộ xử lý


Chỉ để bạn biết, mọi lõi CPU bạn thấy là một "lõi ảo". Mỗi cái có một kết nối vật lý với CPU, thuật ngữ "ảo" xuất phát từ cách Windows lên lịch xử lý trên các CPU này, do việc thực hiện siêu phân luồng phần cứng. Xem câu trả lời của tôi để biết thêm chi tiết.
Đột phá

Ngoài ra, một bình luận cuối cùng cho bạn. "HT là tuyệt vời, nhưng nó dường như làm giảm tính minh bạch của phân bổ tài nguyên." Điều này đúng 100%, nhưng có rất ít bạn có thể làm về nó, cũng không có nhiều lý do để bạn làm bất cứ điều gì về nó. Tất cả các hệ điều hành hiện đại đều biết siêu phân luồng là gì, hầu hết đều có bộ lập trình xử lý tiên tiến để bù cho nó và ngoài một số trường hợp cụ thể (và ý tôi là rất ít), hầu như luôn có lợi ích về hiệu năng.
Đột phá

Câu trả lời:


18

Những lõi nào tương ứng với từng "CPU" bên dưới?

Giả sử chúng ta có Core 1, 2, 3 và 4, CPU4 và CPU5 đại diện cho lõi 3.

Liệu (nói) CPU 6 và CPU 7 dưới đây đại diện cho một lõi; HT và cốt lõi thực sự?

Không có sự khác biệt giữa hai loại - cả hai đều có giao diện phần cứng vật lý với CPU, giao diện logic được triển khai trong phần cứng (xem Bảng dữ liệu bộ xử lý Intel Core, Tập 1 để biết thêm chi tiết). Về cơ bản, mỗi lõi có hai đơn vị thực thi riêng biệt, nhưng nó chia sẻ một số tài nguyên chung giữa chúng. Đây là lý do tại sao trong một số trường hợp, siêu phân luồng thực sự có thể làm giảm hiệu suất.

Ví dụ, nếu CPU 6 đại diện cho lõi thực và CPU 7 là lõi HT, liệu một luồng được gán chỉ cho CPU7 chỉ nhận được các tài nguyên còn lại của lõi thực? (giả sử lõi đang chạy các tác vụ khác)

Xem ở trên. Một luồng được gán cho CHỈ CPU6 hoặc CHỈ CPU7 sẽ thực thi ở cùng một tốc độ (giả sử luồng xử lý hoạt động tương tự và các lõi khác trong bộ xử lý ở trạng thái nghỉ). Windows biết về các bộ xử lý hỗ trợ HT và bộ lập lịch xử lý sẽ tính đến những điều này.

Là siêu phân luồng được quản lý hoàn toàn trong bộ xử lý sao cho các luồng được xử lý nội bộ? Nếu vậy, đó là ở phạm vi CPU hoặc phạm vi cốt lõi? Ví dụ: Nếu CPU 6 và 7 đại diện cho một lõi, thì quá trình đó có được gán cho không vì vấn đề gì vì CPU sẽ gán tài nguyên phù hợp với luồng đang chạy?

Cả hai. Bản thân phần cứng thực tế không lên lịch các lõi để chạy chương trình, đó là công việc của hệ điều hành. Tuy nhiên, bản thân CPU chịu trách nhiệm chia sẻ tài nguyên giữa các đơn vị thực thi thực tế và Intel chỉ ra cách bạn có thể viết mã để làm cho việc này hiệu quả nhất có thể.

Tôi nhận thấy rằng các quy trình đơn luồng chạy dài được nảy xung quanh lõi khá ít, ít nhất là theo trình quản lý tác vụ. Điều này có nghĩa là việc chỉ định một quy trình cho một lõi sẽ cải thiện hiệu suất một chút (bằng cách tránh các chuyển đổi ngữ cảnh và vô hiệu hóa bộ đệm, v.v.)? Nếu vậy, tôi có thể biết tôi không gán cho "chỉ là một lõi ảo" không?

Đó là hành vi bình thường và không, việc gán nó cho một lõi sẽ không cải thiện hiệu suất. Điều đó đang được nói, nếu vì một lý do nào đó bạn muốn đảm bảo một quy trình duy nhất chỉ được thực hiện trên một lõi vật lý duy nhất, hãy gán nó cho bất kỳ bộ xử lý logic đơn lẻ nào.

Lý do quá trình "nảy xung quanh" là do bộ lập lịch quy trình. Đây là hành vi bình thường và rất có thể bạn sẽ bị giảm hiệu năng bằng cách giới hạn các lõi mà quy trình có thể thực thi (bất kể có bao nhiêu luồng), vì trình lập lịch xử lý giờ phải làm việc chăm chỉ hơn để làm mọi thứ hoạt động với các hạn chế áp đặt của bạn. Có, hình phạt này có thể không đáng kể trong hầu hết các trường hợp, nhưng điểm mấu chốt là trừ khi bạn có lý do để làm điều này, đừng !


5

Bố trí CPU được cho là được tổ chức sao cho một hệ điều hành không thể nhận ra tất cả các CPU của bạn có hiệu suất tối đa có thể. Điều đó có nghĩa là một lõi ảo từ mỗi lõi vật lý sẽ được liệt kê trước khi lõi ảo thứ hai từ bất kỳ lõi vật lý nào được liệt kê.

Ví dụ: giả sử bạn có bốn lõi siêu phân luồng, được gọi là A, B, C và D. Nếu bạn giả sử A và B chia sẻ bộ đệm L2 và C và D chia sẻ bộ đệm L2, thứ tự sẽ là:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

Theo cách đó, một hệ điều hành chỉ lấy hai CPU sẽ sử dụng tất cả bộ đệm L2. Ngoài ra, một hệ điều hành chỉ lấy bốn CPU sẽ sử dụng tất cả các đơn vị thực thi.

Một lần nữa, đây là cách nó phải được.

Tất nhiên, nếu bạn đang sử dụng một hệ điều hành hiểu cấu trúc liên kết CPU của bạn, điều đó không thành vấn đề. BIOS điền vào một bảng giải thích các lõi chia sẻ các đơn vị thực thi, chia sẻ bộ đệm, v.v. Mọi hệ điều hành hiện đại mà bạn có khả năng sử dụng đều hỗ trợ đầy đủ CPU của bạn hiểu được cấu trúc liên kết CPU đầy đủ.


1
  1. Chúng tương ứng như thế nào tùy thuộc vào cách CPU & bo mạch chủ của bạn liệt kê và xác định các lõi. Điều phải xảy ra là các ổ cắm vật lý được liệt kê trước, lõi logic tiếp theo và lõi ảo cuối cùng. Trong trường hợp của bạn, lõi 0-3 phải là lõi vật lý và 4-7 lõi ​​HT ảo. Lý do chính cho điều này là trong trường hợp bạn chạy một hệ điều hành không thể xử lý tất cả các đơn vị thực thi có sẵn, rất có thể bạn sẽ nhận được các đơn vị độc lập nhất trước các đơn vị được chia sẻ. Sẽ không tốt nếu HĐH chỉ có 2 CPU giả định tìm thấy một cặp HT trong hệ thống của bạn thay vì 2 lõi riêng biệt. (Đây là một vấn đề thực sự đối với một số hệ thống HT đầu tiên, trước khi bộ lập lịch kernel có thể được cập nhật cho các CPU mới.)
  2. Không. Xem 1.
  3. Số HT phức tạp hơn thế. Hãy nhớ rằng 2 lõi ảo thường chia sẻ một số tài nguyên trong khi các bit khác được tách ra, nhưng chỉ một hoặc hai cái khác có thể được thực thi tại một thời điểm.
  4. Sắp xếp Ví dụ của bạn (đưa ra các giả định) nói chung là chính xác. Tuy nhiên, nếu ứng dụng có thể biết loại khối lượng công việc đang chạy, nó có thể giúp các hệ điều hành lập lịch xử lý các luồng một cách thích hợp.
  5. Có một lý do rất tốt cho việc nhảy lõi: Truyền tải khối lượng công việc nhiệt xung quanh. Vì trong nhiều trường hợp, bộ nhớ cache cấp cao hơn (L2, L3) được chia sẻ trên tất cả các lõi, bước nhảy lõi sẽ không có tác động hiệu suất đáng kể, nhưng tác động nhiệt sẽ rất đáng kể vì bạn sẽ không có "điểm nóng" một lõi liên tục chạy trong khi các lõi khác không hoạt động. Giờ đây, việc vượt qua các ổ cắm trong một hệ thống nhiều ổ cắm (đặc biệt là hệ thống NUMA) có thể có tác động hiệu suất đáng kể. Hầu hết các lập lịch đều nhận thức được điều này và xem xét nó mặc dù.

Cuối cùng, điều này có nghĩa là thường có rất ít bạn (với tư cách là người dùng cuối) có thể làm với mối quan hệ luồng để tác động đáng kể đến hiệu suất ngoài việc đảm bảo rằng bạn đang chạy một hệ điều hành cập nhật biết về các bit khác nhau trong hệ thống của bạn.

Nếu bạn tìm thấy bất kỳ khối lượng công việc nào trong đó việc gán ái lực bằng tay có tác động đáng kể, hãy báo cáo đó là một lỗi cho nhà phát triển ứng dụng để chương trình có thể được sửa chữa.


4
"Lõi 0-3 phải là lõi vật lý và 4-7 lõi ​​HT ảo" Trên thực tế, lõi 0 và lõi 1 tương ứng với lõi vật lý (đơn) giống nhau. Mỗi "lõi siêu phân luồng" có hai kết nối vật lý với CPU, do đó, Windows thực sự nhìn thấy 8 lõi vật lý. Nó chỉ biết rằng CPU có siêu phân luồng. Xem biểu dữ liệu Intel Core để biết thêm chi tiết về điều này nếu bạn quan tâm.
Đột phá

@BreakENC Đó không phải là một cấu trúc liên kết tốt bởi vì điều đó có nghĩa là một hệ điều hành ngây thơ chỉ được hỗ trợ 4 lõi sẽ chỉ sử dụng một nửa số lõi vật lý. Một lõi ảo từ mỗi lõi vật lý sẽ xuất hiện trong danh sách lõi ảo trước khi lõi ảo thứ hai từ bất kỳ lõi vật lý nào được liệt kê.
David Schwartz

@DavidSchwartz Cấu trúc liên kết tốt hay không, đó là cách các bộ xử lý logic liệt kê. Do đó, rất khuyến khích nên vô hiệu hóa siêu phân luồng trên các HĐH đầu tiên (ví dụ Windows 2000 trở về trước) không liệt kê chính xác LP so với lõi so với các gói CPU vật lý.
Jamie Hanrahan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.