2010-01-05 33 views
6

Khi tôi chạy một chương trình đơn luồng mà tôi đã viết trên lõi tứ của mình, tôi có thể thấy trong Windows Task Manager thực sự tất cả bốn lõi CPU của tôi đều hoạt động nhiều hoặc ít hơn. Một lõi hoạt động tích cực hơn ba phần còn lại, nhưng cũng có hoạt động trên các lõi đó. Không có chương trình nào khác (bao gồm hạt nhân hệ điều hành của khóa học) chạy mà sẽ là chính đáng cho activitiy đó. Và khi tôi đóng chương trình của tôi tất cả hoạt động, tất cả các lõi đều giảm xuống gần bằng không. Tất cả là trái là một chút "tiếng ồn" trên lõi, vì vậy tôi khá chắc chắn tất cả các hoạt động có thể nhìn thấy trực tiếp hoặc gián tiếp (như gọi thói quen hệ thống) từ chương trình của tôi.Có thể chương trình đơn luồng được thực hiện đồng thời trên nhiều lõi CPU không?

Có thể hệ điều hành hoặc lõi cố gắng cân bằng một số mã hoặc thực thi trên tất cả bốn lõi, thậm chí nó không phải là một chương trình đa luồng? Bạn có bất kỳ liên kết nào ghi lại kỹ thuật này không?

Một số thông tin cho chương trình: Đây là ứng dụng giao diện điều khiển được viết bằng Qt, Trình quản lý tác vụ cho biết chỉ có một luồng đang chạy. Có thể Qt sử dụng các luồng, nhưng tôi không sử dụng các tín hiệu hoặc các khe, cũng không phải GUI nào.

Liên kết với Task Manager ảnh chụp màn hình: http://img97.imageshack.us/img97/6403/taskmanager.png

Câu hỏi này là ngôn ngữ thuyết bất khả tri và không gắn với Qt/C++, tôi chỉ muốn biết nếu Windows hoặc Intel làm gì để cân bằng cũng mã duy nhất luồng dữ liệu trên tất cả các lõi. Nếu họ làm, kỹ thuật này hoạt động như thế nào? Tất cả những gì tôi có thể nghĩ là, các thói quen hạt nhân như đọc từ đĩa vv được lên lịch trên tất cả các lõi, nhưng điều này sẽ không cải thiện hiệu suất đáng kể vì mã vẫn phải chạy đồng bộ với các cuộc gọi api hạt nhân.

EDIT

Bạn có biết bất kỳ công cụ để làm một phân tích tốt hơn và/hoặc các chương trình đa luồng đơn hơn người nghèo Windows Task Manager?

Trả lời

10

Quy trình chỉ một luồng sẽ chỉ chạy trên một lõi đơn tại bất kỳ thời điểm cụ thể nào.

Nhưng có thể cho hệ điều hành di chuyển một chuỗi từ cốt lõi này sang lõi khác. Trong khi hệ điều hành sẽ cố gắng giữ một luồng trên cùng một lõi, nếu lõi cuối cùng mà chuỗi chạy trên đang bận và một lõi khác là miễn phí, thì hệ điều hành có thể di chuyển luồng.

+1

có tất nhiên trừ khi bạn đang làm việc với bộ xử lý lượng tử, bạn chỉ có thể có 1 bộ xử lý chạy một chuỗi nhất định tại một điểm nhất định trong thời gian. Tuy nhiên, trong một khoảng thời gian mà chủ đề đơn lẻ có thể được di chuyển sang cpu khác! – ennuikiller

+0

phiên bản cũ hơn của Windows (XP và cũ hơn) KHÔNG cố gắng giữ một quá trình trên cùng một lõi, chúng làm ngược lại điều này theo mặc định. –

+0

Có thể * đối với lịch trình hệ điều hành để di chuyển một proc (chính xác hơn, một luồng) từ lõi này sang lõi khác, nhưng rất khó xảy ra. Tôi không biết Qt, nhưng có vẻ như với tôi một lời giải thích có khả năng hơn là có những chủ đề khác đằng sau hậu trường trong Qt, được lên kế hoạch trên các lõi khác. Hoạt động đó, cộng với hoạt động của hạt nhân và các quá trình khác, hiển thị trên các lõi khác. – Cheeso

0

Có trừ khi bạn sử dụng các chuỗi "ái lực bộ xử lý" (một hoặc nhiều) sẽ được lên lịch trên bất kỳ bộ xử lý nào mà mã quản lý luồng hạt nhân gán. Không có sự bảo đảm nào sẽ là cùng một bộ xử lý từ một lệnh đến

1

Phiên bản Windows, XP và trước đây có một bộ lập lịch chuỗi khủng khiếp thực sự sẽ chuyển một tác vụ luồng đơn từ lõi này sang lõi khác. Và dưới Windows (giống như mọi hệ điều hành khác), có hàng tá nếu không phải hàng trăm chương trình không sử dụng đang chạy cùng một lúc bất kể bạn nghĩ rằng bạn đang chạy cái gì có thể giải thích cho tất cả hoạt động đó.

+0

Khi chương trình của tôi không chạy, không có hoạt động đáng kể nào trên tất cả các lõi. Tôi chắc chắn rằng tất cả hoạt động có thể nhìn thấy trực tiếp hoặc gián tiếp từ chương trình của tôi. – WolfgangA

+0

@Wolfgang - quá trình của bạn có thể gây ra hoạt động trong các chủ đề khác. Ví dụ, nếu bạn đang vẽ đến màn hình bạn đang gây ra công việc trong quá trình DWM. – Michael

+0

Đây là những gì tôi có ý nghĩa với "gián tiếp", giống như các cuộc gọi API hoặc gọi tất cả các loại thói quen hệ thống. – WolfgangA

0

Mặc dù những gì bạn có thể cảm nhận, có nhiều chi tiết hơn trong CPU so với ứng dụng của bạn. Hệ điều hành, và tất cả các quy trình và chủ đề của nó cũng đang chạy. những gì bạn đang thấy là quá trình của bạn đang được lên lịch trên các lõi khác nhau vào các thời điểm khác nhau. Ứng dụng của bạn không được song song - đó chỉ là một trong nhiều tác vụ hiện đang thực thi. Hãy yên tâm rằng ứng dụng của bạn đang chạy tuần tự.

+0

liên quan đến * những gì bạn đang thấy là quá trình của bạn đang được lên kế hoạch trên lõi khác nhau tại các thời điểm khác nhau. * Không. Có thể di chuyển một luồng từ lõi này sang lõi khác, nhưng nó không nên xảy ra bình thường. Tôi đồng ý với "có rất nhiều thứ đang diễn ra mà chỉ là ứng dụng của bạn". – Cheeso

+0

Tôi cầu xin sự khác biệt. Tôi đảm bảo rằng ở một thời điểm nào đó ứng dụng sẽ chuyển ngữ cảnh - hoặc do IO chờ hoặc 4+ quá trình muốn thời gian CPU cùng một lúc, hoặc bất kỳ lý do nào khác mà trình lên lịch thực hiện chuyển ngữ cảnh - và khi nó được chuyển trở lại trong, nó sẽ đi đến lõi hệ điều hành coi là thích hợp nhất. – cyberconte

2

Công cụ mà bạn muốn thực hiện phân tích sâu hơn Task Manager có thể được gọi là perfmon (perfmon.exe) - đó là giao diện người dùng để chụp và vẽ đồ thị các bộ đếm hiệu suất có công cụ Windows.Bạn có thể sử dụng nó để giám sát tất cả các loại thông tin trên cả cấp độ hệ thống và mỗi quá trình; học cách yêu nó - đó là một trong những người bạn tốt nhất của nhà phát triển.

http://technet.microsoft.com/en-us/library/bb490957.aspx

0

Một tốt hơn Windows Task Manager là sysinternals process explorer.

Trong Windows Task Manager (hoặc trong Sysinternals Process Explorer), nhấp chuột phải vào tên quá trình của bạn, và thiết lập (lựa chọn) lõi mối quan hệ, bạn nên nhìn thấy bây giờ chỉ có một lõi hoạt động ...

nào của Windows bạn có dùng không ? XP? Bảy?

Nếu bạn sử dụng XP, hãy thử Bảy, lõi được quản lý tốt hơn.

0

Tôi sử dụng Windows 7 x64 Home Premium và CPU Intel i7 920 và các chương trình đơn luồng nhảy từ lõi này sang lõi khác nên tôi không thấy nó cải tiến như thế nào trên XP.

7 không nhận dạng HT (Siêu luồng) và không lên lịch nhiều tác vụ cho một lõi CPU, đó có lẽ là lợi ích duy nhất 7 có trên XP. Tôi đã không có một bộ xử lý đa lõi với XP cho lâu vì vậy không chắc chắn nếu XP đã tính đến HT.

1

Đây là chủ đề nghiên cứu tại thời điểm này. Trình biên dịch song song có nghĩa vụ phải tìm cơ hội đồng thời trong chương trình của bạn và thực hiện chúng song song. Nhưng đó là một nhiệm vụ rất khó khăn.

Có những ngôn ngữ như OpenMP được thiết kế để cung cấp gợi ý này cho trình biên dịch. Hiện tại, hầu hết việc triển khai OpenMP đều sử dụng thư viện luồng trong nền. Nhưng trong tương lai họ sẽ không.

Có thể bạn cần phần cứng rất khác cho điều đó.

Câu trả lời ngắn gọn, không phải hôm nay nhưng rất có thể thông qua OpenMP trong tương lai. Nhưng sau đó bạn cũng cần xác định ý nghĩa của "chuỗi",

Các vấn đề liên quan