J'ai une fonction variadique modèle comme celui-ci qui ont besoin de paralléliser avec fonction TBB parallel_for
Comment paralléliser la fonction variadique avec TBB parallel_for?
template<typename T1, typename T2, typename... T3>
void func(T1 t1, T2 t2, std::size_t n, T3... t3)
J'ai d'abord essayé d'utiliser une fonction lambda, il est en mesure de saisir les arguments variadique. Il compilé avec clang en utilisant la fonctionnalité C++ 11.
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);
}
Toutefois, le cluster que j'utilise ne possède pas de compilateur pour prendre en charge cette fonctionnalité. Je dois abandonner la fonction de lambda et écrire une classe et la passer à la fonction parallel_for
. Je essayé:
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_;
}
apparemment variable variadique n'est pas pris en charge. J'ai essayé std :: tuple t3_; Cependant, je ne suis pas en mesure de convertir std::tuple<T3...>
en arguments variadiques.
Vous compilez le code sur cluster où vous ne disposez pas du support C++ 11? – Jagannath
@Jagannath c'est gcc 4.8. Ce qui ne supporte pas lambda avec des arguments variadiques. – RealityPC
Désolé ne pouvait pas comprendre exactement. 'parallel_for' prend l'index de début et de fin pour parcourir. Alors, comment passez-vous la classe? Pourriez-vous utiliser 'parallel_for_each' et prendre tous ces arguments dans un' std :: tuple' et avoir 'begin' et' end' dans votre classe. Ça marchera ? – Jagannath