在Cilk共享函数中使用Cilk reducer

时间:2015-04-13 16:32:30

标签: c++ xeon-phi cilk-plus offloading

您好我正在尝试使用_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的具体示例。

提前致谢

2 个答案:

答案 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个有趣的事实:

  1. 最好不要把#define放在任何地方......它会给出奇怪的运行时错误。

  2. 尽可能多地将#define放在offload_attribute中。如果你把它们放在外面,有时会产生奇怪的错误。

  3. 希望英特尔为骑士登陆做好准备。

答案 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区域,您也可以用它。它不会伤害任何东西。