2011-09-04 8 views
2

OpenMP 및 Intel TBB를 사용하여 이미지 컨볼 루션 및 루 팩터 화를 병렬화했습니다. 나는 1-8 코어로 테스트하고있다. 하지만 OPENMP 및 TBB에서 1 ​​코어에서 set_num_threads (1) 및 task_scheduler_init InitTBB (1)를 사용하여 하나의 스레드를 지정하면이를 시도 할 수 있습니다. TBB 성능은 TBB 오버 헤드로 인해 순차 코드에 비해 약간의 성능 저하를 보여 주지만 놀랍게도 OpenCMP는 단일 코어에 오버 헤드를 표시하지 않으며 (Intel O3 최적화 수준을 사용하여) 순차 코드와 정확히 동일하게 수행합니다. OpenMP 루프의 정적 스케줄링을 사용하고 있습니다. 현실적인가요, 아니면 실수를하고 있습니까?OpenMP 오버 헤드

+0

'num_threads'에서'set_num_threads (num_threads) '까지의 인수가 런타임에만, 즉 사용자 입력으로부터 만 알려진다면 이런 일이 발생합니까? – Walter

답변

0

OpenMP는 컴파일러가 모든 작업을 수행하는 곳입니다. 컴파일러가 직렬 코드가 될 것이라는 것을 알고 있다면 항상 병렬 비트를 모두 합법적으로 건너 뛸 수 있습니다.

TBB 기본적으로 단순한 라이브러리라는 것을 알고 있습니다. 알고리즘을 병렬 및 병렬로 실행하려면 항상 알고리즘을 필요한 부분으로 장식해야합니다.

+0

OpenMP에서 단일 스레드를 설정하면 구현이 OpenMP pragma를 건너 뛰고 순차적으로 실행하기에 충분히 지능적이라고 말하는 것입니까? –

+0

질문에서 컴파일 타임에 설정하면 예 가능성이 높다고 생각합니다. – Flexo

+0

set_num_threads (1)은 OpenMP 컴파일러 지시문이 아닌 OpenMP 라이브러리의 일부이므로 컴파일러가 건너 뛰지 않습니다. – DirkMausF

2

OpenMP 런타임은 스레드를 하나만 실행하면 스레드를 생성하지 않을 것입니다.

또한 OpenMP 병렬 처리 지시문 을 사용하는 경우가 종종인데 컴파일러가 더 많은 정보를 제공 할 때 직렬 코드가 더 빨리 실행됩니다. 예를 들어, 작업 공유 구조는 루프의 반복이 서로 독립적임을 컴파일러에 알립니다. 컴파일러는 자체적으로 추론 할 수 없었으며 컴파일러가보다 적극적인 최적화 전략을 사용할 수있게합니다. 물론 항상 그런 것은 아니지만 "실제 코드"로 인해 발생하는 것을 보았습니다.

+1

"OpenMP 병렬화 지시문은 때때로 시리얼 코드도 만듭니다 본질적으로 컴파일러에게 더 많은 정보를 제공함에 따라 더 빠르게 실행됩니다. "- 이것은 흥미 롭습니다.불행하게도 openmp pragma로 1 개의 쓰레드를 사용할 때 약간의 성능 저하를 보았고, 단지 1 개의 쓰레드 만 있다면 #ifdefs를 사용하여 그것을 막았습니다. 특정 컴파일러/코드 조합을 보았습니까? – Sayan

+0

와우, 들어 본 적이 없어요. 그것을 시도해야합니다. 흥미 롭 군! – DirkMausF

0

OpenMP는 코드의 장식 된 부분 (#pragma omg for/parallel)을 주 스레드 (OpenMP없이 실행 됨) 및 추가 스레드로 포크합니다.

오직 하나의 스레드 만 사용하도록 구성하면이 스레드는 OpenMP 지시문없이 실행되는 주 스레드입니다. 오버 헤드가 없으므로 실행 경로가 분기되지 않습니다.

0

OpenMP는 컴파일러가 작업을 수행한다는 점에서 순차 코드에 최소한의 수정이 필요하며 각 스레드에 주어진 작업이 상당히 큰 경우에는 결과가 좋을 때가 많습니다. 나는 Pthread 나 thread를 C++ 11로 사용하여 코드를 테스트하고 그 결과를 보도록 제안 할 것이다.