首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么cilk_spawn的for循环比cilk_for循环做得更好?

为什么cilk_spawn的for循环比cilk_for循环做得更好?
EN

Stack Overflow用户
提问于 2014-04-23 21:20:28
回答 1查看 830关注 0票数 1

我有过

代码语言:javascript
复制
cilk_for (int i = 0; i < 100; i++)
   x = fib(35);

以上的时间需要6.151秒。

代码语言:javascript
复制
for (int i = 0; i < 100; i++)
   x = cilk_spawn fib(35);

需要5.703秒

fib(x)是可怕的递归斐波纳契数函数。如果我按下fib函数,cilk_forcilk_spawn做得更好,但在我看来,不管做fib(x) cilk_for需要多长时间,fib(x) cilk_for都应该比cilk_spawn做得更好。

我还不明白什么?

EN

回答 1

Stack Overflow用户

发布于 2014-04-24 23:56:16

根据评论,问题是缺少了一个cilk_sync。我将对此作进一步的阐述,指出如何准确地预测时间的比率。

在具有P硬件线程(通常是i7上的8个线程)的系统上,/cilk_sp结识代码将按以下方式执行:

  1. 初始线程将执行i=0的迭代,并留下一个被其他线程窃取的延续。
  2. 每个盗贼将窃取一个迭代,并在下一个迭代中留下一个延续。
  3. 当每个窃贼完成一个迭代时,它会返回到步骤2,除非没有更多的迭代要窃取。

因此,线程将手工执行循环,循环退出到P-1线程仍在进行迭代的点。因此,在只计算(100-P1)迭代后,可以期望循环完成.

因此,对于8个硬件线程,缺少cilk_sync的for /cilk_ should应该占用cilk_for所需时间的93/100,非常接近观察到的5.703/6.151 = 0.927的比率。

相反,在“子窃取”系统(如TBB或PPL task_group )中,循环将竞相完成,生成100个任务,然后继续运行直到调用task_group::wait。在这种情况下,忘记同步会导致更大比例的时间。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23255388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档