我有这样的事情:

  for (b=from; b<to; b++)
  {
    for (a=from2; a<to2; a++)
    {
      dest->ac[b] += srcvec->ac[a] * srcmatrix->weight[a+(b+from)*matrix_width];
    }
  }


我想使用cilk进行并行化。我写了以下代码:

for ( b=from; b<to; b++)
{
  dest->ac[b] =+  __sec_reduce_add(srcvec->ac[from2:to2-from2] * (srcmatrix->weight+(b*matrix_width))[from2:to2-from2]);
}


但是问题是,我可以在主循环上使用cilk_for,但是如果reduce操作已经在生成线程,那么cilk_for不会增加线程开销并降低整个速度吗?
并且我应该在dest和src args中添加限制以进一步帮助编译器吗?还是在这种情况下是隐式的?

(ps:由于以下原因,我现在无法尝试使用该代码


  内部编译器错误:在find_rank中,位于
  c系列/数组符号通用.c:244




neu1b->ac[0:layer1_size]=neu1->ac[0:layer1_size];


我也在尝试解决。)

最佳答案

restrict并非暗含情况。此外,使用work-stealing概念实现了Cilk。 Cilk不一定会产生额外的线程来进行额外的工作。它与将任务推送到工作堆栈上一起工作。有关内部工作的更多信息,请参见Cilk FAQ。英特尔编译器在处理事情方面可能不同于使用Cilk的GCC。英特尔vTune和英特尔向量化报告可以帮助您评估性能差异并指出是否已编译为SIMD。使用英特尔编译器,您还可以按以下指示操作SIMD:

循环上方的#pragma simd

要么

array notations
a[:] = b[:] + c[:]可以编程向量化数组操作。

关于c++ - cilk reduce如何完成(线程vs smid),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32009993/

10-10 06:16