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.
luật Amdahl là nền tảng: http: // en. wikipedia.org/wiki/Ahmdal%27s_Law –
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ả –
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? –