2012-01-25 45 views
16

Có cách nào để xác định CPU nào được chạy trên luồng không? Tốt hơn là trong C#, nhưng C++ sẽ làm.Làm cách nào để xác định CPU nào chạy trên?

Các quy trình .NET và các lớp ProcessThread dường như không cung cấp thông tin này.

ETA Làm rõ:

Chúng tôi đang phát triển một ứng dụng máy chủ xử lý http luồng multicast và sinh ra nhiều bộ mã hóa video. Điều này chạy trên một hệ thống với 12 lõi vật lý, dẫn đến 24 CPU logic (siêu phân luồng). Qua TaskManager và ProcessExplorer, chúng tôi đã xác minh rằng các quy trình sinh sản của chúng tôi trải đều trên các CPU logic. Tuy nhiên, chúng ta đang thấy rất nhiều hoạt động (hạt nhân?) Chỉ trên một CPU cản trở việc ăn một lượng thời gian CPU bất thường. Chúng tôi đang cố gắng xác định (các) tiến trình/luồng nào đang chạy trên CPU cụ thể này. Cả TaskManager lẫn ProcessExplorer đều không cung cấp thông tin đó. Nếu có, vui lòng giải thích cách thu thập thông tin đó.

Nếu không, chúng tôi đang dự tính viết công cụ của riêng chúng tôi để nhận thông tin này. Và đó là những gì chúng tôi cần giúp đỡ.

Chúng ta biết làm thế nào để thay đổi mối quan hệ luồng (và chúng tôi biết rằng không có gì đảm bảo rằng một chuỗi sẽ vẫn liên kết với bất kỳ CPU nào, mặc dù trong trường hợp cụ thể này,), nhưng để làm như vậy, trước tiên chúng ta cần xác định quy trình/luồng cần được di chuyển. Đó là mục tiêu duy nhất của câu hỏi này.

Tôi hy vọng điều này sẽ giúp làm rõ vấn đề.

+7

Bạn đang cố gắng giải quyết vấn đề gì với thông tin này? –

+0

Nó chỉ được biết với kernal. Vì vậy, bạn cần phải chương trình trong chế độ kernal. Tìm kiếm các API Kernal trên MSDN. – Nawaz

+2

Bạn muốn làm gì nếu chuỗi chạy trên nhiều CPU khác nhau vào các thời điểm khác nhau? –

Trả lời

2

Từ MSDN, bằng cách sử dụng thuộc tính ProcessThread.ProcessorAffinity, bạn có thể đặt mối quan hệ chuỗi, nhưng bạn không thể nhận được. Theo mặc định chủ đề không có ái lực (có thể hoạt động trên bất kỳ bộ vi xử lý).

using System; 
using System.Diagnostics; 

namespace ProcessThreadIdealProcessor 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Make sure there is an instance of notepad running. 
      Process[] notepads = Process.GetProcessesByName("notepad"); 
      if (notepads.Length == 0) 
       Process.Start("notepad"); 
      ProcessThreadCollection threads; 
      //Process[] notepads; 
      // Retrieve the Notepad processes. 
      notepads = Process.GetProcessesByName("Notepad"); 
      // Get the ProcessThread collection for the first instance 
      threads = notepads[0].Threads; 
      // Set the properties on the first ProcessThread in the collection 
      threads[0].IdealProcessor = 0; 
      threads[0].ProcessorAffinity = (IntPtr)1; 
     } 
    } 
} 

Tương tự như vậy Thread.SetProcessorAffinity cũng làm như vậy.

+1

Ngoài ra, chủ đề được di chuyển xung quanh, vì vậy ngay cả khi bạn sẽ nhận được một câu trả lời nó sẽ không nhất thiết phải hợp lệ thời điểm bạn cố gắng kiểm tra một cái gì đó. – TomTom

+0

Vâng, các thuộc tính ProcessorAffinity trên Process và ProcessThread là hy vọng đầu tiên của tôi, nhưng như bạn đã chỉ ra, tôi không thể ... – Harald

+0

@TomTom: vâng, chúng có thể được di chuyển, nhưng trong trường hợp của chúng tôi, ảnh chụp sẽ cung cấp thông tin có giá trị. – Harald

2

Điều này không thể thực hiện một cách đáng tin cậy liên tục. Trình quản lý tác vụ OS tối ưu hóa các luồng và chia tách tải giữa các lõi CPU có sẵn. Trong trường hợp chung, một luồng có thể được thực hiện trên bất kỳ CPU nào. Hơn nữa với các switch context, nó cũng có thể thay đổi CPU của nó.

Nếu bạn cần chỉ định một chuỗi cụ thể hoặc quá trình bạn chỉ có thể gán mối quan hệ của nó, vì vậy bạn có thể có hy vọng hợp lý rằng quy trình/luồng sẽ được thực thi trên một CPU logic cụ thể.

+0

Mặc dù kỹ thuật chính xác, bạn trả lời là thiếu điểm rất quan trọng. Việc biết CPU hiện tại của bạn có thể ** giảm đáng kể ** ganh đua bằng cách sử dụng tài nguyên được chia sẻ. Có, trong trường hợp hiếm hoi bạn sẽ bị gián đoạn và chuyển sang lõi khác. Điều này có nghĩa là đồng bộ vẫn cần thiết. Nhưng kết quả tuyệt vời là không thể so sánh được. –

+0

@KirillKobelev bạn có thể vui lòng cho tôi một số thông tin về điều này không. Tôi có thể thấy nó hoạt động ở mức độ thấp, nhưng không chắc chắn cách bạn có thể quản lý điều này từ một ứng dụng. Bạn đang nói về NUMA? – oleksii

+0

Hãy suy nghĩ về hiệu suất của 'int cnt [num_cores]; InterlockedIncrement (cnt [GetCurrCore()]); 'vs phiên bản đơn giản chỉ với một bộ đếm. –

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