Tại sao một luồng duy nhất trải đều trên CPU?


24

Tôi chỉ tò mò tại sao bộ lập lịch liên tục di chuyển một ứng dụng giữa các CPU, thay vì giữ nó trên một. Có vẻ hơi ngớ ngẩn khi có 4 lõi ở mức 25% thay vì một lõi 100%.

Nó có phải làm với nhiệt, hoặc nó hiệu quả hơn bằng cách nào đó? Các hệ điều hành khác có làm khác đi không?

Thông tin chi tiết hoặc liên kết đến các công cụ chuyên sâu sẽ tốt đẹp. (Không thể tìm thấy nhiều bản thân mình.)

Cập nhật:

Bằng cách "trải ra" tôi không có nghĩa là nó thực thi trên một số cpu cùng một lúc, nhưng được chuyển từ cái này sang cái khác vài lần mỗi giây, tạo ra hiệu ứng mà nó trông có vẻ lan rộng.


3
Ngay cả khi "không có gì khác đang thực thi", luôn có các luồng hệ thống cạnh tranh cho CPU. Ví dụ: O / S có một luồng để loại bỏ các trang bộ nhớ được thu hồi để khi cần bộ nhớ, nó sẽ có một số trang sẵn sàng hoạt động. Khi luồng của bạn thực thi lại, cpu bạn đang sử dụng có thể được sử dụng bởi một trong những luồng này. Os nên làm gì? Đợi nó hoặc chuyển bạn đến một cpu mới? Những gì nó làm, bạn kết thúc với hành vi không mong muốn trong một số trường hợp.
Tony Lee

Đó là một goomba. SMB, không phải LBP. :)
Macke

Trong "câu trả lời" của mình, tôi đã cho thấy một chương trình luồng đơn hoạt động chính xác như bạn mô tả, tức là "được di chuyển từ cái này sang cái khác vài lần mỗi giây, tạo ra hiệu ứng mà nó trông có vẻ lan rộng ra."
Evan Rosica

Câu trả lời:


8

Tôi nghĩ rằng wierobđã mô tả điểm khá tốt.
Dưới đây là một bài viết cũ hơn thảo luận về processor affinitycài đặt với QX6800 lõi tứ .
(liên kết trỏ đến trang thứ hai của bài viết đó).

Nếu bạn không ép buộc quá trình mối quan hệ với cốt lõi, bạn có mất hiệu suất không?

  • Trong khi lịch trình của Windows cần phải quyết định mối quan hệ như vậy để tránh đòn với bộ nhớ đệm,
    các thiết kế bộ vi xử lý riêng của mình cũng coi những việc như vậy.
  • Intel QX6800 quad-core (kể từ khi tôi tham khảo nó trước đó trong câu trả lời này)
    8MB L3bộ nhớ cache chia sẻ trên 4 lõi của nó .

Cần lưu ý rằng mặc dù bạn có thể đã chọn chỉ chạy một quy trình đơn luồng này trên hệ thống, nhưng bản thân HĐH sẽ có một số tác vụ khác đang chạy cũng cần được lên lịch. Bộ lập lịch cân bằng tất cả hoạt động này trên nhóm bộ xử lý có sẵn (hoặc lõi).


Đi về phía trước, với kiến trúc NehalemNUMA ,
bộ xử lý trên nhiều ổ cắm cũng sẽ có thể giải quyết tốt hơn truy cập truy cập.
Dưới đây là hình ảnh nhanh từ trang ArsTechnica trên NUMA .

nhập mô tả hình ảnh ở đây

Nếu Nehalem và i7bạn quan tâm, tôi có thêm một số liên kết tại câu trả lời này .


Điều gì khiến bạn nghĩ rằng "Đi về phía trước, với kiến ​​trúc Nehalem và NUMA, bộ xử lý trên nhiều ổ cắm cũng sẽ có thể giải quyết tốt hơn việc truy cập truy cập." ? Như tôi thấy, NUMA làm cho bộ nhớ thậm chí liên quan đến bộ xử lý cục bộ và cụ thể hơn, do đó làm giảm hiệu ứng của rác.
Roland Pihlakas

@RolandPihlakas, đã có một thời gian kể từ câu trả lời này, nhưng nhìn vào bài báo của arstechnica và những điểm này tôi nghĩ rằng tôi đang tính đến khả năng các nền tảng mới có khả năng kết nối bộ nhớ tốt hơn và phần mềm tận dụng lợi thế đó (không có tùy chọn đó với nhiều cấu hình ổ cắm tại thời điểm đó, tức là trước Nehalem).
nik

6

Bộ lập lịch chỉ thực hiện luồng tiếp theo đã sẵn sàng để thực thi trên lõi / CPU "miễn phí".

Bạn có thể chỉ định một quy trình cho một CPU cụ thể thông qua trình quản lý tác vụ Windows.

Có 4 lõi ở mức 25% có nghĩa là 4 luồng được thực thi đồng thời. Trong khi đó, một lõi ở x% có nghĩa là chỉ một luồng được thực thi. Vì vậy, trước đây là hiệu quả hơn trong một số trường hợp.

Nhưng trong quá trình thực thi, bộ đệm của CPU chứa đầy dữ liệu được truy cập bởi luồng. Vì vậy, nếu luồng được thực thi trên CPU khác, nó sẽ gặp nhiều lỗi bộ nhớ cache hơn, rất tốn kém, vì dữ liệu không nằm trong bộ đệm của CPU này.

Chủ đề của bạn làm gì? Nếu luồng "ngủ" trong một thời gian rất ngắn thì lõi được thực thi trước đó có thể bị chiếm giữ bởi một mối đe dọa khác và do đó, luồng của bạn được thực thi trên lõi có sẵn tiếp theo. Điều gì xảy ra nếu bạn chỉ định một lõi được sử dụng bởi quy trình của bạn (ví dụ: trình quản lý tác vụ ia)?


3
afaik Bộ lập lịch Windows thực hiện khá tốt việc giữ các luồng trên cùng một cpu / lõi trong thời gian đó để tránh vấn đề đó.
Paxxi

@ Pär: Chủ đề của tôi dường như đang thực thi trên từng lõi.
Macke

Vâng, có lẽ các hệ điều hành đã làm hỏng chủ đề của tôi. Làm thế nào để chấp nhận hai câu trả lời? :)
Macke

@ PärBjorklund từ kinh nghiệm của tôi ít nhất Windows XP thì không. Tôi nghĩ rằng vấn đề "nảy bộ nhớ cache" đã được khắc phục trong Vista hoặc mới hơn
Waxhead

1
"Có 4 lõi ở mức 25% có nghĩa là 4 luồng được thực thi đồng thời." Không, nó có nghĩa là một luồng được thực thi, một bit trên một lõi, sau đó là một luồng khác và cứ thế. Vì Trình quản lý tác vụ hiển thị mức sử dụng trung bình, nó sẽ hiển thị 25% (trên hệ thống 4 lõi, trên hai lõi, nó sẽ hiển thị 50%) cho mỗi lõi. Nó có nghĩa là lõi đã được sử dụng đầy đủ một phần tư thời gian và không hoạt động trong thời gian rảnh.
David Balažic

0

Không phải vậy. Một luồng chỉ có thể chạy trên một bộ xử lý. Tuy nhiên, một số quy trình có nhiều luồng, có thể được trải ra.

Lý do, tin hay không, không bao giờ xem xét nó trông như thế nào. Hệ thống cố gắng trải đều các luồng vì nó không có cách nào để biết khi nào sẽ tăng đột biến.


1
Xem thêm làm rõ của tôi. Đây là một luồng, chạy ở tốc độ tối đa, nhanh chóng được di chuyển xung quanh để theo thời gian, mỗi lõi (ngoài dự báo) bận rộn 25%. (Tất cả các quy trình / chủ đề khác đều không thể bỏ qua)
Macke

0

HĐH di chuyển luồng trên các lõi CPU (nhanh chóng, vài lần mỗi giây). Sẽ hiệu quả hơn khi chạy nó trên cùng một lõi mọi lúc. Điều này có thể được thi hành bởi mục menu ngữ cảnh "Đặt mối quan hệ" trong Trình quản lý tác vụ.

Lưu ý rằng thông thường (sử dụng tại nhà thông thường), sự khác biệt nằm trong phạm vi vài phần trăm.

"4 lõi mỗi lõi sử dụng 25%" có nghĩa là, vì Trình quản lý tác vụ cho thấy mức sử dụng trung bình, mỗi lõi được sử dụng đầy đủ một phần tư thời gian và giải phóng phần còn lại của thời gian.

Mô tả dành cho Windows, nhưng nó cũng tương tự trên các hệ điều hành khác.


-1

Nếu bất cứ ai vẫn đọc nó, tôi cũng nhận thấy điều này và thực hiện một vài thử nghiệm để xem đó có phải là một con sán không. Hóa ra không phải vậy! Tôi tin rằng việc truyền bá một luồng trên tất cả các lõi sẽ hiệu quả hơn vì nhiều lý do:

  1. Trải một luồng trên tất cả các lõi cho phép tiêu thụ điện năng thấp hơn. Hầu hết các bộ xử lý đều giảm tần số và quan trọng hơn là điện áp theo tải, vì vậy, Core 2 Quad, chẳng hạn, sẽ tiêu thụ ít năng lượng hơn và tạo ra ít nhiệt hơn bằng cách trải một luồng trên cả 4 lõi thay vì sử dụng một lõi (điều này sẽ dẫn đến điện áp tăng trên TẤT CẢ các lõi, vì chỉ có một bộ điều chỉnh điện áp * - điều đó không hiệu quả).
  2. Nó đảm bảo rằng luồng luôn chạy ở tốc độ tối đa / không đổi. Nếu luồng đột nhiên yêu cầu nhiều sức mạnh xử lý hơn, một lõi có thể bị quá tải và sẽ có độ trễ trong quá trình thực thi. Bằng cách trải đều trên các lõi, mọi đột biến đột ngột sẽ được xử lý trơn tru mà không bị trễ và chậm trễ.

Ngoài ra, vì hai quan sát trên, tôi đã tin rằng Turbo Boost và IDA không hiệu quả. Chúng có thể hữu ích trên các hệ điều hành cũ, nhưng Linux và Windows 7 lan truyền mọi thứ trên tất cả các lõi khá hiệu quả. Vì vậy, Core 2 Quad q9100 @ 2.26 GHz sẽ gần như (luôn có ngoại lệ :-) luôn nhanh hơn Core 2 Duo X9100 @ 3.06GHz và tôi hiếm khi thấy nó sử dụng IDA (về cơ bản là tiền thân của Turbo boost, tăng tần số trên một hoặc hai lõi chỉ cho các ứng dụng luồng đơn).

  • Core 2 Quad có hai miền đồng hồ nhờ có hai điểm chết vật lý, do đó hai lõi có thể chạy ở tần số đầy đủ, trong khi hai lõi có tần số thấp nhất. Tuy nhiên, tôi không biết liệu có hai bộ điều chỉnh điện áp hay không - tôi nhận thấy rằng điện áp là đồng nhất trên cả 4 lõi, do đó, chỉ có một bộ điều chỉnh cho toàn bộ gói.

3
Điều này nghe có vẻ đáng ngờ vì một số lý do. Vui lòng cung cấp tài liệu tham khảo cho "sự thật" của bạn. Đầu tiên, tại sao các công cụ điện toán ở mức 25% trên bốn lõi lại tiêu thụ ít năng lượng hơn 100% trên một? . Càng nhiều càng tốt.
Macke

Chà, đó chỉ là từ những quan sát của riêng tôi - tôi bị IDA và TurboBoost mê hoặc, đã quyết định làm một số thử nghiệm. Cách đây khá lâu, nhưng tôi đã đi đến kết luận trên. Bộ xử lý tiêu thụ ít năng lượng hơn, vì tất cả các lõi chạy ở điện áp thấp hơn - giảm 0,1V giúp tiết kiệm khoảng 6-10 Watts điện năng (nếu một lõi được tải 100%, tất cả các lõi đều chạy ở điện áp cao hơn, cho dù chúng không hoạt động hay không). Điều này đặc biệt đúng trong Core2Duo với chế độ SLFM. Bạn đã đúng về luồng chạy ở chế độ nghiêng hoàn toàn không yêu cầu bất kỳ thao tác xử lý nào nữa, nhưng có những ứng dụng thực sự làm điều này.
JakL

Không có thứ gọi là "truyền bá một chủ đề" (không, thậm chí không 5 năm sau). Có một luồng duy nhất, được thực hiện trên một lõi. Và sau đó về sau. Và như vậy. Tại mỗi thời điểm, một lõi hoạt động ở mức 100% và các lõi khác đang chạy không tải. Vì vậy, không có tiết kiệm. Đặc biệt là như bạn đề cập khi tất cả các lõi tại điện áp đầy đủ mọi lúc mọi nơi (như bạn đã nói, chúng chia sẻ điện áp). Ngoài ra, như đã được giải quyết trên cùng một lõi, đảm bảo luồng nhận được tất cả sức mạnh xử lý. Vì lõi đó đã được sử dụng 100%, HĐH sẽ lên lịch cho các luồng khác đến các lõi khác, ít được sử dụng hơn.
David Balažic
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.