왠지 병렬처리를 안하면 안될거 같아!! 지금이라도 써보고 EVE에 적용시키자라는 생각으로 Threading Building Blocks ( 이하 TBB )를 설치해봤습니다. OpenMP도 봐봐야 할텐데 여기저기서 TBB를 많이 쓰시는 것 같아 TBB부터 돌려봤습니다.
일단 인텔 TBB 사이트에서 최신 안정화 버전을 다운로드 : http://threadingbuildingblocks.org/file.php?fid=77
다운 받은 라이브러리를 적당한 곳에 압축해제 해줍니다. 그리고 VS에서 환경 설정을 해줍니다.
여기까지 하면 기본적인 TBB 사용을 위한 환경 설정이 됩니다. 참고로 TBB를 사용한 어플리케이션을 실행하게되면 tbb.dll 파일을 필요로 합니다. dll 파일들은 TBB 폴더안의 BIN 폴더에 각 환경별로 있으니 가져다 쓰시면 됩니다.
밑은 간단하게 TBB를 이용해 테스트 코드를 작성해봤습니다. 연산 비용이 큰 Matrix 역행렬을 구하는 함수 D3DXMatrixInverse를 100만번 호출합니다.
일단 인텔 TBB 사이트에서 최신 안정화 버전을 다운로드 : http://threadingbuildingblocks.org/file.php?fid=77
다운 받은 라이브러리를 적당한 곳에 압축해제 해줍니다. 그리고 VS에서 환경 설정을 해줍니다.
Include 디렉터리
라이브러리 디렉터리
( 사용 중인 VS 버전에 맞는 디렉터리로 설정 )
( 사용 중인 VS 버전에 맞는 디렉터리로 설정 )
종속성 파일 설정
( 디버그 모드에서는 tbb_debug.lib )
( 디버그 모드에서는 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배 가까이 차이 나는 것을 확인할 수 있었습니다.
병렬 만세~
직렬인 경우와 병렬인 경우 실행시간 차이가
4배 가까이 차이 나는 것을 확인할 수 있었습니다.
병렬 만세~
자,
이제 이것을 어떻게 현재 프로젝트에 적용하냐가 문제....
이제 이것을 어떻게 현재 프로젝트에 적용하냐가 문제....
후우......
'이것은 추천해야돼!! > 이렇게 한번 해보세요' 카테고리의 다른 글
| 배틀필드 3 배틀로그 자동 접속 활용 ( Battle Field Battlelog Auto Join ) (0) | 2011/11/01 |
|---|---|
| 프로그래밍용 폰트 Top 10 ( 10 of the Best Programming Fonts ) (6) | 2011/05/31 |
| Threading Building Blocks ( TBB ) 설치 (8) | 2011/05/03 |
| Visual Studio 2008 제거 (5) | 2011/03/12 |
| 우리은행 오픈뱅킹 사용기 (4) | 2010/09/17 |
| 스타크래프트 2 숨겨진 비밀 미션 (2) | 2010/08/01 |
| 트윗하기 |
TRACKBACK http://kindtis.tistory.com/trackback/345
-
마이크로소프트웨어 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..
댓글을 달아 주세요
오오.......
2011/05/03 19:02 [ ADDR : EDIT/ DEL : REPLY ]전 OpenMP가 진입장벽이 더 낮아서 아직 그것만 만져보고 있었는데.... 인텔 컴파일러로 컴파일 안해도 돌아가나요?
네. 따로 빌드같은거 안해줘도 VS에서 바로 사용가능하더라구요.
2011/05/04 00:32 [ ADDR : EDIT/ DEL ]OpenMP도 함 봐야겠네요.
CUDA를 먼저 공부하다가 보니 openMP는 듣긴했지만
2011/05/08 09:23 [ ADDR : EDIT/ DEL : REPLY ]결국에는 전부 비슷비슷한 느낌이었는데 해보지는 못하고 있네요 ㅠ.ㅠ
음.. intel꺼면 SSE 계열만 최적화 인가요? 혹시 AMD 계열은 안된다거나 그런 제약은 없는지요?
결론 : 후우.. 티스님은 능력자 으헝헝 ㅠ.ㅠ
사족 : TBB를 TTB로 보았음둥 + 윈도우는 역시 회색창이어야 제맛 -_-
AMD쪽도 잘 되요. 쓰레드 생성을 알아서 관리해주는데 참 좋더라구요.
2011/05/10 16:56 [ ADDR : EDIT/ DEL ]님께서 올려주신 블로그의 글을 보고 차분히 따라해봤는데요.
2012/01/13 09:40 [ ADDR : EDIT/ DEL : REPLY ]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
이런 오류가 발생해서 해결하지 못하고 있어요ㅠㅠㅠ
도와주세요
lib 파일이 제대로 추가되었나 다시 한번 확인해보세요.
2012/01/13 11:58 [ ADDR : EDIT/ DEL ]1.http://threadingbuildingblocks.org/file.php?fid=77
2012/01/13 14:51 [ ADDR : EDIT/ DEL : REPLY ]에서 최신버전인 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비트로 깔려있는 것을 확인하고 다시 설치해서 해결했습니다. 하지만, 다른 오류가 ㅠㅠㅠ
tbb_debug.lib
2012/01/13 17:26 [ ADDR : EDIT/ DEL ]tbb.debug.lib
음???