c# - 尽管计算机有 32 个内核,但多线程应用程序使用 16 个线程可以获得最佳效果

标签 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();

最佳答案

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

Parallel.For(0, N,
    i => 
    {
       // do something
    });

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

关于c# - 尽管计算机有 32 个内核,但多线程应用程序使用 16 个线程可以获得最佳效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9295403/

相关文章:

.net - 您将如何在 .NET 中实现这个 "WorkerChain"功能?

c# - 如何获取 SharePoint 2010 Web 应用程序范围的功能以仅在一个 Web 应用程序上激活

原始类型的 C# 重载运算符

c# - C# 中 AES 256 位加密 key 大小的问题

java - 同步方法在停止一个线程和另一个线程方面的重要性是什么?

java - 我怎样才能让线程在完成设置后告诉启动它的方法?

c# - NUnit:在单个测试中运行多个断言

c# - TextReader.Peek 行为和检测流/阅读器的结尾

c - 从线程打印时值不一致

作为脚本运行和通过交互式 shell 运行之间的 Python 区别