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?
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?
Câu trả lời:
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.
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.
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.
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.