在 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 个有趣的事实:
最好不要把#define 放在任何地方...它会产生奇怪的运行时错误。
尽可能将#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 区域,您也可以使用它。它不会伤害任何东西。
您好,我正在尝试使用 _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 个有趣的事实:
最好不要把#define 放在任何地方...它会产生奇怪的运行时错误。
尽可能将#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 区域,您也可以使用它。它不会伤害任何东西。