我有AMD Opteron(tm)6282SE 2.6 GHZ 32核(2个处理器,每个16核)
我有C#数学应用程序,我可以在并行核心上运行.
我有C#数学应用程序,我可以在并行核心上运行.
我得到的应用主要部分的最佳性能是当我使用16个线程(即将工作分成16个线程)时,该部分的最佳运行时间为1MS.
如果我使用超过16个线程,我获得超过1MS.
我的问题是为什么我不能将这部分与更多线程并行,假设我有32个核心.
这是并行运行的代码.
- 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();