C++ 在Cilk共享函数中使用Cilk reducer

C++ 在Cilk共享函数中使用Cilk reducer,c++,xeon-phi,cilk-plus,offloading,C++,Xeon Phi,Cilk Plus,Offloading,嗨,我正在尝试使用_-Cilk_共享和_-Cilk_卸载将一些并行工作卸载到麦克风 我声明一个Cilk共享函数: _Cilk_shared void somefun(int count) 大体上,我使用 _Cilk_offload somefun(12) ; 在这个功能中,所有的东西都会被转移到麦克风上 我想在somefun中声明一个Cilk reducer,这样我就可以使用Cilk_并附加到Cilk reducer列表中 但我得到了一个错误: error: illegal to decla

嗨,我正在尝试使用_-Cilk_共享和_-Cilk_卸载将一些并行工作卸载到麦克风

我声明一个Cilk共享函数:

_Cilk_shared void somefun(int count)
大体上,我使用

_Cilk_offload somefun(12) ;
在这个功能中,所有的东西都会被转移到麦克风上

我想在somefun中声明一个Cilk reducer,这样我就可以使用Cilk_并附加到Cilk reducer列表中

但我得到了一个错误:

error: illegal to declare an object of a class not marked _Cilk_shared, in a _Cilk_shared context
  cilk::reducer_list_append<int> rw;
错误:在共享上下文中声明未标记为共享的类的对象是非法的
cilk::reducer\u list\u append rw;
我知道我可以通过卸载pragma来实现这一点,所以我也应该能够通过cilk共享来实现这一点,对吗

我找不到使用共享和卸载的具体例子


提前感谢

我发现我需要将cilk库放在“卸载”属性“cilk共享”中:

#pragma offload_attribute (push,_Cilk_shared)
#include <cilk/cilk.h>
#include <cilk/cilk_api.h>
#include <cilk/reducer_list.h>
#pragma offload_attribute (pop)
#pragma offload_属性(推送、共享)
#包括
#包括
#包括
#pragma卸载_属性(pop)
另外……到目前为止,我发现了两个有趣的事实:

  • 最好不要把#define放在任何地方……这样会产生奇怪的运行时错误

  • 尽可能多地将#定义为offload_属性。如果将它们放在外部,有时会出现奇怪的错误


  • 希望英特尔能为knights landing解决这个问题。

    基本上,编译器抱怨的是,您从未告诉它需要为reducer\u list\u append类中的所有函数创建协处理器代码和主机代码。将对象rw声明为协处理器上需要的对象是必要的,但这还不够。您还需要说明该类可以在协处理器上使用

    因为您正在使用共享内存编程,所以您的程序中可能已经有如下内容:

    #pragma offload_attribute (push, _Cilk_shared) 
    #include <vector> 
    #include <offload.h> 
    #pragma offload_attribute (pop) 
    
    #pragma offload_属性(推送、共享)
    #包括
    #包括
    #pragma卸载_属性(pop)
    

    如果rw要在共享内存中,请尝试在这些pragma之间添加reducer\u list\u append的头,并使用共享分配器。如果不需要rw在共享内存中,那么就不需要共享分配器。在这种情况下,您还可以将类的头放在一个简单的卸载属性区域中,而不是一个共享卸载属性区域(假设没有依赖项),但只要您已经有一个共享卸载属性区域,您就可以使用它。这不会有什么坏处。

    很抱歉,我花了这么长时间才找到答案——这意味着你最终不得不自己去解决。至于定义问题,这取决于您定义的内容。如果需要在协处理器上定义,则应将定义放在卸载区域中。如果要在主机和协处理器上定义,则应仅将其放在卸载区域中。。这就是我发现的,否则有时会发生运行时错误,例如cilk库头。。