c++ - cilk reduce 是如何完成的(thread vs smid)

标签 c++ multithreading simd cilk-plus

我有类似的东西:

  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 添加到 destsrc 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 实现的概念。 Cilk 不一定会产生额外的线程来进行额外的工作。它适用于在工作堆栈上推送任务。有关内部工作的更多信息,请访问 Cilk FAQ . Intel 编译器处理事情的方式可能与使用 Cilk 的 GCC 不同。英特尔 vTune 和英特尔矢量化报告可以帮助您衡量性能差异并指出它是否编译为 SIMD。使用英特尔编译器,您还可以按如下方式指示 SIMD 操作:

#pragma simd 在你的循环之上

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

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

相关文章:

c++ - Makefile 获取目录中的所有目标文件

c# - 在C#中使用参数委托(delegate)给其他线程

java - 多线程:更改对象的输出不符合预期

c++ - SIMD/SSE : How to check that all vector elements are non-zero

c - 如何将 SIMD int vector 转换为在 GCC 中 float ?

c++ - Win32 API : Creating file public for current user but private for everyone else

C++ : friend function in a template class for operator<<

c++ - std::numeric_limits 作为条件

java - 如何知道已经创建并运行了多少个线程?

assembly - 如何将二进制整数转换为十六进制字符串?