code

Pthreads 대 OpenMP

codestyles 2020. 12. 30. 08:13
반응형

Pthreads 대 OpenMP


Linux를 사용하여 C로 다중 스레드 응용 프로그램을 만들고 있습니다.

POSIX 스레드 API를 사용해야하는지 OpenMP API를 사용해야하는지 잘 모르겠습니다.

둘 중 하나를 사용하는 장단점은 무엇입니까?

편집하다:

누군가가 두 API가 모두 커널 수준 또는 사용자 수준 스레드를 생성하는지 명확히 할 수 있습니까?


Pthread와 OpenMP는 완전히 다른 두 가지 다중 처리 패러다임을 나타냅니다.

Pthreads 는 스레드 작업을위한 매우 낮은 수준의 API입니다. 따라서 스레드 관리 (생성 / 조인 / 기타), 뮤텍스 등을 매우 세밀하게 제어 할 수 있습니다. 상당히 베어 본입니다.

반면에 OpenMP훨씬 더 높은 수준이고 이식성이 뛰어나며 C 사용으로 제한하지 않습니다. 또한 pthread보다 훨씬 쉽게 확장 할 수 있습니다. 이에 대한 한 가지 구체적인 예는 OpenMP의 작업 공유 구조로, 상대적으로 쉽게 작업을 여러 스레드로 나눌 수 있습니다. (위키 백과의 장단점 목록 참조 )

즉, 구현중인 특정 프로그램이나 사용 계획에 대한 세부 정보를 제공하지 않았으므로 하나의 API를 다른 API보다 권장하는 것은 상당히 불가능합니다.


OpenMP를 사용 하는 경우 단일 pragma를 추가하는 것만 큼 간단 할 수 있으며 선형 속도 향상으로 올바르게 다중 스레드 코드를 작성하는 방법의 90 %가됩니다. pthread로 동일한 성능 향상을 얻으려면 더 많은 작업이 필요합니다.

그러나 평소처럼 pthread를 사용하면 더 많은 유연성을 얻을 수 있습니다.

기본적으로 애플리케이션이 무엇인지에 따라 다릅니다. 사소하게 비교할 수있는 알고리즘이 있습니까? 아니면 동시에하고 싶은 임의의 작업이 많습니까? 작업이 서로 대화하는 데 얼마나 필요한가요? 얼마나 많은 동기화가 필요합니까?


OpenMP는 크로스 플랫폼이라는 장점이 있으며 일부 작업에서는 더 간단합니다. 다음과 같은 루프 병렬화와 같은 더 높은 수준의 스레딩 옵션을 제공한다는 점에서 다른 방식으로 스레딩을 처리합니다.

#pragma omp parallel for
for (i = 0; i < 500; i++)
    arr[i] = 2 * i;

이것이 관심이 있고 C ++가 옵션이라면 Threading Building Blocks를 권장 합니다.

Pthreads는 스레드를 생성하고 명시 적으로 동기화하기위한 하위 수준 API입니다. 그런 점에서 더 많은 제어를 제공합니다.


그것은 당신의 코드베이스와 그 안에서 당신의 위치라는 두 가지에 달려 있습니다. 주요 질문은 다음과 같습니다. 1) "코드베이스에 스레드, 스레드 풀 및 제어 기본 요소 (잠금, 이벤트 등)가 있습니까?"및 2) "재사용 가능한 라이브러리 또는 일반 앱을 개발하고 있습니까?"

라이브러리에 스레드 도구가있는 경우 (거의 항상 PThread의 일부 버전을 기반으로 구축 됨) THOSE를 사용하십시오. 도서관 개발자라면 시간을 들여 (가능한 경우)이를 구축하십시오. 그만한 가치가 있습니다. OpenMP가 제공하는 것보다 훨씬 더 세밀하고 고급 스레딩을 결합 할 수 있습니다.

반대로 시간이 촉박하거나 앱을 개발하거나 타사 도구를 사용하지 않는 경우 OpenMP를 사용하십시오. 몇 개의 매크로로 래핑하고 필요한 기본 병렬 처리를 얻을 수 있습니다.

일반적으로 OpenMP는 기본 멀티 스레딩에 충분합니다. 고도의 비동기 코드를 빌드하는 데 직접 리소스를 사용하는 시스템을 관리하는 시점에 도달하면 사용 편의성 이점이 성능 및 인터페이스 문제로 인해 복잡해집니다.

참조 URL : https://stackoverflow.com/questions/3949901/pthreads-vs-openmp

반응형