vs omp simd의 병렬: 각각 언제 사용합니까?
OpenMP 4.0은 "omp simd"라는 새로운 구조를 도입했습니다.기존 "병렬"에 비해 이 구조를 사용하면 어떤 이점이 있습니까?둘 다 언제가 더 나은 선택이 될까요?
편집: 여기 SIMD 지침과 관련된 흥미로운 문서가 있습니다.
간단한 답변:
OpenMP는 여러 코어의 여러 스레드를 이용하기 위해서만 사용됩니다.이 새것simd
확장 기능을 사용하면 인텔의 AVX/SSE나 ARM의 NEON 등 최신 CPU에서 SIMD 명령을 명시적으로 사용할 수 있습니다.
(SIMD 명령은 설계상 단일 스레드와 단일 코어로 실행됩니다.그러나 GPGPU의 경우 SIMD의 의미는 상당히 확대될 수 있지만 OpenMP 4.0의 경우 GPGPU를 고려할 필요는 없다고 생각합니다.)
따라서 SIMD 지침을 알게 되면 이 새로운 구성을 사용할 수 있습니다.
현대의 CPU에는 대략 (1) 명령어레벨 병렬화(ILP), (2) 스레드레벨 병렬화(TLP), (3) SIMD 명령의 3종류가 있습니다(이것은 벡터레벨이라고 할 수 있습니다).
ILP는 고장난 CPU 또는 컴파일러에 의해 자동으로 실행됩니다.OpenMP를 사용하여 TLP를 이용할 수 있습니다.parallel for
기타 스레드 라이브러리.그렇다면 SIMD는 어떨까요? 내장식은 컴파일러의 자동 벡터화뿐만 아니라 그것들을 사용하는 방법이었다.OpenMP의simd
SIMD를 사용하는 새로운 방법입니다.
매우 간단한 예를 들어 보겠습니다.
for (int i = 0; i < N; ++i)
A[i] = B[i] + C[i];
위의 코드는 2개의 N차원 벡터의 합을 계산합니다.쉽게 알 수 있듯이 어레이에 대한 (루프 캐리어된) 데이터 의존성이 없습니다.A[]
이 루프는 당혹스러울 정도로 평행합니다.
이 루프를 병렬화하는 방법은 여러 가지가 있습니다.예를 들어 OpenMP 4.0까지 이 병렬화는parallel for
건설하다.각 스레드가 동작합니다.N/#thread
여러 코어로 반복할 수 있습니다.
그러나 이러한 단순한 추가에 여러 스레드를 사용하는 것은 지나친 조치라고 생각할 수 있습니다.이것이 바로 벡터화가 존재하는 이유이며, 이는 대부분 SIMD 명령에 의해 구현됩니다.
SIMD를 사용하는 방법은 다음과 같습니다.
for (int i = 0; i < N/8; ++i)
VECTOR_ADD(A + i, B + i, C + i);
이 코드는 (1) SIMD 명령이VECTOR_ADD
)는 256비트 또는8방향(8*32비트) 및 (2)N
는 8의 배수입니다.
8방향 SIMD 명령은 벡터 내의 8개 항목을 단일 기계 명령으로 실행할 수 있음을 의미한다.인텔의 최신 AVX는 8방향(32비트*8 = 256비트) 벡터 명령을 제공합니다.
SIMD에서는 여전히 단일 코어를 사용합니다(이것 역시 GPU가 아닌 기존 CPU에만 해당).그러나 하드웨어에서는 숨겨진 병렬 처리를 사용할 수 있습니다.최신 CPU는 각 SIMD 레인을 병렬로 실행할 수 있는 SIMD 명령 전용 하드웨어 리소스를 제공합니다.
스레드 수준의 병렬 처리를 동시에 사용할 수 있습니다.위의 예는 다음과 같이 병렬화할 수 있습니다.parallel for
.
(단, 실제로 몇 개의 루프를 SIMDized 루프로 변환할 수 있는지 의문입니다.OpenMP 4.0 사양은 조금 불분명한 것 같습니다.따라서 실제 성능 및 실제 제한은 실제 컴파일러의 구현에 따라 달라집니다.)
요약하자면simd
construct를 사용하면 SIMD 명령을 사용할 수 있으므로 스레드 수준의 병렬 처리와 함께 더 많은 병렬 처리를 이용할 수 있습니다.다만, 실제의 실장은 중요하다고 생각합니다.
링크된 표준이 비교적 명확합니다(p 13, 19+20 행).
스레드가 simd constructure와 조우하면 해당 구조물에 관련된 루프의 반복은 스레드에 이용 가능한 SIMD 레인에 의해 실행될 수 있습니다.
SIMD
부차적인 것입니다.좀 더 구체적으로 말하면 CPU에서는simd
명령어는 같은 스레드에 개별적으로 속하는 루프 반복 청크의 벡터화를 구체적으로 요구합니다.단일 멀티코어 프로세서 내에 존재하는 여러 병렬 처리 수준을 플랫폼에 의존하지 않는 방식으로 노출합니다.예를 들어 이 인텔 블로그 투고에서는 (액셀러레이터와 함께) 토론을 참조해 주십시오.
그래서 기본적으로는,omp parallel
여러 스레드에 작업을 분산하여 여러 코어로 이행할 수 있습니다.사용할 수 있습니다.omp simd
각 코어 내에서 벡터 파이프라인(예를 들어)을 사용한다.보통.omp parallel
보다 거칠어진 병렬 분배에 대처하기 위해 "직장"에 들어갈 것이다.omp simd
미세한 병렬성을 이용하기 위해 그 안에서 단단한 루프를 돌 것입니다.
컴파일러는 simd 절의 존재를 조건으로 병렬 영역에서 simd 최적화를 수행할 필요가 없습니다.익숙한 컴파일러는 이전과 같은 방식으로 중첩 루프, 병렬 외부, 벡터 내부를 계속 지원합니다.
과거에는 외부 병렬화 루프(collapse구가 있는 다중 루프)를 포함하는 루프 스위칭 최적화를 방지하기 위해 OpenMP 지시가 일반적으로 사용되었습니다.이것은 일부 컴파일러에서 변경된 것 같습니다.OpenMP4는 omp parallel do [for] simd가 설정되어 있을 때 일종의 스트립 마이닝에 의해 비벡터화 내부루프와의 병렬외부루프의 최적화를 포함한 새로운 가능성을 연다. ifort는 simd 절이 없는 경우에 외부루프 벡터화로서 보고하는 경우도 있다.그런 다음 Omp parallel do simd보다 적은 수의 스레드에 최적화될 수 있으며, 이는 성과를 내기 위해 simd 벡터 폭보다 더 많은 스레드가 필요할 것으로 보입니다.이러한 구별은 유추될 수 있는데, simd 절이 없는 경우, simd 절이 무조건적인 simd 최적화를 요구하는 동안 컴파일러는 암시적으로 100 또는 300과 같은 루프 카운트를 위해 최적화하도록 요구됩니다.24코어 플랫폼에서는 gcc 4.9 amp parallel for simd가 매우 효과적이었습니다.
언급URL : https://stackoverflow.com/questions/14674049/parallel-for-vs-omp-simd-when-to-use-each
'itsource' 카테고리의 다른 글
보통 | over | 를 사용하는 이유는 무엇입니까?뭐가 다른데? (0) | 2022.08.14 |
---|---|
단방향 및 양방향 JPA 및 휴지 상태 연결의 차이점은 무엇입니까? (0) | 2022.08.14 |
Vue js의 인스턴스 외부에서 데이터에 액세스하는 방법이중 값을 소수점 2자리로 포맷하는 가장 좋은 방법 (0) | 2022.08.14 |
const와 const volatile의 차이 (0) | 2022.07.21 |
사전 로드된 상태의 사용자 지정 nuxt 500 오류 페이지 (0) | 2022.07.21 |