请求示例:将Intel/GCC Cilk Plus归约器移植到OpenCilk 2.1
OpenCilk 2.1 移植示例:替换GCC Cilk Plus reducer_list
OpenCilk 2.1 没有内置对应GCC Cilk Plus的reducer_list或op_list_append组件,需要手动基于cilk_reducer自定义支持列表追加的归约器。以下是原代码的移植版本:
#include <cilk/cilk.h> #include <list> #include <iostream> // 自定义列表归约器:支持并行追加元素并合并列表 struct list_reducer { // 归约器的视图:保存本地列表 std::list<char> view; // 合并操作:将另一个视图的列表追加到当前视图 void combine(list_reducer& other) { view.splice(view.end(), other.view); } // 提供push_back接口,和原代码逻辑对齐 void push_back(char ch) { view.push_back(ch); } }; // 用cilk_reducer关键字声明归约器类型 CILK_CXX_REDUCER(list_reducer, list_reducer, list_reducer::combine) void reducer_list_test() { using namespace std; // 初始化自定义归约器 cilk::reducer<list_reducer> letters_reducer; // 并行构建列表 cilk_for (char ch = 'a'; ch <= 'z'; ++ch) { // simulated_work(); // 保留原模拟工作函数,需自行实现 (*letters_reducer).push_back(ch); } // 获取归约结果并输出 const list<char>& letters = letters_reducer->view; cout << "Letters from custom reducer:"; for (char c : letters) { cout << " " << c; } cout << endl; }
关键差异说明
- OpenCilk要求自定义归约器,通过
CILK_CXX_REDUCER宏声明视图类型、构造方式和合并逻辑 - 原代码中
letters_reducer->push_back()改为(*letters_reducer).push_back(),因为OpenCilk的reducer迭代器直接访问视图对象 - 最终结果直接从归约器的
view成员获取,替代原get_value()方法
内容的提问来源于stack exchange,提问作者npras
相关产品推荐
相关产品推荐

