tbb練習

サンプルを見ながら練習開始。
公式のGetting Startedのサンプルはいまいちだなぁ。
正直、何やってるか理解できんw
むしろ2つめくらいのサンプルとしてはよいか。


環境作り(gentoo)。
インストーラはあるのかもしれないが見つからなかったのでとりあえず

$ cd tbb21_20081109oss
$ gmake
# ln -s `pwd`/include/tbb /usr/local/include/tbb
# find build -name "*.so" | xargs cp -i /usr/local/lib

parallel_forの動作確認
main.cpp

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

struct RangePrint
{
  void operator()(const tbb::blocked_range<size_t>& r) const
  {
    for(size_t I=r.begin(); I!=r.end(); ++I){
      std::cout << ',' << I;
    }
    std::cout << std::endl;
  }
};

int main()
{
  tbb::task_scheduler_init init;
  tbb::parallel_for(
      tbb::blocked_range<size_t>(0, 100, 7),
      RangePrint()
      );
}

build, run

$ g++ main.cpp -ltbb_debug
$ export LD_LIBRARY_PATH=/usr/local/lib
$ ./a.out
,50,51,52,53,54,55
,56,57,58,59,60,61
,62,63,64,65,66,67
,68,69,70,71,72,73,74
,75,76,77,78,79,80
,81,82,83,84,85,86
,87,88,89,90,91,92
,93,94,95,96,97,98,99
,25,26,27,28,29,30
,31,32,33,34,35,36
,37,38,39,40,41,42
,43,44,45,46,47,48,49
,12,13,14,15,16,17
,18,19,20,21,22,23,24
,6,7,8,9,10,11
,0,1,2,3,4,5

0〜99が粒度7の範囲に分割された。
parallel_forに渡すfunctorの中で分割された範囲を処理する。
レンジひとつがタスクにあたり、タスク単位で適当にスレッドに割り当ててくれる
ということかな。
自らスレッドの同期とかそういう処理はしないで済むというのはありがたい。
Erlangでタスクを量産して丸投げするのに近い感覚で使えそうだ。