c# – 多线程应用程序使用16线程获得最佳,尽管计算机有32个核心

前端之家收集整理的这篇文章主要介绍了c# – 多线程应用程序使用16线程获得最佳,尽管计算机有32个核心前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有AMD Opteron(tm)6282SE 2.6 GHZ 32核(2个处理器,每个16核)
我有C#数学应用程序,我可以在并行核心上运行.

我得到的应用主要部分的最佳性能是当我使用16个线程(即将工作分成16个线程)时,该部分的最佳运行时间为1MS.

如果我使用超过16个线程,我获得超过1MS.

我的问题是为什么我不能将这部分与更多线程并行,假设我有32个核心.

这是并行运行的代码.

  1. int N = 238;
  2. int P = 16;
  3.  
  4. int Chunk = N / P;
  5. AutoResetEvent signal = new AutoResetEvent(false);
  6. // use a counter to reduce
  7. int counter = P;
  8.  
  9. // kernel transitions
  10. for (int c = 0; c < P; c++)
  11. {
  12. // for each chunk
  13. ThreadPool.QueueUserWorkItem(delegate(Object o)
  14. {
  15. int lc = (int)o;
  16. for (int i = lc * Chunk; i < (lc + 1 == P ? N : (lc + 1) * Chunk); i++)
  17. {
  18. // do something
  19. }
  20. if (Interlocked.Decrement(ref counter) == 0)
  21. {
  22. signal.Set();
  23. }
  24. },c);
  25. }
  26. signal.WaitOne();

解决方法

首先,我认为你应该用新的.NET 4.0 Parallel.For构造替换你的构造:
  1. Parallel.For(0,N,i =>
  2. {
  3. // do something
  4. });

其次,您实际上使用的是两个cpu,每个cpu有16个核心.调度程序很可能足够聪明,可以利用局部性并在同一个cpu上安排所有16个线程.当另一个cpu开始运行时,根据您的计算,访问共享数据需要一直通过主存储器以确保两个cpu之间的一致性.这可能非常昂贵.

猜你在找的C#相关文章