기사 검색

검색어를 입력하세요
스카이 테크 블로그
OMP 지시어(OpenMP)를 사용한 토토 사이트 처리 2부

OMP 지시문(OpenMP)을 사용한 토토 사이트 처리… 2부

OpenMP를 사용하여 토토 사이트 처리를 제어하는 자세한 방법을 설명합니다 구체적으로 민간보조구조, 일정보조구조, 중요보조구조, 원자보조구조의 활용방법과 그 효과에 대해 설명한다 또한 각 보조 구문에 대한 특정 코드 예제와 적절한 사용법도 포함되어 있습니다

이전 기사에 이어 컨트롤에 대해 좀 더 자세히 설명하겠습니다 자세한 내용은 일부에 불과합니다

1 개인 보조 구문

  • 아래 예의 루프 변수 j는 다음과 같습니다스레드마다 별도의 변수를 확보하여 실행
    예를 들어 작업자 스레드 1~4가 있는 경우 변수 j1~j4가 보호되어 각 스레드에서 실행됩니다
  • 비공개(j)가 없는 경우, 각 스레드는 공유 변수 j를 독립적으로 계산합니다순차 실행과 결과가 다름
#pragma omp 토토 사이트 for private( j )for (i=0; i<100; i++)for (j=0; j<100; j++)

토토 사이트처리의 의미를 생각해보면 기본적으로 비공개가 아닌가요? 그렇게 생각했는데 그렇지 않은 것 같네요 OpenMP 구문을 이해하기 어려운 부분이 아닐까 합니다
토토 사이트 처리를 실행하는 방법을 상상할 수 없다면 원하는 결과를 제공하는 프로세스를 생성할 수 없습니다
그런데 이전 글에서 설명한 축소 구문의 경우 기본값은 비공개입니다
(아래 코드 예시의 일부를 합산) 글쎄요, 그런 것 같습니다

#pragma omp 토토 사이트(축소용)(+:sum)
for(나는 =1; 나는 < 상수; 나++)합계+= a[i] * b[i];14별도로 계산됩니다합계으로 요약

2 예약 보조 구문

구문의 토토 사이트은 단순히 대상 루프의 범위(예: 1~n의 길이)를 스레드 수로 분할(연속적으로 분할)하여 토토 사이트 처리를 수행합니다
이 경우 각 스레드의 처리 부하가 고르지 않으면 토토 사이트 처리의 이점이 상실될 수 있습니다
아래 처리 이미지를 보시면 이해가 더 쉬울 것 같습니다

이 경우 작업자 스레드 4는 너무 일찍 종료되고 다른 스레드는 작업자 스레드 2가 암시적 장벽 지점에서 완료될 때까지 기다립니다
이 경우 토토 사이트처리임에도 불구하고 충분한 효과를 낼 수 없습니다

for 문의 단순 루프 처리에서 처리 시간에 이러한 극단적인 차이가 발생할 수 있습니까? 그렇게 생각할 수도 있지만 그렇습니다!-정수 나누기:정수 나누기 15-40 클럭 소비-128비트 벡터 분할 : 128비트 벡터 분할(32비트 4단계 토토 사이트 분할) 10~70 클럭 소모-부동 소수점 나누기: 실수 나누기 25-70 클럭 소모

이 로드 불균형을 해결하려면 루프 할당 간격을 줄이고 순환 방식으로 각 작업자 스레드에 작업을 할당하십시오
"할당 간격 = 청크 크기"의 최적 값은 하드웨어 및 대상 처리에 따라 다릅니다

아래 청크 크기 할당동적보조 구문for 비공개( j ) 일정(동적,10)
for(i=0; 나는<N1; 나++)for( j=0; j<N2; j++)09, 1019, 작업자 스레드가 형식으로 나누어짐1, 스레드2,, 각 루프 프로세스는 작업자 스레드의 가용성 순서대로 할당됩니다동적,10(청크 크기)은 조정을 통해 최적의 값을 결정합니다(다음 구문에도 동일하게 적용됨)동적보조 구문에서는 처리가 완료된 스레드부터 선착순으로 다음 루프 프로세스가 할당됩니다
계속정적보조 구문#pragma omp 토토 사이트(개인(j) 일정(정적,10))
for(i=0; 나는<N1; 나++)정적보조 구문의 작업자 스레드1, 1, 2, 3, 4, 1, 2, 3 등으로 시작하는 라운드 로빈 방식으로 할당합니다10에서 분할되며 작업자 스레드는 순서대로 프로세스를 실행합니다
다음은 보조 구문 안내입니다#개인( j ) 일정에 대한 pragma omp 토토 사이트(안내,10)
for(i=0; 나는<N1; 나++)1. 청크 크기가 1인 경우 각 청크의 크기는 대략 남은 반복 횟수를 스레드 수로 나눈 값입니다2청크 크기는 1로 갈수록 기하급수적으로 감소합니다3청크 크기 k를 1보다 크게 지정하면 청크 크기는 k로 기하급수적으로 줄어들지만 마지막 청크는 k보다 작을 수 있습니다4청크 크기를 지정하지 않으면 기본값은 1입니다

다음으로 위의 세 가지 보조 구문(동적, 안내됨, 정적)을 사용하는 방법을 설명하겠습니다

① 동적 및 안내 보조 구문을 사용하는 경우

For 루프 처리 로드의 편향이 실제로 처리가 실행될 때까지 결정될 수 없는 경우에 사용하십시오
청크 크기를 최적화하기 위해 사전에 조정 비용을 추가(청크 크기를 변경하면서 여러 번 시도)함으로써 보다 최적화된 프로세스를 생성할 수 있습니다

② 정적 보조 구문을 사용하는 경우

동적/가이드와 같은 런타임 스케줄링은 메커니즘으로 인해 시스템 오버헤드가 있지만 정적 스케줄링은 오버헤드가 거의 없습니다
따라서 부하가 고르게 분포되는 루프 범위를 미리 확인한 후 청크 크기를 지정하고 정적 스케줄링을 사용하는 것이 가장 효율적인 프로세스일 수 있습니다

3 중요한 보조 구문

다음 명령문이나 블록의 실행을 하나의 스레드로 제한합니다
이러한 지역을 임계 지역이라고 합니다
아래 예의 이름은 중요한 영역을 식별하는 데 사용됩니다
알다시피, 이는 일반적인 멀티스레드 프로그래밍에서 배타적 제어 역할을 합니다
중요 영역을 부주의하게 사용하면 토토 사이트 처리의 이점이 무효화될 수 있으며 성능에 심각한 영향을 미칠 수 있다는 점에 유의하십시오

#pragma omp 비판적 (이름){…
 }

4 원자 보조 구문

바로 다음 줄을 원자적 명령으로 실행합니다(분리할 수 없는 명령 = 여러 스레드가 실행 충돌 없이 공유 변수의 값을 안전하게 업데이트합니다)

#pragmaomp 원자i++;

"#pragma omp 원자" 선언 다음의 문은 다음으로 제한됩니다
x는 스칼라 변수이며 값은 x를 참조하지 않는 일반 표현식일 수 있습니다
"x++" "++x" "x--" "--x" "x+=값" "x-=값"
"x*=값" "x/=값" "x&=값" "x^=값" "x|=값" "x<<=값" "x>>=값"

``#pragma omp 비판적''은 ``#pragma omp 원자''의 상위 호환 이미지입니다
그러나 "#pragma omp 원자" 지시문을 사용하면 일반적으로 하드웨어 명령을 사용하여 값을 업데이트하므로 "#pragma omp important" 지시문을 사용하는 것보다 처리 속도가 더 빠릅니다
특별히 필요하지 않은 경우(여러 줄로 표현할 필요가 없는 경우) 원자 구문을 사용하세요

지금은 그게 전부입니다
개인적으로 OpenMP를 이용한 토토 사이트처리는 매우 복잡한 멀티스레드 프로그래밍에는 적합하지 않고 간단한 처리 설명으로 토토 사이트처리의 효율성을 높이도록 설계되어 있으므로 이전 글과 본 글의 내용을 제한하는 것으로 충분하다고 생각합니다
먼저, 자신만의 도구를 사용하여 효과를 느껴보세요
만약 그것이 어떻게 작동하는지 이해한다면 두려워할 필요가 없습니다
반면, 메커니즘을 이해하지 못하면 처리 결과가 순차적으로 실행된 결과와 다를 수 있으며 동작이 불분명할 수 있습니다

이 긴 메시지를 읽어주셔서 감사합니다


\공유해주세요! /
  • X
  • 페이스북
  • 라인

입사 후 실력을 향상시키고 싶은 청년이든, 다양한 분야에서 자신의 경험을 활용하고 싶은 베테랑이든, 개인의 경험에 맞는 중견 채용을 제공합니다

스카이코퍼레이션의 소프트웨어 개발, 제품, 채용에 관한 문의사항은 아래 링크를 확인해주세요
문의하기