加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:44:58 所属栏目:百科 来源:网络整理
导读:我有AMD Opteron(tm)6282SE 2.6 GHZ 32核(2个处理器,每个16核) 我有C#数学应用程序,我可以在并行核心上运行. 我得到的应用主要部分的最佳性能是当我使用16个线程(即将工作分成16个线程)时,该部分的最佳运行时间为1MS. 如果我使用超过16个线程,我获得超过1MS.
我有AMD Opteron(tm)6282SE 2.6 GHZ 32核(2个处理器,每个16核)
我有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();

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读