您好我正在尝试使用_Cilk_Shared和_Cilk_offload将一些并行工作卸载到MIC。
我声明了一个Cilk共享函数:
_Cilk_shared void somefun(int count)
在main中我使用
调用此函数_Cilk_offload somefun(12) ;
在此函数内部,预计所有内容都将卸载到MIC;
我想在somefun中声明一个Cilk reducer,所以我可以使用cilk_for并附加到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;
我知道我可以使用offload pragma来做到这一点所以我应该能够将这个与cilk共享吗?
我找不到使用_Cilk_shared和_Cilk_offload的具体示例。
提前致谢
答案 0 :(得分:0)
我发现我需要将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)
另外....我现在发现了2个有趣的事实:
最好不要把#define放在任何地方......它会给出奇怪的运行时错误。
尽可能多地将#define放在offload_attribute中。如果你把它们放在外面,有时会产生奇怪的错误。
希望英特尔为骑士登陆做好准备。
答案 1 :(得分:0)
基本上,编译器抱怨的是你从未告诉过它需要为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_attribute区域 - 假设没有依赖项 - 但只要您已经有一个_Cilk_shared offload_attribute区域,您也可以用它。它不会伤害任何东西。