在Cilk共享函数中使用Cilk减速器

Using Cilk reducer inside Cilk shared function

本文关键字:Cilk 减速器 函数 共享      更新时间:2023-10-16

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

我声明一个Cilk共享函数:

_Cilk_shared void somefun(int count)

我主要使用调用这个函数

_Cilk_offload somefun(12) ;

在这个功能中,所有的东西都被期望卸载到MIC;

我想在somefun中声明一个Cilk reducer,这样我就可以使用Cilk_for并附加到Cilk reductor列表中

但我得到错误:

error: illegal to declare an object of a class not marked _Cilk_shared, in a _Cilk_shared context
cilk::reducer_list_append<int> rw;

我知道我可以用卸载pragma来做这件事,所以我应该也可以用共享的cilk来做,对吧?

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

提前感谢

基本上,编译器抱怨的是,您从未告诉它需要为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_aattribute区域(假设没有依赖项),但只要您已经有了_Cilk_shared offload _attributeregion,您就可以使用它。这不会有任何影响。

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

希望英特尔为骑士登陆修复此问题。