tbb를 사용하여 기존 재귀 알고리즘을 다중 스레드하려고합니다. 단일 스레드 버전은 꼬리 호출 재귀를 사용하며 구조적으로 다음과 같습니다.
void my_func() {
my_recusive_func (0);
}
bool doSomeWork (int i, int& a, int& b, int& c) {
// do some work
}
void my_recusive_func (int i) {
int a, b, c;
bool notDone = doSomeWork (i, a, b, c);
if (notDone) {
my_recusive_func (a);
my_recusive_func (b);
my_recusive_func (c);
}
}
나는 tbb 초보자이므로 첫 번째 시도는 parallel_invoke 함수를 사용했습니다.
void my_recusive_func (int i) {
int a, b, c;
bool notDone = doSomeWork (i, a, b, c);
if (notDone) {
tbb::parallel_invoke (
[a]{my_recusive_func (a);},
[b]{my_recusive_func (b);},
[c]{my_recusive_func (c);});
}
}
이것은 작동하고 단일 스레드 버전보다 빠르게 실행되지만 코어 수에 따라 잘 확장되지 않는 것 같습니다. 내가 목표로 삼고있는 머신은 16 개의 코어 (32 개의 하이퍼 스레드)를 가지고 있으므로이 프로젝트에서는 확장 성이 매우 중요하지만,이 버전은 해당 머신에서 기껏해야 약 8 배의 속도 향상을 얻고 알고리즘이 실행되는 동안 많은 코어가 유휴 상태로 보입니다.
내 이론은 tbb가 parallel_invoke 후 자식 작업이 완료되기를 기다리고 있으므로 불필요하게 대기하는 동안 많은 작업이있을 수 있습니다. 이것이 유휴 코어를 설명 할 수 있습니까? 자녀를 기다리지 않고 부모 작업이 반환되도록 할 수있는 방법이 있습니까? 나는 아마도 이와 같은 것을 생각하고 있었지만 스케줄러에 대해 아직 충분히 알지 못하여 이것이 괜찮은지 아닌지 알 수 없습니다.
void my_func()
{
tbb::task_group g;
my_recusive_func (0, g);
g.wait();
}
void my_recusive_func (int i, tbb::task_group& g) {
int a, b, c;
bool notDone = doSomeWork (i, a, b, c);
if (notDone) {
g.run([a,&g]{my_recusive_func(a, g);});
g.run([b,&g]{my_recusive_func(b, g);});
my_recusive_func (c, g);
}
}
내 첫 번째 질문은 tbb::task_group::run()
스레드로부터 안전합니까? 나는 문서에서 그것을 알아낼 수 없었다. 또한 이것에 대해 더 좋은 방법이 있습니까? 대신 저수준 스케줄러 호출을 사용해야할까요?
(컴파일하지 않고이 코드를 입력 했으므로 오타를 용서하십시오.)
여기에는 두 가지 질문이 있습니다.
일반적으로 task_group에서 적은 수의 작업을 생성하는 것이 가장 좋습니다. 재귀 병렬 처리를 사용하는 경우 각 수준에 고유 한 task_group을 제공합니다. 성능은 parallel_invoke를 사용하는 것보다 나을 것 같지는 않습니다.
저수준 tbb :: task 인터페이스가 최선의 방법입니다. tasK :: execute가 tail-call 태스크에 대한 포인터를 반환하는 트릭을 사용하여 꼬리 재귀를 코딩 할 수도 있습니다.
그러나 나는 유휴 스레드에 대해 약간 우려합니다. 스레드를 바쁘게 유지하기에 충분한 작업이 있는지 궁금합니다. 먼저 작업 기간 분석을 고려하십시오 . 인텔 컴파일러 (또는 gcc 4.9)를 사용하는 경우 먼저 Cilk 버전으로 실험 해 볼 수 있습니다. 속도가 빨라지지 않으면 낮은 수준의 tbb :: task 인터페이스도 도움이되지 않을 것이므로 더 높은 수준의 문제 (작업 및 범위)를 조사해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다