왠지 병렬처리를 안하면 안될거 같아!! 지금이라도 써보고 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배 가까이 차이 나는 것을 확인할 수 있었습니다.
병렬 만세~
자,
이제 이것을 어떻게 현재 프로젝트에 적용하냐가 문제....
이제 이것을 어떻게 현재 프로젝트에 적용하냐가 문제....
후우......