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之间的一致性.这可能非常昂贵. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |