티스토리 툴바


왠지 병렬처리를 안하면 안될거 같아!! 지금이라도 써보고 EVE에 적용시키자라는 생각으로 Threading Building Blocks ( 이하 TBB )를 설치해봤습니다. OpenMP도 봐봐야 할텐데 여기저기서 TBB를 많이 쓰시는 것 같아 TBB부터 돌려봤습니다.


일단 인텔 TBB 사이트에서 최신 안정화 버전을 다운로드 : http://threadingbuildingblocks.org/file.php?fid=77
다운 받은 라이브러리를 적당한 곳에 압축해제 해줍니다. 그리고 VS에서 환경 설정을 해줍니다.

Include 디렉터리


라이브러리 디렉터리
( 사용 중인 VS 버전에 맞는 디렉터리로 설정 ) 


종속성 파일 설정
( 디버그 모드에서는 tbb_debug.lib ) 

 
여기까지 하면 기본적인 TBB 사용을 위한 환경 설정이 됩니다. 참고로 TBB를 사용한 어플리케이션을 실행하게되면 tbb.dll 파일을 필요로 합니다. dll 파일들은 TBB 폴더안의 BIN 폴더에 각 환경별로 있으니 가져다 쓰시면 됩니다.

밑은 간단하게 TBB를 이용해 테스트 코드를 작성해봤습니다. 연산 비용이 큰 Matrix 역행렬을 구하는 함수 D3DXMatrixInverse를 100만번 호출합니다.
#include <iostream>
#include <string>
#include <tbb\tbb.h>

#include <d3dx9math.h>

using namespace tbb;
using namespace std;

class MatrixInverse 
{
public:
	MatrixInverse( const D3DXMATRIX& mat ) : m_mat(mat) {}

public:
	void operator()( const blocked_range<size_t>& r ) const 
	{
		for( size_t i=r.begin(); i!=r.end(); ++i )
		{
			D3DXMATRIX mat;
			D3DXMatrixInverse(&mat, 0, &m_mat);
		}
	}

private:
	D3DXMATRIX m_mat;
};

int main() 
{
	D3DXMATRIX mat;

	DWORD startTime = GetTickCount();
	parallel_for( blocked_range<size_t>(0, 1000000 ), MatrixInverse( mat ) );
	DWORD endTime = GetTickCount();

	cout << "Parallel Compute : " << endTime - startTime << endl;

	startTime = GetTickCount();
	for( int i = 0; i < 1000000; ++i )
		D3DXMatrixInverse(&mat, 0, &mat);
	endTime = GetTickCount();

	cout << "Serial Compute : " << endTime - startTime << endl;

	return 0;
}
쿼드코어 환경에서 실행 결과 ( release )
직렬인 경우와 병렬인 경우 실행시간 차이가
4배 가까이 차이 나는 것을 확인할 수 있었습니다.
병렬 만세~ 



자,
이제 이것을 어떻게 현재 프로젝트에 적용하냐가 문제....
후우...... 

 
저작자 표시 비영리 동일 조건 변경 허락

 



 

Posted by 친절한티스

TRACKBACK http://kindtis.tistory.com/trackback/345 관련글 쓰기

  1. 마이크로소프트웨어 2011년 10월호  삭제

    2011/10/15 18:26TRACKBACK FROM 프로그래머의 추억

    마이크로소프트웨어 (월간) 10월호 국내도서>잡지 저자 : 마소인터렉티브 편집부 출판 : 마소인터렉티브(잡지) 2011.09.28 상세보기 마이크로소프트웨어 2011년 10월호이다. 이번부터는 표지가 비닐느낌의 표지가 아니라 조금 더 부드러운 반투명 테이프 같은 느낌으로 바뀌었다. 그리고 표지에도 가을이 왔다. 사진의 악기는 우쿨렐레이다. Apple | iPhone 4 | Normal program | Pattern | 1/40sec | F/2.8..

댓글을 달아 주세요

  1. 은령

    오오.......

    전 OpenMP가 진입장벽이 더 낮아서 아직 그것만 만져보고 있었는데.... 인텔 컴파일러로 컴파일 안해도 돌아가나요?

    2011/05/03 19:02 [ ADDR : EDIT/ DEL : REPLY ]
    • 네. 따로 빌드같은거 안해줘도 VS에서 바로 사용가능하더라구요.
      OpenMP도 함 봐야겠네요.

      2011/05/04 00:32 [ ADDR : EDIT/ DEL ]
  2. CUDA를 먼저 공부하다가 보니 openMP는 듣긴했지만
    결국에는 전부 비슷비슷한 느낌이었는데 해보지는 못하고 있네요 ㅠ.ㅠ
    음.. intel꺼면 SSE 계열만 최적화 인가요? 혹시 AMD 계열은 안된다거나 그런 제약은 없는지요?

    결론 : 후우.. 티스님은 능력자 으헝헝 ㅠ.ㅠ
    사족 : TBB를 TTB로 보았음둥 + 윈도우는 역시 회색창이어야 제맛 -_-

    2011/05/08 09:23 [ ADDR : EDIT/ DEL : REPLY ]
    • AMD쪽도 잘 되요. 쓰레드 생성을 알아서 관리해주는데 참 좋더라구요.

      2011/05/10 16:56 [ ADDR : EDIT/ DEL ]
  3. 오류가...

    님께서 올려주신 블로그의 글을 보고 차분히 따라해봤는데요.

    test.obj : error LNK2019: unresolved external symbol "public: void __thiscall tbb::task_scheduler_init::initialize(int,unsigned int)" (?initialize@task_scheduler_init@tbb@@QAEXHI@Z) referenced in function "public: __thiscall tbb::task_scheduler_init::task_scheduler_init(int,unsigned int)" (??0task_scheduler_init@tbb@@QAE@HI@Z)
    1>test.obj : error LNK2019: unresolved external symbol "void __cdecl tbb::assertion_failure(char const *,int,char const *,char const *)" (?assertion_failure@tbb@@YAXPBDH00@Z) referenced in function "public: __thiscall tbb::task_scheduler_init::task_scheduler_init(int,unsigned int)" (??0task_scheduler_init@tbb@@QAE@HI@Z)
    1>test.obj : error LNK2019: unresolved external symbol "public: void __thiscall tbb::task_scheduler_init::terminate(void)" (?terminate@task_scheduler_init@tbb@@QAEXXZ) referenced in function "public: __thiscall tbb::task_scheduler_init::~task_scheduler_init(void)" (??1task_scheduler_init@tbb@@QAE@XZ)
    1>C:\test\test\Debug\test.exe : fatal error LNK1120: 3 unresolved externals

    이런 오류가 발생해서 해결하지 못하고 있어요ㅠㅠㅠ
    도와주세요

    2012/01/13 09:40 [ ADDR : EDIT/ DEL : REPLY ]
  4. 오류가...

    1.http://threadingbuildingblocks.org/file.php?fid=77

    에서 최신버전인 tbb40_20111130oss_win.zip을 다운받았습니다.



    2. 제 컴퓨터의 C:\TBB\tbb40_20111130oss 폴더에 알집을 풀고,



    3. 내컴퓨터 환경변수를 설정했습니다.

    변수이름: TBB40_INSTALL_DIR
    변수값:C:\TBB\tbb40_20111130oss


    4. visual studio 2008을 실행시켜 새프로젝트를 만들었습니다.
    file - new - winre console application- console applicaion - empty project.



    5. 만든 프로젝트를 클릭하여 오른쪽 마우스 버튼 누른 후 properties를 수정,
    1) configuration properties- c/c++- General- Additional Include Directories- $(TBB40_INSTALL_DIR)\include으로 설정
    2) Linker- General -의 Additional Library Directories -$(TBB40_INSTALL_DIR)\lib\intel64\vc9으로 설정
    -Input - Additional Dependencies-tbb_debug.lib (configuration: Active(Debug)일 경우)
    -Input - Additional Dependencies-tbb.lib(configuration: Release일 경우)



    6. C:\TBB\tbb40_20111130oss\bin\intel64\vc9폴더의
    tbb.dll과 tbb_debug.dll을 C:\Windows\System32 폴더에 복사.



    7. TBB초기화를 위해서
    만들어둔 프로젝트의 .cpp에

    #include "tbb/task_scheduler_init.h"
    using namespace tbb;
    int main( ) {
    task_scheduler_init init;

    return 0;
    }를 쓰고 build 하면



    8. 아래와 같은 link 오류가 발생합니다
    1>LINK : fatal error LNK1104: cannot open file 'tbb.debug.lib'


    위에 에러는 제 컴퓨터가 64bit인데, visual studio는 32비트로 깔려있는 것을 확인하고 다시 설치해서 해결했습니다. 하지만, 다른 오류가 ㅠㅠㅠ

    2012/01/13 14:51 [ ADDR : EDIT/ DEL : REPLY ]