如何将可变参数函数与TBB parallel_for并联
How to parallel variadic function with TBB parallel_for?
>我有一个这样的模板可变参数函数,需要与TBB parallel_for
函数并行化
template<typename T1, typename T2, typename... T3>
void func(T1 t1, T2 t2, std::size_t n, T3... t3)
我首先尝试使用 lambda 函数,它能够捕获可变参数。它使用 C++11 功能使用 clang 编译。
template<typename T1, typename T2, typename... T3>
void parallel_func(T1 t1, T2 t2, std::size_t n, T3 t3...){
range r(n);
apply_func = [=](range r){ //clang 6.1 can catch t3... here, gcc 4.8.3 could not
std::size_t offset = r.begin();
std::size_t n = r.end() -r.begin();
func(t1, t2, n, (t3+offset)...);
};
tbb::parallel_for(r, apply_func);
}
但是,我使用的群集没有编译器来支持此功能。我必须放弃lambda函数并编写一个类并将其传递给parallel_for
函数。我试过了:
template<typename T1, typename T2, typename... T3>
class ApplyFunc{
ApplyFunc(T1 t1, T2 t2, T3... t3){
t1_ = t1;
t2_ = t2;
t3_ = t3...;
}
void operator(range r){
std::size_t offset = r.begin();
std::size_t n = r.end() -r.begin();
func(T1, T2, n, (T3+offset)...);
}
private:
T1 t1_;
T2 t2_;
T3... t3_;
}
显然,不支持可变参数变量。我试过了 标准::元组t3_;但是,我无法将std::tuple<T3...>
转换回可变参数。
您可以使用
std::tuple<Ts...>
来保存可变参数值,并使用索引技巧扩展它以进行函数调用。C++14 标准库为此提供了std::index_sequence
。
#include <tuple>
// forward compatibility for C++14 Standard Library
namespace cxx14 {
template<std::size_t...> struct index_sequence{};
template<std::size_t N, std::size_t... Is>
struct make_index_sequence : make_index_sequence<N-1, N-1, Is...>{};
template<std::size_t... Is>
struct make_index_sequence<0, Is...> : index_sequence<Is...>{};
}
template<typename T1, typename T2, typename... Ts>
class ApplyFunc{
public:
ApplyFunc(T1 t1, T2 t2, Ts... ts)
: t1_(t1), t2_(t2), pack_(ts...) {}
template<std::size_t... Is>
void call(range r, cxx14::index_sequence<Is...>){
std::size_t offset = r.begin();
std::size_t n = r.end() - r.begin();
func(t1_, t2_, n, (std::get<Is>(pack_)+offset)...);
}
void operator()(range r){
call(r, cxx14::make_index_sequence<sizeof...(Ts)>());
}
private:
T1 t1_;
T2 t2_;
std::tuple<Ts...> pack_;
};
相关文章:
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- tbb::p arallel_for_each 在取消时未执行
- 如何完全关闭 TBB 代码中的线程
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 注册 TBB 的环境变量
- 如何将 tbb concurrent_hash_map转换为常规标准::地图?
- tbb:current_unordered_map()-向量中每个唯一元素的ID
- tbb::enumerable_thread_specific在其他线程库中工作吗
- TBB spin_mutex parallel_for内部以阻止关键部分
- 如何使用 TBB 在单个线程中运行函数
- 如何从TBB concurrent_hash_map C++迭代和擦除
- 函数中的"pragma omp parallel for"在另一个并行循环中调用函数时无效
- 通过引用将函数传递给 TBB 任务时无法返回值
- 手动管理和更新英特尔 TBB 流程图?
- 英特尔 TBB 计算图:如何指定节点的输入队列容量
- TBB 编译器错误 -"my_task":必须初始化引用
- 在调试模式下使用英特尔 TBB
- 如何使用英特尔 TBB 并发无序列图
- 英特尔 TBB - "初始化关键部分 Ex":找不到标识符编译器错误