본문 바로가기

병렬프로그래밍

람다식을 이용한 TBB의 parallel_for parallel_for_each 에서 tbb::concurrent_unordered_map 을 사용해보자.

TBB를 사용해보시면 아시겠지만..
람다식을 사용하지 않고 TBB를 사용하려면 매우 복잡하고 피곤합니다..
사용하는 함수마다 class를 생성해줘야 되니깐요..

기본적으로 람다식이 된다는 가정하에 설명을 드리겠습니다.
람다식이 가능하다 == vc++ 2010 이상인걸로 간주하고 auto 키워드도 사용된다는걸로 생각하겠습니다..

일단 기존에 사용하던 방법입니다..
#include <stdio.h>
#include <tbb/tbb.h>

typedef tbb::concurrent_unordered_map<int,int> TBB_MAP;


class TbbUnorderMap {
public:
  void operator() (TBB_MAP::range_type& _range) const
  {
    for (TBB_MAP::iterator iter = _range.begin(); iter != _range.end(); ++iter)
    {
      printf("key : %d\t value : %d\n",iter->first,iter->second);
    }
  }
};

int main(int argc, char* argv[])
{
  TBB_MAP mapTest;

  for(int i=0;i < 100;i++)
  {
    mapTest.insert(TBB_MAP::value_type(i,i*100));
  }

  tbb::parallel_for(mapTest.range(),TbbUnorderMap(),tbb::auto_partitioner());
  return 0;
}



그리고 람다식을 이용한 방법입니다..
#include <stdio.h>
#include <tbb/tbb.h>

typedef tbb::concurrent_unordered_map<int,int> TBB_MAP;

int main(int argc, char* argv[])
{

  TBB_MAP mapTest;
  
  for(int i=0;i < 100;i++)
  {
    mapTest.insert(TBB_MAP::value_type(i,i*100));
  }

  tbb::parallel_for(mapTest.range(),[](const TBB_MAP::range_type& _range)
  {
    for(auto iter = _range.begin(); iter != _range.end(); iter++)
    {
      printf("key : %d\t value : %d\n",iter->first,iter->second);
    }
  },tbb::auto_partitioner());

	return 0;
}
전체적인 코드 길이는 비슷하지만.
class를 새로 만들어야되는게 없어서. 많이 편리합니다..