2

cilk_for是 Intel Cilk Plus 的关键字,我们可以通过以下方式使用它:

cilk_for (int i = 0; i < 8; ++i)
{
    do_work(i);
}

我需要更多带有cilk_for关键字的 Intel Cilk Plus 示例代码。

4

1 回答 1

2

这几乎就是全部了。cilk_for 循环是并行化代码的最简单方法之一。需要注意的事项:

  • 不要尝试将循环的大小调整为核心数。像这样调整代码本质上是脆弱的。相反,在 for 循环中公开您的全部数据,让 Cilk Plus 运行时担心调度循环迭代。
  • 谨防种族!如果您没有使用CilkscreenIntel Inspector等竞赛检测器测试您的应用程序,您可能会遇到竞赛(充其量)并产生异常结果。
  • cilk_for 循环(示例)是使用分而治之算法实现的,该算法递归地将范围分成两半,直到剩余的迭代次数小于“粒度”。运行时通过将范围除以 8P 或内核数的 8 倍来计算粒度。这通常是一个很好的价值——不要太多,所以会有多余的开销,不要太少,所以你渴望并行。您可以使用“#pragma cilk grainsize=value”形式的编译指示指定粒度,其中“value”可以是常数或表达式。但我们的经验是,在某些特定的地方,正确的粒度为 1,而在大多数其他地方,您最好使用默认值。
  • 如果您的代码正在累积结果,请考虑使用减速器而不是锁。Reducers 提供由 Cilk Plus 运行时自动合并的数据的无锁“视图”,以便保留顺序排序。

Barry Tannenbaum,英特尔 Cilk Plus 开发

于 2014-08-07T19:19:43.093 回答