我有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)
首先,我认为您绝对应该用新的 .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 之间的一致性。这可能会非常昂贵。
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |