2014-11-01 4 views
2

Можно ли передать функцию класса (с параметрами) в parallel_for? Что-то вдоль линий:Intel tbb parallel_for: передать функцию члена класса с параметрами?

void classT::A(const tbb::blocked_range<std::size_t>& r,b) {} 

void classT::B(e,f,g) { 
    tbb::parallel_for(blocked_range<size_t>(0,n), <need to call A with parameter b, 
                     along with r>) 
} 
+2

Если вы можете использовать C++ 11 функции, лямбда-выражение может помочь вам. – yohjp

+0

Отличный; Я был в состоянии сделать это: – mskb

+0

parallel_for (TBB :: blocked_range (0, п), [=] (Const ТВВ :: blocked_range & г) { \t \t \t этом-> А (г, б); \t \t}); – mskb

ответ

1

Посмотрите на this example.

Они создают класс и поддерживают класс со всеми необходимыми параметрами. В этом классе также есть operator(), который выполняет данные по данным. Параллельный_for затем вызывается с экземпляром этого класса.

parallel_for(blocked_range<int>(0, nElements, 100), ArraySummer(p_A, p_B, p_SUM_TBB)); 
//The class is arraysummer 

Как вы могли бы сделать это:

class ClassTACaller 
{ 
    int* m_parameter; 
    ClassT* m_Tinstance 

public: 

    ClassTACaller(ClassT* tinstance, int* param):m_parameter(param), m_Tinstance(tinstance){} 
    void operator() (const blocked_range<int>& r) const 
    { 
     m_Tinstance->A(r, param); 
    } 
}; 

parallel_for(blocked_range<int>(0, nElements, 100), ClassTACaller(&classTinstance, &x)); 
+0

спасибо. В моих поисках я встретил такие примеры. Но мне было интересно, есть ли способ упаковать мои задачи в самих функциях-членах класса (например, как люди делают с boost :: thread и boost :: bind) вместо создания отдельных классов для каждой задачи. Это возможно? – mskb

+0

Если ваш компилятор поддерживает C++ 11, вы можете использовать 'std :: bind', он будет работать. 'std :: bind' делает то же, что и я, но использует шаблоны. – Vincent

+0

К сожалению, похоже. Я пытался; вот что это выглядит: _parallel_for (tbb :: blocked_range (0, n), std :: bind (& classT :: A, this, b, std :: placeholders :: _ 1)); _ и существует несколько ошибок , первый из которых: – mskb

Смежные вопросы