프스레드 vs.오픈MP
Linux를 이용하여 C에서 멀티스레드 애플리케이션을 만들고 있다.
POSIX 스레드 API를 사용해야 할지 OpenMP API를 사용해야 할지 잘 모르겠어.
둘 중 하나를 사용하는 것의 장단점은 무엇인가?
편집:
API가 커널 레벨 스레드를 생성하는지 사용자 레벨 스레드를 생성하는지 누군가 명확히 할 수 있는가?
Pthreads와 OpenMP는 완전히 다른 두 개의 다중 처리 패러다임을 나타낸다.
Pthreads는 스레드 작업을 위한 매우 낮은 수준의 API이다.따라서 스레드 관리(생성/조인/etc), 뮤텍스 등에 대해 매우 세밀하게 제어할 수 있다.꽤 맨 뼈다귀다.
반면에, OpenMP는 훨씬 더 높은 레벨이고, 휴대성이 더 좋고, C를 사용하는 것을 제한하지 않는다.그것은 또한 pthreads보다 훨씬 더 쉽게 확장된다.이에 대한 한 가지 구체적인 예는 OpenMP의 작업 공유 구성으로, 비교적 쉽게 여러 스레드에 걸쳐 작업을 나눌 수 있다.(Wipedia의 장단점 목록도 참조하십시오.)
즉, 구현 중인 특정 프로그램이나 사용 방법에 대한 세부 정보를 제공하지 않았으므로 다른 API보다 한 API를 권장하는 것은 상당히 불가능하다.
OpenMP를 사용하면 하나의 실용성을 추가하는 것만큼 간단할 수 있으며, 선형 속도 향상으로 제대로 다중화된 코드를 90%까지 사용할 수 있다.같은 성능 향상을 위해 pthread를 사용하는 것은 훨씬 더 많은 작업을 필요로 한다.
하지만 평소와 같이, 당신은 pthreads에 더 많은 융통성을 얻는다.
기본적으로, 그것은 당신의 어플리케이션에 달려있다.당신은 사소한 병렬 알고리즘을 가지고 있는가?아니면 동시에 하고 싶은 임의의 작업이 많은가?그 업무들은 서로 얼마나 많은 대화를 해야 하는가?얼마나 많은 동기화가 필요한가?
OpenMP는 크로스 플랫폼이라는 이점과 일부 운영의 경우 단순하다는 장점이 있다.다음과 같은 루프의 병렬화와 같은 보다 높은 수준의 스레딩 옵션을 제공한다는 점에서 스레딩을 다른 방식으로 처리한다.
#pragma omp parallel for
for (i = 0; i < 500; i++)
arr[i] = 2 * i;
만약 이것이 흥미롭다면, 그리고 C++가 선택사항이라면, 나는 또한 스레딩 빌딩 블록을 추천한다.
Pthreads는 스레드를 생성하고 동기화를 명시적으로 하기 위한 하위 수준의 API이다.그런 점에서 더 많은 통제를 제공한다.
그것은 두 가지에 달려있다. 코드 베이스와 코드 베이스 안에 있는 당신의 위치.핵심 질문은- 1) "코드 베이스에 스레드, 스레드풀, 컨트롤 프라이머티브(잠금, 이벤트 등)가 있는가"와 2) "재사용 가능한 라이브러리나 일반 앱을 개발하고 있는가?"
라이브러리에 스레드 도구가 있는 경우(대부분 항상 PThread의 맛을 기반으로 구축됨) 해당 도구를 사용하십시오.도서관 개발자인 경우, 가능하면 시간을 들여 도서관들을 만드세요.그럴 가치가 있어. OpenMP가 주는 것보다 훨씬 더 정교하고 진보된 스레딩을 조립할 수 있어.
반대로 시간에 쫓기거나 제3자 도구로 앱이나 다른 것을 개발하는 데만 급급하면 OpenMP를 사용한다. 몇 개의 매크로에 싸서 필요한 기본 병렬화 기능을 얻을 수 있다.
일반적으로 OpenMP는 기본 멀티스레딩에 충분하다.높은 비동기 코드 구축에 대해 직접 시스템 자원을 관리해야 하는 시점에 도달하면 성능과 인터페이스 문제로 인해 사용 편의성이 크게 향상된다.
참조URL: https://stackoverflow.com/questions/3949901/pthreads-vs-openmp
'programing' 카테고리의 다른 글
Vue - 구성 요소 간 전환 (0) | 2022.05.05 |
---|---|
Java 8에서 두 날짜 사이의 일 계산 (0) | 2022.05.05 |
Vuex 스토어에 액세스할 수 없음 (0) | 2022.05.05 |
왜 memcpy보다 memmove가 더 빠른가? (0) | 2022.05.05 |
Vuex 작업을 여러 파일로 분할 (0) | 2022.05.05 |