嗨,我正在尝试使用_Cilk_Shared和_Cilk_download将一些并行工作卸载到MIC。
我声明一个Cilk共享函数:
_Cilk_shared void somefun(int count)
我主要使用调用这个函数
_Cilk_offload somefun(12) ;
在这个功能中,所有的东西都被期望卸载到MIC;
我想在somefun中声明一个Cilk reducer,这样我就可以使用Cilk_for并附加到Cilk reductor列表中
但我得到错误:
error: illegal to declare an object of a class not marked _Cilk_shared, in a _Cilk_shared context
cilk::reducer_list_append<int> rw;
我知道我可以用卸载pragma来做这件事,所以我应该也可以用共享的cilk来做,对吧?
我找不到使用_Cilk_shared和_Cilk_dunload的具体示例。
提前感谢
基本上,编译器抱怨的是,您从未告诉它需要为reducer_list_append类中的所有函数创建协处理器代码和主机代码。将对象rw声明为协处理器上需要的对象是必要的,但这还不够。您还需要说明该类可以在协处理器上使用。
因为您正在使用共享内存编程,所以您的程序中可能已经有了以下内容:
#pragma offload_attribute (push, _Cilk_shared)
#include <vector>
#include <offload.h>
#pragma offload_attribute (pop)
如果rw要在共享内存中,请尝试在这些pragma之间添加reducer_list_append的标头,并使用共享分配器。如果共享内存中不需要rw,那么就不需要共享分配器。在这种情况下,您也可以将类的头放在一个简单的offload_attribute区域中,而不是_Cilk_shared offload_aattribute区域(假设没有依赖项),但只要您已经有了_Cilk_shared offload _attributeregion,您就可以使用它。这不会有任何影响。
我发现我需要将cilk库放在offload_attribute _cilk_shared:中
#pragma offload_attribute (push,_Cilk_shared)
#include <cilk/cilk.h>
#include <cilk/cilk_api.h>
#include <cilk/reducer_list.h>
#pragma offload_attribute (pop)
此外。。。。截至目前,我发现了两个有趣的事实:
最好不要把#define放在任何地方。。。它会产生一个奇怪的运行时错误。
尽可能多地将#define放入offload_attribute中。。如果你把它们放在外面,有时会出现奇怪的错误。
希望英特尔为骑士登陆修复此问题。