Простейший пример TBB

Может ли кто-нибудь дать мнеTBB пример как:

set the maximum count of active threads. execute tasks that are independent from each others and presented in the form of class, not static functions.

Ответы на вопрос(4)

может быть проще использоватьtbb::task_group, Пример взят изТВВ:

#include "tbb/task_group.h"  

using namespace tbb;

int Fib(int n) {
    if( n<2 ) {
        return n;
    } else {
        int x, y;
        task_group g;
        g.run([&]{x=Fib(n-1);}); // spawn a task
        g.run([&]{y=Fib(n-2);}); // spawn another task
        g.wait();                // wait for both tasks to complete
        return x+y;
    }
}

Обратите внимание, что

Creating a large number of tasks for a single task_group is not scalable, because task creation becomes a serial bottleneck.

В этих случаях используйте примеры Timday сparallel_for или так.

 //!
 //! Get the default number of threads
 //!
 int nDefThreads = tbb::task_scheduler_init::default_num_threads();

 //!
 //! Init the task scheduler with the wanted number of threads
 //!
 tbb::task_scheduler_init init(nDefThreads);

2-

Может быть, если ваш код позволяет, лучший способ запустить независимую задачу с TBB - этоparallel_invoke, В блоге зоны разработчиков Intel есть пост, объясняющий некоторые случаи того, насколько полезным может быть параллельный_инвойк. Проверять, выписыватьсяэтот

parallel_for с лямбдой; компилируется и работает на Debian / Wheezy сg++ -std=c++11 tbb_example.cpp -ltbb && ./a.out:

#include "tbb/parallel_for.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>

struct mytask {
  mytask(size_t n)
    :_n(n)
  {}
  void operator()() {
    for (int i=0;i<1000000;++i) {}  // Deliberately run slow
    std::cerr << "[" << _n << "]";
  }
  size_t _n;
};

int main(int,char**) {

  //tbb::task_scheduler_init init;  // Automatic number of threads
  tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads());  // Explicit number of threads

  std::vector<mytask> tasks;
  for (int i=0;i<1000;++i)
    tasks.push_back(mytask(i));

  tbb::parallel_for(
    tbb::blocked_range<size_t>(0,tasks.size()),
    [&tasks](const tbb::blocked_range<size_t>& r) {
      for (size_t i=r.begin();i<r.end();++i) tasks[i]();
    }
  );

  std::cerr << std::endl;

  return 0;
}

parallel_for, другой с помощьюparallel_for_each.

Update 2014-04-12Они показывают то, что я считаю довольно старомодным способом использования TBB сейчас; Я добавилотдельный ответ с помощьюparallel_for с лямбдой C ++ 11.

#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>

struct mytask {
  mytask(size_t n)
    :_n(n)
  {}
  void operator()() {
    for (int i=0;i<1000000;++i) {}  // Deliberately run slow
    std::cerr << "[" << _n << "]";
  }
  size_t _n;
};

struct executor
{
  executor(std::vector<mytask>& t)
    :_tasks(t)
  {}
  executor(executor& e,tbb::split)
    :_tasks(e._tasks)
  {}

  void operator()(const tbb::blocked_range<size_t>& r) const {
    for (size_t i=r.begin();i!=r.end();++i)
      _tasks[i]();
  }

  std::vector<mytask>& _tasks;
};

int main(int,char**) {

  tbb::task_scheduler_init init;  // Automatic number of threads
  // tbb::task_scheduler_init init(2);  // Explicit number of threads

  std::vector<mytask> tasks;
  for (int i=0;i<1000;++i)
    tasks.push_back(mytask(i));

  executor exec(tasks);
  tbb::parallel_for(tbb::blocked_range<size_t>(0,tasks.size()),exec);
  std::cerr << std::endl;

  return 0;
}

а также

#include "tbb/parallel_for_each.h"
#include "tbb/task_scheduler_init.h"
#include <iostream>
#include <vector>

struct mytask {
  mytask(size_t n)
    :_n(n)
  {}
  void operator()() {
    for (int i=0;i<1000000;++i) {}  // Deliberately run slow
    std::cerr << "[" << _n << "]";
  }
  size_t _n;
};

template <typename T> struct invoker {
  void operator()(T& it) const {it();}
};

int main(int,char**) {

  tbb::task_scheduler_init init;  // Automatic number of threads
  // tbb::task_scheduler_init init(4);  // Explicit number of threads

  std::vector<mytask> tasks;
  for (int i=0;i<1000;++i)
    tasks.push_back(mytask(i));

  tbb::parallel_for_each(tasks.begin(),tasks.end(),invoker<mytask>());
  std::cerr << std::endl;

  return 0;
}

Оба компилируются в системе Debian / Wheezy (g ++ 4.7) сg++ tbb_example.cpp -ltbb (затем запустить с./a.out)

(Увидетьэтот вопрос для замены этого & quot;invoker& Quot; вещь сstd::mem_fun_ref или жеboost::bind).

Ваш ответ на вопрос