cilk reduce 是如何完成的(thread vs smid)
How is cilk reduce done (thread vs smid)
我有类似的东西:
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 不会增加线程开销,而且速度很慢整件事下来了吗?
我是否应该将 restrict 添加到 dest 和 src args 以进一步帮助编译器?或者在这种情况下是隐含的?
(ps:由于
,我现在无法尝试该代码
internal compiler error: in find_rank, at
c-family/array-notation-common.c:244
在
neu1b->ac[0:layer1_size]=neu1->ac[0:layer1_size];
我也在努力解决。)
restrict
并非如此。此外,Cilk 是使用 work-stealing concept. Cilk does not necessarily spawn extra threads for extra work. It works with pushing tasks on a work stack. More info about the internal working can be found on the Cilk FAQ 实现的。 Intel 编译器处理事情的方式可能与使用 Cilk 的 GCC 不同。英特尔 vTune 和英特尔矢量化报告可以帮助您衡量性能差异并指出它是否编译为 SIMD。使用英特尔编译器,您还可以按如下方式指示 SIMD 操作:
#pragma simd
在你的循环之上
或
array notations:
a[:] = b[:] + c[:]
编写向量化数组操作。
我有类似的东西:
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 不会增加线程开销,而且速度很慢整件事下来了吗? 我是否应该将 restrict 添加到 dest 和 src args 以进一步帮助编译器?或者在这种情况下是隐含的?
(ps:由于
,我现在无法尝试该代码internal compiler error: in find_rank, at c-family/array-notation-common.c:244
在
neu1b->ac[0:layer1_size]=neu1->ac[0:layer1_size];
我也在努力解决。)
restrict
并非如此。此外,Cilk 是使用 work-stealing concept. Cilk does not necessarily spawn extra threads for extra work. It works with pushing tasks on a work stack. More info about the internal working can be found on the Cilk FAQ 实现的。 Intel 编译器处理事情的方式可能与使用 Cilk 的 GCC 不同。英特尔 vTune 和英特尔矢量化报告可以帮助您衡量性能差异并指出它是否编译为 SIMD。使用英特尔编译器,您还可以按如下方式指示 SIMD 操作:
#pragma simd
在你的循环之上
或
array notations:
a[:] = b[:] + c[:]
编写向量化数组操作。