Một chương trình đơn luồng có thể được thực hiện để sử dụng nhiều lõi?


12

Tiêu đề nói lên tất cả: có cách nào để một chương trình cũ hơn được thiết kế để sử dụng một lõi CPU để sử dụng nhiều lõi CPU không?


13
Không, không thể.
Moab

5
Giá như điều đó thật dễ dàng ..
Brendan Long

1
Điều gì sẽ xảy ra nếu có một chương trình 'mô phỏng' bộ xử lý (như có thể là vm?) Nhưng lấy CPU đa lõi của bạn và mô phỏng CPU một lõi với sức mạnh xử lý nhiều hơn trên mỗi luồng? Điều đó có thể không?
schizoid04

Ai sẽ quản lý đồng bộ giữa nhiều luồng sau đó, vì thứ tự quan trọng.
user36582

Câu trả lời:


16

Thật không may, một chương trình cũ được viết cho một CPU không thể buộc phải sử dụng nhiều lõi CPU. Việc sử dụng nhiều lõi CPU đòi hỏi nhiều luồng, chúng cần liên lạc với nhau trong khi đảm bảo rằng các điều kiện cuộc đua và các vấn đề khác không xảy ra. Một ứng dụng cũ hơn không thể được tạo ra để sử dụng nhiều hơn lõi CPU trừ khi nó được viết lại để làm như vậy và chỉ khi bản chất của ứng dụng cho phép nó được song song.


19
Cũng đáng lưu ý rằng một số ứng dụng đơn giản là không thể được viết lại để tính đến nhiều lõi. Nó chủ yếu phụ thuộc vào mức độ song song của quá trình. Một ví dụ đơn giản về quá trình không song song sẽ là sinh sản của con người: Một phụ nữ có thể sinh một con trong 9 tháng. Chín phụ nữ có thể sinh 9 con trong 9 tháng, nhưng bạn không thể sử dụng 9 phụ nữ để sinh một con trong một tháng.
AndrejaKo

1
Về nguyên tắc người ta có thể viết một chương trình để phân tích một chương trình khác và cố gắng song song hóa nó. Điều đó nói rằng, ngay cả các phiên bản "dễ dàng" rất hạn chế của vấn đề này đã tạo ra Ph.D. luận án cho vài thế hệ cuối cùng và tiến bộ đã chậm. Vấn đề đầy đủ rất có thể là hoàn thành AI.
dmckee --- ex-moderator mèo con

Tuyệt vời, cảm ơn tất cả các bạn, bạn đã khiến tôi hài lòng với Phụ nữ và ví dụ sinh nở của bạn, đặc biệt là khi bạn nói về sản xuất: D
Chris

Điều gì xảy ra nếu một chương trình có một loạt các hoạt động toán học độc lập mà sau này được sử dụng cho nhau? có lẽ một chủ đề thứ hai có thể phân tích chương trình, hmm tôi không biết tôi đang nói gì. Nếu một luồng có thể phân tích cú pháp lắp ráp .. "thực hiện thao tác đắt tiền ở đây, thì thực hiện thao tác đắt thứ hai với thao tác đắt tiền đầu tiên không chạm vào" được rồi, tôi sẽ đặt một thao tác đắt tiền lên một luồng, một luồng khác, sau đó đồng bộ hóa chúng trở lại chủ đề chính. Tôi cho rằng toàn bộ chương trình sẽ phải được phân tích cú pháp trước để xác định các hoạt động đắt tiền độc lập.
CausingUnderflowsEverywhere

13

Mục tiêu của bạn với nó là gì? Tăng hiệu suất? Đáng buồn là các ứng dụng được thiết kế để chỉ sử dụng 1 lõi sẽ không sử dụng nhiều hơn. Đó là tất cả những gì nói về ứng dụng "đa luồng" này.


2

Có ít nhất ba kỹ thuật để khai thác nhiều bộ xử lý trong một chương trình được thiết kế để sử dụng một lõi đơn. Đơn giản nhất của các kỹ thuật này là sử dụng các thư viện và mã hệ thống sử dụng nhiều lõi hoặc có thể thực thi ít nhất một phần song song với mã ứng dụng. Bộ sưu tập rác là một ví dụ về chức năng có thể được song song và có thể được thực hiện song song với thực thi ứng dụng. Ngay cả khi không có quản lý bộ nhớ tự động, vẫn có một số khả năng xảy ra song song trong các chức năng phân bổ bộ nhớ vì bộ cấp phát bộ nhớ có thể có một số công việc phải làm ngoài việc đơn giản là đánh dấu phần bộ nhớ là có sẵn.

Một kỹ thuật thứ hai là dịch nhị phân. Mặc dù điều này có thể được coi là "viết lại ứng dụng", nhưng nó được thực hiện bằng phần mềm và không có quyền truy cập vào mã nguồn. Sản xuất song song mức luồng dường như không phải là mục tiêu chính của hầu hết nghiên cứu và phát triển bằng cách sử dụng dịch nhị phân (thường liên quan đến việc chạy mã kế thừa trên một ISA khác, khai thác các phần mở rộng của ISA hoặc tối ưu hóa cho một vi kiến ​​trúc cụ thể và sử dụng thông tin động để cung cấp cao hơn tối ưu hóa hướng dẫn hồ sơ chất lượng), nhưng tiềm năng là rõ ràng.

Một kỹ thuật thứ ba là đa luồng đầu cơ. Hiện tại không có bộ xử lý (mà tôi biết) hỗ trợ đa luồng đầu cơ được quản lý phần cứng. Tuy nhiên, với việc giới thiệu bộ nhớ giao dịch phần cứng, việc hệ thống thời gian chạy thực hiện như vậy sẽ trở nên thực tế hơn vì HTM có thể được sử dụng để phát hiện xung đột trong sử dụng bộ nhớ. Đa luồng đầu cơ được quản lý bằng phần mềm thường liên quan đến một số bản dịch nhị phân, nhưng bản chất đầu cơ của nó biện minh cho việc xem xét một kỹ thuật riêng biệt.

Tính thực tiễn của các kỹ thuật này bị giới hạn bởi chi phí liên quan đến các hệ thống hiện có (bao gồm chi phí liên lạc giữa các luồng và luồng sinh sản), bởi sự song song hạn chế mà chúng có thể khai thác và bởi lợi tức đầu tư hạn chế (các ứng dụng quan trọng có thể có lợi song song có khả năng được viết lại, nhiều ứng dụng sẽ có lợi tương đối ít nếu tất cả từ các kỹ thuật đó (đặc biệt là với giới hạn công suất / nhiệt cho phép một lõi chạy ở tần số cao hơn nhiều lõi) và chi phí phát triển là đáng kể). Tuy nhiên, các kỹ thuật này vẫn tồn tại và về mặt lý thuyết có thể sử dụng nhiều lõi với một ứng dụng được thiết kế để sử dụng một lõi đơn.


0

Không, không thể nào. Một chương trình được viết rõ ràng để sử dụng nhiều lõi. Nó không phải là tầm thường để làm công việc trong nhiều lõi. Nó đòi hỏi đồng bộ hóa tất cả các chủ đề. Giống như một người ném bóng, người kia bắt bóng, một người đánh bóng, một người dọn dẹp, một người kiểm tra bóng xem nó có lượng không khí tốt trong đó không. Bây giờ hãy tưởng tượng mỗi nhân vật đang chạy trong một luồng độc lập với nhau. Ai đó cố gắng bắt bóng khi nó không ném. Hoặc ai đó cố gắng đánh bóng khi nó đang được chơi. Hoặc hai nhân vật cố gắng bắt và ném bóng cùng một lúc. Có rất nhiều cách để sụp đổ. Vì vậy, các lập trình viên cần thiết kế lại một cách cẩn thận một ứng dụng lõi đơn để có thể tận dụng nhiều lõi.

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.