2011-02-07 30 views
6

System.Environment.ProcessorCount cho tôi biết N Bộ xử lý (N trong trường hợp của tôi = 8), mà tôi muốn sử dụng. Bây giờ vấn đề là, các cửa sổ resourcemanager sais, rằng 4 của CPU của tôi là 'đậu', và 8 Chủ đề tôi bắt đầu chỉ riêng biệt lên đến 4 CPU bỏ cấm.C# Threading CPU của Parked?

Bây giờ có cách nào để sử dụng CPU chưa sử dụng không?

Trả lời

3

Thông thường, bạn sẽ có thể làm theo cách này:

Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)0x00FF; 

xem tài liệu cho nó ở đây:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.processoraffinity.aspx

nhưng nó cũng nói rằng, theo mặc định quá trình của bạn được gán cho tất cả lõi.

Mặt khác, bạn có thể thử ProcessThread.ProcessorAffinity và thử đặt thủ công (nếu bạn muốn buộc mỗi luồng sử dụng lõi khác).

+0

Cảm ơn. Về cơ bản, mọi câu trả lời đều đúng ... thiết lập ProcessorAffinity để buộc các chủ đề của tôi sử dụng một CPU riêng biệt không giúp tôi, nhưng bạn đã cho tôi chính xác những gì tôi đã yêu cầu để tôi có thể tự tìm hiểu và học hỏi. – Steav

+0

Lưu ý rằng khi bạn điều chỉnh các mối quan hệ CPU của mình, hãy chắc chắn bạn làm như vậy một cách thông minh, vì bạn đang thực thi các ràng buộc nhân tạo trên lõi CPU Scheduler của hệ điều hành * nghĩ * một lõi nên được bật. Cũng lưu ý rằng câu hỏi của khóa học đã có một số nhầm lẫn về bãi đậu xe lõi và mối quan hệ CPU, mà tôi đã cố gắng để làm sáng tỏ trong tôi, dường như lame, 0 bỏ phiếu trả lời từ nhiều năm trước đây). –

7

Khi Windows "công viên" lõi CPU, điều đó có nghĩa là không có đủ công việc cho lõi đó để làm như vậy, nó đặt lõi đó ở trạng thái công suất thấp. Để "unpark" CPU, bạn chỉ cần tạo đủ công việc.

Nếu bạn đang bắt đầu 8 chủ đề và Windows không phải là unparking các CPU, các chủ đề có thể đang làm I/O, chặn, hoặc hoàn thành quá nhanh. Nếu bạn đăng những gì chủ đề của bạn đang làm, có lẽ ai đó có thể giải thích lý do tại sao họ không chạy trên lõi đậu.

+0

Tôi có vòng lặp For-Loop hoạt động ngắn (~ 2-10ms mỗi Chu kỳ), nhưng danh sách hoạt động thông qua có thể tăng lên đến 200-300k dễ dàng. Trả lời dường như không đúng với tôi, bởi vì trước khi tôi bắt đầu công việc 4 CPU đang đậu và 4 đang hoạt động ... giống như khi tôi bắt đầu quy trình của mình .. Và có rất nhiều việc phải làm và 4 lõi bổ sung có thể cải thiện rất nhiều hiệu suất. Các chủ đề không hoàn thành dưới 20 giây. Không có hoạt động I/O nào được thực hiện. – Steav

+0

Thực ra tôi lo lắng, bởi vì 4 lõi bổ sung là cần thiết, bởi vì hoạt động vẫn mất nhiều thời gian hơn nó có thể trên một 8 lõi Intel I7 – Steav

+0

Đậu xe là trạng thái tạm thời. Khi một lõi không được sử dụng, nó sẽ thực hiện công việc của nó và được đậu lại. Khi tôi nhìn vào Resource Monitor, nó cho thấy một lõi là chưa sử dụng, nhưng CPU đó vẫn đang làm một số công việc. – Gabe

2

Win7/2K8R2 sẽ không unpark lõi cho đến khi những người khác được bão hòa hoặc gần bão hòa.

Toàn bộ điểm của lõi đỗ xe là củng cố công việc. Đó là hiệu quả năng lượng hơn để sử dụng 4 lõi ở mức 80% so với 8 lõi ở mức 40%. Ngoài ra, sự khác biệt hiệu suất nên gần như không tồn tại.

Ngoài ra, tùy thuộc vào lượng dữ liệu được chia sẻ, việc hợp nhất công việc sẽ thực sự nhanh hơn vì sẽ có ít phí đồng bộ hơn vì có ít chủ đề phần cứng hơn. Thay đổi dữ liệu gần đây từ một chuỗi sẽ có nhiều khả năng trong bộ nhớ cache.

Vì vậy, trường hợp xấu nhất phổ biến là về hiệu suất tương tự và ít điện năng được sử dụng và trường hợp tốt nhất phổ biến là hiệu suất tốt hơn và ít điện năng được sử dụng.

0

Bãi đậu xe không được kiểm soát bởi thiết lập ái lực CPU của quy trình của bạn, nó được thực hiện tự động bởi Bộ lập lịch CPU Windows. Điều chỉnh cho mối quan hệ CPU của bạn có lẽ có thể buộc sử dụng lõi nhất định, nhưng sau đó Windows sẽ chỉ đậu các lõi khác nhau. Bãi đậu xe được bật hoặc tắt động, rất nhanh, phù hợp với tải hệ thống. Nó thực sự là tích cực đáng ngạc nhiên theo mặc định (có lẽ quá nhiều như vậy trên một số nền tảng). Bạn có thể xem nó trong màn hình tài nguyên, như bạn đã thấy.

Đặt mối quan hệ CPU của riêng bạn là điều bạn nên làm với hết sức thận trọng. Bạn phải xem xét lõi HyperThreaded, hoặc trong trường hợp của AMD Bulldozer, cặp lõi chia sẻ các đơn vị tính toán (HyperThreading của chúng mà không cần HyperThreading; p). Bạn không muốn kết thúc 'bị mắc kẹt' trên lõi Hyper-Threaded chỉ cung cấp một phần nhỏ hiệu suất của một lõi thực. Lập lịch CPU là nhận thức được những điều như vậy, vì vậy thường là mối quan hệ là tốt nhất còn lại cho nó - trừ khi bạn biết những gì bạn đang làm, và đã kiểm tra CPU của hệ thống.

Tuy nhiên, bạn có thể bật/tắt hoặc chỉnh CPU xe rất dễ dàng, mà không cần khởi động lại.Tôi đã viết HƯỚNG DẪN, hoàn thành bằng GUI đơn giản, tại đây: How to Enable/Disable or Tweak CPU Parking Without a Reboot, and without Registry Edits

Nó cũng bao gồm thêm thông tin về CPU Parking và cách tinh chỉnh nó bằng PowerCfg.exe. Bạn thực sự có thể làm cho tùy chọn hiển thị trong các thiết lập Advanced Power Profile tiêu chuẩn trong Windows, nhưng phải mất một số tinh chỉnh tôi sẽ không nhận được vào đây.