我有这样的事情:
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/