반응형

http://studycan.tistory.com/100

[TBB] 기본 알고리즘

라이브러리 초기화 및 종료

인텔 스레딩 빌딩 블록의 컴포넌트들은 tbb 네임스페이스에 정의 된다. 이 글에서는 명시적으로 사용하기로 한다.

라이브러리에 있는 알고리즘 템플릿 또는 태스크 스케줄러를 사용하는 모든 스레드는 반드시tbb::task_scheduler_init 객체를 초기화해야 한다. 하나의 스레드에는 동시에 초기화해야 할, 하나 이상의 이 객체들이 있을 수 있다. 태스크 스케줄러는 모든 tast_scheduler_init 객체가 종료될 때 끝난다. 기본적으로, tast_scheduler_init의 생성자는 초기화를 수행하고 소멸자는 종료를 수행한다.

라이브러리 초기화
----------------------------------------------------------------------------------------------------------------------------------------------------------
#include "tbb/task_scheduler_init.h"
using namespace tbb;

int main(){
task_scheduler_init init;
. . .

return 0;
}

자동 시작/종료는 구현되지 않았는데, OpenMP를 구현해 본 인텔의 경험에 의하면, 우리는 그것을 배후에서 수행하는 것이 일부 운영체제에서는 상당히 많은 문제를 야기한다는 것을 알고 있다. 특히, 스레드가 종료되는 때를 항상 아는 것은 매우 어려운 문제이기 때문이다.

초기화를 한 번 이상 호출해도 프로그램 오류를 일으키지 않겠지만, 약간 낭비스러운 일이 될 것이며, 인텔 스레드 체커와 같은 디버깅 또는 분석 도구를 사용할 때 추가 경고들을 상당히 많이 발생시킬 수 있다.

task_scheduler_init의 생성자는 호출 스레드를 포함하여 원하는 스레드의 개수를 지정하는 선택적인 매개변수를 취하며, 이러한 선택적인 매개변수는 다음 중 하나가 될 수 있다.

  • 값 task_scheduler_init::automatic는 매개변수가 지정되지 않을 때의 기본 값이다. 이 값은 매서드 task_scheduler_init:: initialize를 위해 존재한다.
  • 값 task_scheduler_init::deferred는 매서드 task_scheduler_init::initialize(n)가 호출될 때까지 초기화가 연기되게 한다. 값 n은 생성자의 선택적인 매개변수에 대한 어떠한 합법적인 값도 될 수 있다.
  • 사용할 스레드의 개수를 지정하는 양의 정수 값

목적에 따른 생성자 인수 지정 방법

제품 개발 : task_scheduler_init::initialize(n) ‘인수를 지정
제품 출시 : task_scheduler_init::automatic ‘인수 지정 안함

큰 규모의 소프트웨어 프로젝트에서 다양한 컴포넌트들이 다른 컴포넌트에 최적이 될 스레드의 개수를 알 방법이 없기 때문이다. 하드웨어 스레드는 공유된 전역 리소스이며, 사용할 스레드의 개수를 결정하는 것은 태스크 스케줄러에게 맡기는 것이 최선이다.

스레드 개수보다 더 많은 태스크를 생성하도록 프로그램을 설계하고, 태스크 스케줄러가 태스크들을 스레드에 대응시키게 한다.

스케줄러 조기 종료
---------------------------------------------------------------------------------------------------------------------------------------------------------
#include "tbb/task_scheduler_init.h"
using namespace tbb;

int main(int argc, char* argv[]){
int nthread = strtol(argv[0], 0, 0);
task_scheduler_init init ( task_scheduler_init::deferred );

if( nthread >= 1 )
init.intialize(nthread);
. . .
if( nthread >= 1 )
init.terminate();

return 0;
}

task_scheduler_init의 소멸자는 task_scheduler_init이 초기화 되었는지 확인하고, 만일 그렇다면 종료를 수행하기 때문에 terminate()의 호출을 생략할 수 있다.

태스크 스케줄러는 초기화와 종료에 사용하기에는 다소 비용이 높기 때문에, 스레드가 생성될 떄메인 루틴에 task_scheduler_init을 집어 넣고, 병렬 알고리즘 템플릿을 사용할 때마다 스케줄러를 생성하지 않을 것을 권장한다.

반응형

+ Recent posts