在 Cilk 共享函数中使用 Cilk reducer

Using Cilk reducer inside Cilk shared function

您好,我正在尝试使用 _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 shared 做到这一点,对吗?

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

提前致谢

我发现我需要把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 中..如果将它们放在外面有时会出现奇怪的错误。

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

基本上,编译器抱怨的是您从未告诉它需要为 reducer_list_append class 中的所有函数创建协处理器代码和主机代码。声明协处理器需要 object rw 是必要的,但还不够。您还需要说 class 可以在协处理器上使用。

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

#pragma offload_attribute (push, _Cilk_shared) 
#include <vector> 
#include <offload.h> 
#pragma offload_attribute (pop) 

如果 rw 将进入共享内存,请尝试在这些 pragma 之间为 reducer_list_append 添加 headers,并使用共享分配器。如果您不需要 rw 在共享内存中,则不需要共享分配器。在这种情况下,您也可以将 class 的 header 放在一个简单的 offload_attribute 区域中,而不是 _Cilk_shared offload_attribute 区域 - 假设没有依赖性 - 但只要您已经拥有 _Cilk_shared offload_attribute 区域,您也可以使用它。它不会伤害任何东西。