[OpenMp] openmp 라이브러리 소개 및 설치

OpenMP란?

OpenMP(Open Multi-Processing)는 공유 메모리 시스템에서 병렬 컴퓨팅을 구현하는 데 사용되는 병렬 프로그래밍 프레임워크입니다. 이는 GCC 컴파일러의 일부이며 프로그래머가 프로그램 병렬화를 달성하는 데 도움이 되는 일련의 지침과 컴파일러 지침을 제공합니다. OpenMP의 목표는 병렬 프로그래밍을 단순화하고 프로그램 실행 효율성을 향상시키는 것입니다.

OpenMP 작동 방식

OpenMP는 스레드 수준 병렬화를 사용하여 프로그램을 병렬로 실행합니다. 여러 스레드를 생성하여 프로그램의 다양한 부분을 실행하는 동시에 동기화 메커니즘을 사용하여 스레드 간 데이터 공유 및 작업 일정을 관리합니다. OpenMP의 병렬 지시문과 컴파일러 지침은 프로그래머가 병렬 작업을 식별하고 관리하여 프로그램의 병렬화를 달성하는 데 도움이 됩니다.

암달의 법칙

총계 = 1 ( 1 − P ) + PN {\text{총계}} = \frac{1}{(1 - P) + \frac{P}{N}}=( 1-)+N1
여기서 total은 총 속도 향상, P는 병렬화할 수 있는 부품의 비율, N은 병렬화 후 프로세서 수입니다.

시스템의 특정 부분의 초기 시간 소모 비율이 60%(a=0.6)이고, 가속도 비율 계수가 3(k=3)인 상황을 가정해 보겠습니다. 그러면 우리가 얻을 수 있는 가속도 비율은 1/[0.4+0.6/3]=1.67배입니다. 시스템의 주요 부분을 크게 개선했지만 얻은 시스템 속도 향상은 이 부분의 속도 향상보다 훨씬 작았습니다. 이것이 암달의 법칙의 핵심 사상인데, 전체 시스템의 속도를 획기적으로 높이기 위해서는 전체 시스템의 상당 부분을 가속해야 한다.
.

구스타프슨의 법칙

구스타프슨의 법칙은 프로세서 수, 병렬성 비율, 속도 향상 비율 간의 관계도 표현합니다.

실행 시간: 직렬 시간 a + 병렬 시간 b

최적화 후 시간: a + nb,

속도 향상 비율: (a + nb) / (a ​​​​+ b)

f직렬 비율: a / (a ​​​​+ b) 여기에 이미지 설명을 삽입하세요.
직렬 비율이 작을 경우 속도 향상 비율은 프로세서 수입니다.
이제 이러한 가정을 기반으로 Amdahl의 법칙에 의해 추정된 속도 향상을 고려하십시오. 직렬 실행 비율이 1%라고 가정하면 암달의 법칙 방정식은 1/(0.01 + (0.99/32)) = 24.43X를 산출합니다. 주어진 직렬 시간 비율은 32코어 실행과 관련되므로 이는 잘못된 계산입니다. 이 예에서는 더 많거나 더 적은 코어(또는 단 하나의 코어)에 대한 해당 직렬 실행 비율이 무엇인지 나타내지 않습니다. 코드가 완벽하게 확장되고 데이터 크기가 코어 수에 따라 확장되는 경우 이 비율은 일정하게 유지되며 Amdahl의 법칙 계산 결과는 32개 코어의 (고정 크기) 단일 코어 문제에 대한 예상 속도 향상이 됩니다.
스태폰의 법칙을 적용할 때 병렬 실행 중 직렬 시간의 백분율을 알아야 하므로 이 공식의 일반적인 사용 사례는 확장된 병렬 실행(데이터 세트 크기는 코어 수에 따라 증가)과 동일한 비율을 계산하는 것입니다. 크기 문제 직렬 라인 실행 속도 향상.

드문 경우지만 애플리케이션의 속도 향상이 코어 수보다 큽니다. 이 현상을 초선형가속도라고 합니다. 초선형 속도 향상이 발생하는 일반적인 이유는 고정 크기 데이터 세트가 로컬 캐시에 맞을 만큼 충분히 작은 크기(커널용)로 분할되기 때문입니다. 직렬 모드로 실행하는 경우 캐시에서 데이터를 가져와야 하며 프로세서는 가져오는 동안에만 기다릴 수 있습니다. 데이터가 이전에 사용된 일부 캐시 라인을 차지할 만큼 큰 경우, 이후에 해당 캐시 라인을 재사용하면 프로세서가 다시 대기하게 됩니다. 데이터가 코어에 캐시될 수 있는 청크로 분할되면 데이터가 모두 캐시되고 나면 캐시 라인을 재사용하는 데 따른 대기 다중화를 거칠 필요가 없습니다. 따라서 다중 코어를 사용하면 단일 코어에서 직렬 코드 실행과 관련된 오버헤드 중 일부가 제거됩니다. 이런 식으로 너무 작은 데이터 세트(일반적인 데이터 크기보다 작음)는 성능이 향상된다는 착각을 불러일으킵니다.

OpenMP는 다양한 계산 집약적 작업에 적용될 수 있습니다. 예를 들어 OpenMP를 사용하여 이미지 필터링 및 특징 추출과 같은 이미지 처리 작업을 병렬화할 수 있습니다. 또한 OpenMP를 사용하여 행렬 곱셈 및 행렬 반전과 같은 행렬 연산을 병렬화할 수 있습니다. 또한 OpenMP는 훈련 및 추론 프로세스 병렬화와 같은 기계 학습 작업에도 적용될 수 있습니다.

우분투에서 openmp 라이브러리 컴파일

openmp 라이브러리는 컴파일러와 함께 출시되며, 프로그램이 소스 코드에서 컴파일된 경우 컴파일러가 openmp 컴파일 옵션을 지원하는 한 확실히 작동합니다.
cmakelist에 추가:

FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

C++ 파일에 헤더 파일을 추가합니다.

#ifdef _OPENMP
#include <omp.h>
#endif

전체 메인 프로그램은 다음과 같습니다.

#include <iostream>
#ifdef _OPENMP
#include <omp.h>
#endif
using namespace std;

int main()
{
    
    

#if _OPENMP
        cout << " support openmp " << endl;
#else
        cout << " not support openmp" << endl;
#endif
        return 0;
}

추천

출처blog.csdn.net/hh1357102/article/details/132444977