5

8 개 이상의 코어가있는 하드웨어에서 8 개 이상의 스레드가 동시에 실행될 수 있는지 궁금합니다.멀티 스레드 (openMP) - 병렬 스레드의 수

그렇다면 N 개의 계산을 병렬화하기 위해 openMP를 사용하면 N/8과 같은 크기의 청크를 만들 수 있으며 각 스레드에서 (N/8)/8 스레드로 포크를 추가 할 수 있습니다.

병렬 처리를 중첩하면 어떻게됩니까? 중첩 된 병렬을 위해 여전히 8 개의 사용 가능한 스레드가 있습니까?

감사합니다.

답변

10

8 개의 코어는 주어진 시점에 동시에 최대 8 개의 스레드 만 실행할 수 있습니다. 그러나 많은 것은 스레드가 수행하는 작업에 따라 다릅니다. CPU 집약적 인 작업을 수행하는 경우 코어 수보다 많은 스레드를 생성하는 것은 좋지 않습니다 (몇 개 정도는 가능). 그렇지 않으면 과도한 컨텍스트 스위칭 및 캐시 미스 (cache miss)로 인해 성능이 저하되기 시작합니다. 그러나 중요한 I/O가있는 경우 스레드가 CPU를 사용하지 않고 많이 차단 될 수 있으므로 더 많은 스레드를 병렬로 실행할 수 있습니다.

결론은 특정 환경, 특정 환경에서의 성능을 측정해야합니다.

도 참조하십시오. this related thread.

+0

인터리빙이 특정 시나리오에서 가능할 수 있다고 생각합니까? 예를 들어, 특정 프로세스가 끝나기를 기다리는 것이 많습니까? – ScarletAmaranth

+0

내 프로그램이 더 빠른 것 같습니다 (20 %?) 중첩 된 병렬을 사용합니다. 나는 쓰레드의 수를 절대 사용하지 않으며, omp_set_nested (true)를 설정한다. – octoback

+0

@ScarletAmaranth, yes. I/O가 이에 대한 가장 일반적인 예입니다 (따라서 필자의 답에서 언급 했음). 그러나 다른 경우도 있습니다. –

0

우선 8 개 이상의 스레드를 실행할 수 없습니다. 둘째, openmp가이 부분에서 많은 부분을 개선해야하므로 다른 기능이 없으면 중첩 된 병렬 처리를 사용하십시오.

1

최신 CPU 프로세서에는 하이퍼 스레딩 옵션이 있습니다.
이것은 파이프 라인이 동시에 두 개 이상의 스레드를 실행할 수 있음을 의미합니다.

그래서 동시에 실행할 수있는 스레드의 수는 다음과 같습니다
total_threads의 =의 num_procs * 하이퍼 스레딩 요인

일반적으로 CPU 집약적 인 워크로드를 들어 하이퍼 스레딩 요인 = 2

를 실행해야합니다 total_threads. 집중적 인 워크로드의 경우 total_threads * 2 스레드를 사용해야합니다. 이렇게하면 일부 스레드의 계산을 다른 스레드와 겹치게 할 수 있습니다.

이러한 엄지 손가락 규칙은 제가 따르는 것입니다. 작업량에 따라 변경할 수 있습니다.