0

您好,我正在尝试使用 _Cilk_Shared 和 _Cilk_offload 将一些并行工作卸载到 MIC。

我声明了一个 Cilk 共享函数:

_Cilk_shared void somefun(int count)

在 main 我调用这个函数使用

_Cilk_offload somefun(12) ;

在这个函数中,所有东西都应该被卸载到 MIC;

我想在 somefun 中声明一个 Cilk 减速器,这样我就可以使用 cilk_for 并附加到一个 cilk 减速器列表中,

但我得到错误:

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 shared 来做到这一点,对吧?

我找不到使用 _Cilk_shared 和 _Cilk_offload 的具体示例。

提前致谢

4

2 回答 2

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)

另外....到目前为止,我发现了两个有趣的事实:

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

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

希望英特尔为骑士登陆解决这个问题。

于 2015-04-14T05:14:18.583 回答
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 区域,您也可以用它。它不会伤害任何东西。

于 2015-04-14T06:17:07.520 回答