왠지 병렬처리를 안하면 안될거 같아!! 지금이라도 써보고 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배 가까이 차이 나는 것을 확인할 수 있었습니다.
병렬 만세~ 



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

 

+ Recent posts