2012-02-15 31 views
6

Tôi có lõi AMD Opteron (tm) 6282SE 2.6 GHZ 32 (2 bộ xử lý 16 lõi) Tôi có ứng dụng toán học C# mà tôi có thể chạy trên lõi song song .C# Ứng dụng đa luồng được tối ưu sử dụng 16 luồng mặc dù máy tính có 32 lõi

Hiệu suất tối ưu mà tôi nhận được cho phần chính của ứng dụng là khi tôi sử dụng 16 luồng (ví dụ: chia công việc thành 16 luồng) thời gian chạy tối ưu cho phần này là 1MS. Nếu tôi sử dụng hơn 16 chủ đề tôi nhận được nhiều hơn 1MS.

Câu hỏi của tôi là lý do tại sao tôi không thể song song phần này với nhiều chủ đề hơn giả sử rằng tôi có 32 lõi.

Đây là mã chạy song song.

 int N = 238; 
     int P = 16; 


     int Chunk = N/P; 
     AutoResetEvent signal = new AutoResetEvent(false); 
     // use a counter to reduce 
     int counter = P; 

     // kernel transitions 
     for (int c = 0; c < P; c++) 
     {   // for each chunk 
      ThreadPool.QueueUserWorkItem(delegate(Object o) 
      { 
       int lc = (int)o; 
       for (int i = lc * Chunk; i < (lc + 1 == P ? N : (lc + 1) * Chunk); i++) 
       { 
        // do something 
       } 
       if (Interlocked.Decrement(ref counter) == 0) 
       { 
        signal.Set(); 
       } 
      }, c); 
     } 
     signal.WaitOne(); 

Cảm ơn.

+2

luật Amdahl là nền tảng: http: // en. wikipedia.org/wiki/Ahmdal%27s_Law –

+0

Tôi sẽ cố gắng thực hiện điều tương tự với 'System.Threading.Tasks.Parallel.For' và so sánh kết quả –

+1

Câu hỏi hay và tôi không có câu trả lời nhưng bạn có thể sử dụng Giám sát thay vì AutoResetEvent? AutoResetEvent là một đối tượng đồng bộ chế độ kernal chậm hơn đáng kể so với đối tượng đồng bộ được quản lý như màn hình. Tôi hoàn toàn đoán ở đây, nhưng có lẽ bằng cách sử dụng AutoResetEvent giới thiệu một số điều mà bằng cách sử dụng màn hình sẽ tránh? –

Trả lời

2

Trước hết, tôi nghĩ rằng bạn chắc chắn nên thay thế cấu trúc của bạn với các mới NET 4.0 Parallel.For xây dựng:

Parallel.For(0, N, 
    i => 
    { 
     // do something 
    }); 

Thứ hai, bạn đang ở trong thực tế sử dụng hai CPU với 16 lõi mỗi. Nhiều khả năng người lên lịch đủ thông minh để khai thác địa phương và lên lịch cho tất cả 16 luồng của bạn trên cùng một CPU. Khi CPU khác đi vào hoạt động, tùy thuộc vào tính toán của bạn, việc truy cập dữ liệu được chia sẻ cần phải được truyền qua bộ nhớ chính để đảm bảo sự kết hợp giữa hai CPU. Điều này có thể rất tốn kém.

+0

Điều đó không trả lời câu hỏi .... ngón tay cái xuống. – Aliostad

+0

@Aliostad: Chờ đã, tôi vẫn đang chỉnh sửa. :) – Tudor

+2

@Tudor: tại sao không viết toàn bộ câu trả lời trước khi đăng? Tôi không có vấn đề với việc đưa ra một câu trả lời ngắn gọn và sau đó mở rộng trên nó, nhưng nó cảm thấy một chút giống như gửi bài "đầu tiên!" khi bạn đăng nội dung nào đó không phải là câu trả lời và sau đó chỉnh sửa câu trả lời cho nó ... – Chris

2

ThreadPool là phản ứng và có thể mất một lúc cho đến khi chuỗi mới được thêm vào hồ bơi. Về cơ bản nếu không có đủ chủ đề cho đôi khi, nó làm tăng kích thước hồ bơi thread và khi có nhiều nhàn rỗi một lần nữa, nó mang lại cho nó trở lại. Vì vậy, nó dao động giữa phúttối đa kích thước được đặt bởi ThreadPool đối tượng - có thể truy cập để quay lại hoặc đặt.

Nếu bạn biết bạn cần bao nhiêu chủ đề, hãy sử dụng SetMinThreads để đảm bảo bạn có đủ chuỗi khi bắt đầu.

+0

Tôi đã cố gắng để thiết lập các chủ đề min của threadpool nó đã không giúp đỡ. Kích thước tối thiểu mặc định là 32. tôi đã cố gắng tăng nó nhưng như đã đề cập, nó không giúp ích gì. –

0

Vấn đề là do tệp EXE của tôi được biên dịch thành 32 bit và hệ điều hành là 64 bit.

http://msdn.microsoft.com/en-us/library/ms241064%28v=vs.80%29.aspx

"Do thiết kế của x86 thi đua và các hệ thống phụ WOW64 cho gia đình bộ xử lý Itanium, các ứng dụng bị hạn chế để thực hiện trên một bộ xử lý"

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