我有一个使用 Cilk 计算斐波那契数的并行程序。我知道还有其他方法可以计算斐波那契数,但由于我使用的是 Cilk,所以我选择使用递归来解决这个问题。
代码是从此答案中复制的。
我编译了程序并在aws上运行它。有8个核心,我指定的worker数是8个。
通过上述设置,我执行了计算第 40 个斐波那契数的程序。我所做的是用来$ time
查看执行需要多长时间。但是,有两种可能的输出:
real 0m9.126s
user 0m36.341s
sys 0m0.000s
和
real 0m4.746s
user 0m37.942s
sys 0m0.008s
我添加了函数__cilkrts_get_nworkers()
并main()
注意到在输出不同的两种情况下,工人的数量都是 8。
尽管使用 Cilk 存在开销,但我对导致两种不同输出的原因感到困惑。程序没有变化,工人数量相同,请问差异是否是由 Cilk 运行时调度程序引起的?因为每当它进入不完整的步骤时,处理器窃取的工作并不一定会将未执行的DAG的跨度减少1。所以我得到更好结果的原因是因为我很幸运,即在每次窃取中,被盗的工作减少了未执行的 DAG 减 1。
请问我的理解是否正确?还有其他原因导致这种情况吗?例如,是因为 AWS 机器本身吗?