0

我有类似的东西:

  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 不会增加线程开销并减慢整个过程吗?我应该在destsrc args 中添加限制以进一步帮助编译器吗?还是在这种情况下是隐含的?

(ps:我现在无法尝试代码,因为

内部编译器错误:在 find_rank 中,位于 c-family/array-notation-common.c:244

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

我也在努力解决。)

4

1 回答 1

1

restrict并非隐含的情况。此外,Cilk 是使用工作窃取概念实现的。Cilk 不一定会为额外的工作产生额外的线程。它适用于在工作堆栈上推送任务。有关内部工作的更多信息,请参阅Cilk 常见问题解答。英特尔编译器处理事情的方式可能与使用 Cilk 的 GCC 不同。英特尔 vTune 和英特尔矢量化报告可以帮助您衡量性能差异并指出它是否编译为 SIMD。使用英特尔编译器,您还可以指示 SIMD 操作,如下所示:

#pragma simd在你的循环之上

或者

数组表示法a[:] = b[:] + c[:]对向量化数组操作进行编程。

于 2015-08-14T12:43:30.810 回答