Tôi nên sử dụng bao nhiêu lõi để tính toán? # lõi hoặc # lõi -1?


12

Tôi có một tính toán lớn để làm. Trong khi tôi có thể sử dụng tất cả các lõi, tôi nghĩ có lý do nào để bỏ đi 1 lõi và không sử dụng nó không? (tính toán cpu chỉ không có IO). Hay tôi đang đánh giá thấp HĐH mà nó không biết xử lý và thực hiện chuyển đổi ngữ cảnh phù hợp ngay cả khi tôi sử dụng tất cả các lõi?


8
Sử dụng tất cả các lõi là một khởi đầu tốt và một số mê tín về HĐH hoạt động tốt hơn với "-1 lõi" có lẽ chỉ là - mê tín, nhưng bạn thực sự nên lập hồ sơ, cách nó hoạt động cho tính toán, phần cứng, hệ điều hành của bạn.
Doc Brown

Trong nhiều trường hợp, sử dụng # lõi + 1 có rất nhiều ý nghĩa. Nếu bạn chỉ sử dụng #cores, thì bất kỳ việc chặn bất ngờ nào (chẳng hạn như lỗi trang) không cần thiết phải buộc một lõi không hoạt động.
David Schwartz

Câu trả lời:


28

Các hệ điều hành chính đã đủ trưởng thành để biết cách xử lý các quy trình sử dụng mọi lõi có sẵn. Các quy trình khác có thể (và thường sẽ) bị ảnh hưởng, nhưng việc tính toán sẽ không trở nên chậm hơn vì bạn đã sử dụng mọi lõi có sẵn.

Việc lựa chọn số lượng lõi phụ thuộc nhiều hơn vào ý định của bạn làm việc khác trong khi tính toán đang được thực hiện.

Nếu, trên máy tính để bàn, bạn muốn có thể sử dụng trình duyệt web hoặc xem video trong khi tính toán được thực hiện, tốt hơn hết bạn nên giữ một lõi miễn phí cho nó. Theo cùng một cách, nếu máy chủ đang thực hiện hai việc (chẳng hạn như tính toán và đồng thời, xử lý và báo cáo số liệu của nó), giữ một lõi miễn phí cho nhiệm vụ phụ có thể là một ý tưởng tốt.

Mặt khác, nếu ưu tiên của bạn là thực hiện tính toán nhanh nhất có thể, bạn phải sử dụng tất cả các lõi.


7
Bộ lập lịch hệ điều hành hiện đại thực sự khá tốt trong việc giữ cho các chương trình tương tác tương tác khi sử dụng CPU cao, miễn là các chương trình tương tác không sử dụng nhiều CPU (được cho là có thể là một vấn đề với các ứng dụng web hiện đại)
James_pic

Lưu ý: ngay cả trên các máy chủ, nếu bạn muốn có thể ssh và nhận được câu trả lời linh hoạt, chỉ để lại lõi 0 có thể hữu ích.
Matthieu M.

11

Nó phụ thuộc.

Nếu máy dành riêng cho tính toán này, bạn nên sử dụng tất cả các lõi - tài nguyên máy tính không sử dụng sẽ không tăng tốc mọi thứ .

Nếu bạn đang sử dụng bộ lập lịch thời gian thực, bộ lập lịch không ưu tiên hoặc mối quan hệ bộ xử lý thì bạn nên cẩn thận hơn một chút vì rất dễ vô tình bỏ đói các quy trình khác từ tất cả các tài nguyên máy tính. Tuy nhiên, bạn sẽ phải thay đổi thủ công các cài đặt này để xảy ra lỗi, do đó, theo mặc định, không có vấn đề gì ở đây trên hầu hết các hệ điều hành.

Nếu máy không dành riêng cho tính toán, việc đưa ra 100% cho tính toán có thể không lý tưởng. Ví dụ: nếu bạn đang sử dụng trình duyệt web trong khi tính toán đang chạy. Bởi vì tải của máy của bạn đôi khi sẽ đạt đỉnh trên 100%, nó sẽ cảm thấy chậm chạp. Các tác vụ định hướng thông lượng như tính toán sẽ không thực sự bị chậm lại, nhưng các tác vụ nhạy cảm với độ trễ như GUI sẽ không phản ứng nhanh như vậy. Sau đó, điều hợp lý là chỉ bắt đầu các luồng / quy trình NPROC-1 cho việc tính toán. Ngoài ra, sử dụng mức độ ưu tiên thấp hơn cho tính toán so với các tác vụ thông thường có thể giải quyết vấn đề này, trong trường hợp đó, tính toán nên sử dụng các quy trình NPROC để không lãng phí bất kỳ tài nguyên nào.


3
"nếu bạn đang sử dụng trình duyệt web trong khi tính toán đang chạy [Mạnh] thì nó sẽ cảm thấy chậm chạp. Các tác vụ định hướng thông lượng như tính toán sẽ không thực sự bị chậm lại, nhưng các tác vụ nhạy cảm với độ trễ như GUI sẽ không phản ứng nhanh. [ Vách] rõ ràng sử dụng mức độ ưu tiên thấp hơn cho tính toán so với các tác vụ thông thường có thể giải quyết vấn đề này "- Và đó là lý do tại sao giá trị ưu tiên quá trình trên Unix được gọi là" tính độc đáo "và được định cấu hình bằng tiện ích có tên nice.
Jörg W Mittag

2
"tài nguyên điện toán không sử dụng không tăng tốc mọi thứ" về mặt kỹ thuật, họ có thể. Sử dụng ít lõi hơn có thể cho phép tốc độ xung nhịp cao hơn và giảm đồng bộ hóa, điều đó có thể hoặc không thể tăng tốc mọi thứ.
Davidmh

2
Ngoài các ghi chú @Davidmh thường ở phía CPU L1 $ và L2 $ được chia sẻ ở một mức độ nào đó giữa các luồng và L3 $ được chia sẻ trên tất cả các ổ cắm, vì vậy sử dụng nhiều luồng hơn có thể làm tăng $ làm chậm quá trình. Đặc biệt nếu quá trình bị ràng buộc bộ nhớ thay vì bộ xử lý bị ràng buộc.
Maciej Piechotka

NẾU bạn đặt mức độ ưu tiên của luồng / quy trình một cách phù hợp, bạn có thể giảm thiểu tác động của công việc nền đối với các quy trình tương tác. Tôi đã chạy các ứng dụng điện toán phân tán trên máy cá nhân của mình trong hơn một thập kỷ; và với các tác vụ tính toán CPU chạy ở mức ưu tiên thấp, khả năng sử dụng trình duyệt và các ứng dụng máy tính để bàn thông thường khác của tôi không bị ảnh hưởng. Chia sẻ tài nguyên trên GPU không phải là nâng cao và thỉnh thoảng tôi gặp phải sự cố với video HTML5 được tăng tốc GPU (không bao giờ nghĩ đến các trò chơi) trong khi chạy GPU tính toán trong nền. Các trò chơi đa luồng có thể có vấn đề ngay cả với GFX nhẹ; giành chiến thắng trong chủ đề 2+
Dan đang đấu tranh với Firelight

1

Tôi hơi khó hiểu về việc đồng ý với @motoDrizzt, bên dưới, do những phiếu bầu tiêu cực của anh ấy :), nhưng đó thực sự là kinh nghiệm thực tế của tôi - nhiều hơn là tốt hơn, thậm chí vượt quá số lượng lõi thực tế (nhưng không phải hàng ngàn). Ví dụ: hãy xem http://www.forkosh.com/images/avoronoi.gif nơi mỗi mặt phẳng 2D của 3D-voronoi_diagram có thể được tạo độc lập. Và chương trình lấy một thuộc tính nfork = n query_opes để loại bỏ các phép tính cho n mặt phẳng "đồng thời".

Với bộ xử lý bốn lõi, thời gian (người dùng) để hoàn thành sơ đồ giảm khá nhiều tuyến tính với nfork, cho đến khoảng nfork = 8 (bốn lõi siêu phân luồng). Nhưng ngoài 8, thời gian vẫn giảm, mặc dù chậm hơn. Và ngoài khoảng 16, hoặc hơn, không có cải thiện đáng chú ý hơn nữa. Tôi chưa phân tích hành vi này chút nào, nhưng ngây thơ gán nó cho os (linux slackware 14.2x64 trong trường hợp này) xử lý các quy trình để thậm chí giảm thêm thời gian nhàn rỗi.


0

Sự lựa chọn tốt nhất là phụ thuộc hệ thống. Vì vậy, những gì bạn muốn làm là chạy cả hai phiên bản trên một hệ thống thực, và sau đó kiểm tra xem hệ thống đáp ứng như thế nào. Bạn vẫn có thể sử dụng trình duyệt, trình soạn thảo văn bản, những thứ khác trên hệ thống của bạn chứ? Và hiệu suất có tốt hơn khi sử dụng n luồng chứ không phải n-1? Điều gì xảy ra nếu bạn chạy ứng dụng cùng với một ứng dụng khác cố gắng sử dụng tất cả các CPU?

Và sau đó bạn cần xem xét siêu phân luồng. Với bốn lõi cộng với siêu phân luồng, bạn có thể sử dụng 8 lõi hoặc 7 lõi. Một lần nữa, hãy thử khả năng đáp ứng của hệ thống và thời gian để hoàn thành.

Và cuối cùng, hãy xem xét việc chia công việc của bạn thành nhiều khối hơn các chủ đề. Lý do là các luồng khác nhau sẽ hoàn thành công việc vào các thời điểm khác nhau, và sau đó bạn muốn một số công việc còn lại để giao cho các luồng nhanh hơn. Nếu không, bạn sẽ phải đợi cho đến khi chuỗi cuối cùng kết thúc.

Tái bút "Siêu phân luồng không thể giúp với mã chuyên sâu của FPU vì chỉ có một FPU". Hoàn toàn sai. Điều cực kỳ khó khăn, ngay cả với mã chuyên sâu của FPU, để sử dụng đầy đủ FPU do độ trễ. Siêu phân luồng giúp vì có gấp đôi số hoạt động độc lập có sẵn để lập lịch.


-4

Tôi không biết làm thế nào để viết điều này theo cách không có vẻ "xấu", vì vậy hãy coi nó như một nhận xét thân thiện, ok?

Cho rằng một PC trung bình thường có hàng nghìn hoặc nhiều luồng, điều gì khiến bạn nghĩ rằng sử dụng 8 so với 7 sẽ tạo ra sự khác biệt nào? :-)

Sử dụng càng nhiều chủ đề càng tốt. Và nếu bạn không phải quan tâm đến phản hồi của hệ điều hành và các luồng của bạn chạy trong một thời gian khá dài (hơn một giây), bạn thậm chí có thể thử nghiệm sử dụng gấp đôi số lượng lõi.


3
Nhưng hầu hết hàng ngàn luồng này không sử dụng CPU 100%, phải không?
Andreas Rejbrand

1
Sử dụng gấp đôi số lượng lõi thường không cải thiện thời gian tính toán. Trên thực tế, việc sử dụng nhiều hơn số lõi vật lý nói chung không có lợi, ngay cả khi bạn có nhiều lõi logic hơn (thông qua HyperThreading, v.v. mặc dù điều này có thể phụ thuộc vào nhiệm vụ chính xác mà bạn đang thực hiện). Nguồn: kinh nghiệm từ quá khứ, sử dụng Xử lý song song MATLAB.
Sanchise

1
@Sanchises Điều này là do siêu phân luồng tận dụng các lệnh song song song song - nó hiệu quả đối với mã nặng phân nhánh và bộ nhớ. Tính toán ma trận rất mãnh liệt và chỉ có một FPU cho mỗi lõi vật lý nên việc siêu phân luồng không thể giúp bạn.
J ...
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.