cilk_for
是Intel Cilk Plus的关键字,我们可以这样使用它:
cilk_for (int i = 0; i < 8; ++i)
{
do_work(i);
}
我需要更多的英特尔Cilk Plus与cilk_for
关键字的示例代码。
差不多就是这些了。cilk_for循环是并行化代码的最简单方法之一。注意事项:
- 不要试图根据内核的数量来调整循环的大小。像这样调优代码本质上是脆弱的。相反,应该在for循环中公开全部数据,让Cilk Plus运行时负责调度循环迭代。 小心种族!如果你没有使用像Cilkscreen或Intel Inspector这样的赛跑检测器测试你的应用程序,你可能已经得到赛跑减慢你的速度(充其量)并产生异常结果。
- cilk_for循环(示例)使用divide-and=conquer算法实现,该算法递归地将范围分成两半,直到剩余的迭代次数小于"粒度"。运行时通过将范围除以8P或8倍内核数来计算粒度。这通常是一个很好的值,不要太大,这样会有额外的开销,也不要太小,这样你就会缺乏并行性。你可以使用"#pragma cilk grainsize=value"形式的pragma来指定粒度,其中"value"可以是常量或表达式。但是我们的经验是,在一些特殊的地方,正确的粒度是1,在大多数其他地方,你最好使用默认值。
- 如果您的代码正在累积结果,请考虑使用reducer而不是lock。reducer提供无锁的数据"视图",这些数据由Cilk Plus运行时自动合并,从而保留了顺序顺序。
Barry Tannenbaum, Intel Cilk Plus Development