C# 中的阿姆达尔定律示例



我正在研究一些平行化,这让我想到了阿姆达尔定律。我读了很多关于这个话题的文章;

使用Amdahl's定律计算性能增益

如何计算线程效率的Amadahl's定律

http://en.wikipedia.org/wiki/Amdahl%27s_law

…但希望找到一个c#的例子来展示它的实践。搜索没有结果。从理论上讲,应该有可能制作一个串行应用程序,对可并行的部分进行计时,运行并行版本,记录并行部分的长度,并将差异(知道使用了多少处理器)与Amdahl函数的结果进行比较。这是正确的吗?有人知道存在这样的例子吗?

注意:程序的完整可下载版本可以在My Github Page

找到。

因此,根据Amdahl定律,我们将工作分为"必须串行运行的工作"one_answers"可以并行化的工作",所以让我们将这两个工作负载表示为List<Action>:

var serialWorkLoad = new List<Action> { DoHeavyWork, DoHeavyWork };
var parallelizableWorkLoad = new List<Action> { DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork, DoHeavyWork };

其中DoHeavyWork委托被抽象为:

static void DoHeavyWork()
{
    Thread.Sleep(500);
}

正如您所看到的,我将可并行工作负载设置得有点重,这是为了好玩,也是为了做一个像样的例子。

接下来,我们必须在串行中运行两个工作负载以获得基线:

var stopwatch = new Stopwatch();
stopwatch.Start();
// Run Serial-only batch of work
foreach (var serialWork in serialWorkLoad)
{
    serialWork();
}
var s1 = stopwatch.ElapsedMilliseconds;
// Run parallelizable batch of work in serial to get our baseline
foreach (var notParallelWork in parallelizableWorkLoad)
{
    notParallelWork();
}
stopwatch.Stop();
var s2 = stopwatch.ElapsedMilliseconds - s1;

此时,我们知道每个工作负载串行运行所需的时间。现在,让我们再次运行它,将可并行化的部分并行化。

stopwatch.Reset();
stopwatch.Start();
// Run Serial-only batch of work
foreach (var serialWork in serialWorkLoad)
{
    serialWork();
}
var p1 = stopwatch.ElapsedMilliseconds;
// Run parallelizable batch of work in with as many degrees of parallelism as we can
Parallel.ForEach(parallelizableWorkLoad, (workToDo) => workToDo()); // In Java this is Magic Unicorns
stopwatch.Stop();
var p2 = stopwatch.ElapsedMilliseconds - p1;
现在我们有了基线和并行化版本,我们可以计算加速并报告我们的发现:
var speedup = (double)(s1 + s2) / (p1 + p2);
Console.WriteLine("Serial took  : {2}ms, {0}ms for serial work and {1}ms for parallelizable work", s1, s2, s1 + s2);
Console.WriteLine("Parallel took: {2}ms, {0}ms for serial work and {1}ms for parallelizable work", p1, p2, p1 + p2);
Console.WriteLine("Speedup was {0:F}x", speedup);

正如阿姆达尔定律所告诉你的那样,由于串行工作,你很难完美地扩展你所拥有的核心数量。

最新更新