虽然计算机有32个核心,但多线程应用程序使用16线程获得最佳

ofe*_*r-a 7 c# multithreading

我有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();
Run Code Online (Sandbox Code Playgroud)

Tud*_*dor 3

首先,我认为您绝对应该用新的 .NET 4.0 构造替换您的构造Parallel.For

Parallel.For(0, N,
    i => 
    {
       // do something
    });
Run Code Online (Sandbox Code Playgroud)

其次,您实际上使用的是两个 CPU,每个 CPU 都有 16 个核心。调度程序很可能足够聪明,可以利用局部性并在同一 CPU 上调度所有 16 个线程。当另一个 CPU 发挥作用时,根据您的计算,访问共享数据需要一直通过主内存传递,以确保两个 CPU 之间的一致性。这可能会非常昂贵。

  • @Tudor:为什么不在发布之前写下完整的答案呢?我可以给出一个简短的答案,然后对其进行扩展,但这确实感觉有点像发布“首先!” 当您发布不是答案的内容然后在其中编辑答案时...... (2认同)