OpenMP 및 Intel TBB를 사용하여 이미지 컨볼 루션 및 루 팩터 화를 병렬화했습니다. 나는 1-8 코어로 테스트하고있다. 하지만 OPENMP 및 TBB에서 1 코어에서 set_num_threads (1) 및 task_scheduler_init InitTBB (1)를 사용하여 하나의 스레드를 지정하면이를 시도 할 수 있습니다. TBB 성능은 TBB 오버 헤드로 인해 순차 코드에 비해 약간의 성능 저하를 보여 주지만 놀랍게도 OpenCMP는 단일 코어에 오버 헤드를 표시하지 않으며 (Intel O3 최적화 수준을 사용하여) 순차 코드와 정확히 동일하게 수행합니다. OpenMP 루프의 정적 스케줄링을 사용하고 있습니다. 현실적인가요, 아니면 실수를하고 있습니까?OpenMP 오버 헤드
답변
OpenMP는 컴파일러가 모든 작업을 수행하는 곳입니다. 컴파일러가 직렬 코드가 될 것이라는 것을 알고 있다면 항상 병렬 비트를 모두 합법적으로 건너 뛸 수 있습니다.
TBB 기본적으로 단순한 라이브러리라는 것을 알고 있습니다. 알고리즘을 병렬 및 병렬로 실행하려면 항상 알고리즘을 필요한 부분으로 장식해야합니다.
OpenMP 런타임은 스레드를 하나만 실행하면 스레드를 생성하지 않을 것입니다.
또한 OpenMP 병렬 처리 지시문 을 사용하는 경우가 종종인데 컴파일러가 더 많은 정보를 제공 할 때 직렬 코드가 더 빨리 실행됩니다. 예를 들어, 작업 공유 구조는 루프의 반복이 서로 독립적임을 컴파일러에 알립니다. 컴파일러는 자체적으로 추론 할 수 없었으며 컴파일러가보다 적극적인 최적화 전략을 사용할 수있게합니다. 물론 항상 그런 것은 아니지만 "실제 코드"로 인해 발생하는 것을 보았습니다.
OpenMP는 코드의 장식 된 부분 (#pragma omg for/parallel)을 주 스레드 (OpenMP없이 실행 됨) 및 추가 스레드로 포크합니다.
오직 하나의 스레드 만 사용하도록 구성하면이 스레드는 OpenMP 지시문없이 실행되는 주 스레드입니다. 오버 헤드가 없으므로 실행 경로가 분기되지 않습니다.
OpenMP는 컴파일러가 작업을 수행한다는 점에서 순차 코드에 최소한의 수정이 필요하며 각 스레드에 주어진 작업이 상당히 큰 경우에는 결과가 좋을 때가 많습니다. 나는 Pthread 나 thread를 C++ 11로 사용하여 코드를 테스트하고 그 결과를 보도록 제안 할 것이다.
- 1. 개방 연결 오버 헤드
- 2. ScheduledThreadPoolExecutor를 사용하는 오버 헤드
- 3. ROWDEPENDENCIES 오라클의 오버 헤드
- 4. Android - SendBroadcast 오버 헤드
- 5. DLL 함수 오버 헤드
- 6. CoreData 메모리 오버 헤드
- 7. System.Diagnostics.Trace 오버 헤드
- 8. 불변의 사전 오버 헤드?
- 9. 리눅스에서 VMA의 오버 헤드
- 10. WCF. ConcurrencyMode의 오버 헤드
- 11. AOP 성능 오버 헤드
- 12. 패키지 로딩 오버 헤드
- 13. exec() 호출의 오버 헤드?
- 14. WebClient 구축 오버 헤드
- 15. InnoDB 디스크 사용량 오버 헤드
- 16. 파일의 로그 정보 오버 헤드
- 17. 가상 함수의 오버 헤드 테스트
- 18. 메모리 할당 자의 오버 헤드
- 19. 메모리 장벽/울타리의 오버 헤드
- 20. 이벤트 사용으로 인한 오버 헤드
- 21. PPP 및 이더넷 오버 헤드
- 22. 키워드를 사용할 때 오버 헤드?
- 23. PHP 프레임 워크 오버 헤드
- 24. SQL 커서 메모리 오버 헤드
- 25. 루아 함수 복사의 오버 헤드
- 26. 64 비트 스레드 오버 헤드
- 27. 거대한 CPU 오버 헤드 문제
- 28. 공유 메모리 설정에서의 MPI 오버 헤드
- 29. 매개 변수 검사 vs 함수 오버 헤드
- 30. 프레임 워크 비교 및 오버 헤드
'num_threads'에서'set_num_threads (num_threads) '까지의 인수가 런타임에만, 즉 사용자 입력으로부터 만 알려진다면 이런 일이 발생합니까? – Walter