다음을 통해 공유


자동 병렬화와 자동 벡터화

자동 벡터화 및 자동 Parallelizer for 루프 코드에서 자동 성능 향상을 제공 하도록 설계 되었습니다.

자동-Parallelizer

/Qpar 컴파일러 스위치를 사용 자동 병렬화 코드에서의 루프.기존 코드를 변경 하지 않고이 플래그를 지정 하면 컴파일러가 병렬화의 이점을 얻을 수 있는 루프를 찾기 위해 코드를 계산 합니다.루프는 많은 작업을 수행 하지 않는 및 따라서 병렬화에서 도움이 되지 않는 것이 좋습니다 하 고 불필요 한 모든 병렬화 스레드 풀, 여분의 동기화 성능을 향상 시키고 대신 느린 경우가 다른 처리의 닝 높이기 수 있습니다 때문에 컴파일러는 병렬화 된 루프를 선택 하는 보수적입니다.예를 들어, 루프의 상한 컴파일 타임에 알 수 없는 다음 예제를 고려 하십시오.

void loop_test(int u) {
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

때문에 u 작은 값이 될 수 있습니다, 컴파일러가 자동으로이 루프는 병렬화 할 수 없습니다.그러나 여전히 알고 있는 때문에 병렬화 할 수 있습니다 u 항상 큰 됩니다.자동 병렬 처리를 사용 하려면 지정 #pragma loop(hint_parallel(n)), n 간에 병렬화 하는 스레드 수입니다.다음 예제에서는 컴파일러 8 스레드 간에 루프를 병렬화를 시도 합니다.

void loop_test(int u) {
#pragma loop(hint_parallel(8))
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

모든 pragma 지시문, 대체 pragma 구문이 __pragma(loop(hint_parallel(n))) 도 지원 합니다.

원하는 경우에 컴파일러를 병렬화 일부 루프입니다.예를 들어 다음과 같습니다.

#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
    A[i] = B[i] * C[i];

함수 upper_bound() 가 호출 될 때마다 변경 될 수 있습니다.상한 알 수 없습니다 때문에 컴파일러가이 루프 병렬화 할 수 없습니다 이유는 설명 하는 진단 메시지를 내보낼 수 있습니다.다음 예제에서는 병렬 처리할 수 있습니다 루프, 병렬화 될 수 없는 루프, 각 명령줄 옵션에 대 한 컴파일러 출력 및 명령 프롬프트를 사용 하 여 컴파일러가 구문을 보여 줍니다.

int A[1000];
void test() {
#pragma loop(hint_parallel(0))
    for (int i=0; i<1000; ++i) {
        A[i] = A[i] + 1;
    }

    for (int i=1000; i<2000; ++i) {
        A[i] = A[i] + 1;
    }
}

이 명령을 사용 하 여 컴파일하는 중:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1

이 출력은 다음과 같습니다.

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized

이 명령을 사용 하 여 컴파일하는 중:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2

이 출력은 다음과 같습니다.

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'

두 개의 서로 다른 출력 차이 확인 /Qpar-report (Auto-Parallelizer Reporting Level) 옵션./Qpar-report:1parallelizer 성공적으로 병렬화 된 루프에만 메시지를 출력 합니다./Qpar-report:2모두 성공 하거나 실패 한 루프 parallelizations parallelizer 메시지를 출력합니다.

이유 코드 및 메시지에 대 한 자세한 내용은 Vectorizer and Parallelizer Messages.

자동 벡터기

자동 벡터기 루프에서 코드를 분석 하 고 가능한 경우 벡터 레지스터 및 명령에서 컴퓨터를 실행 하.이렇게 하면 코드의 성능을 향상 시킬 수 있습니다.컴파일러는 인텔 이나 AMD 프로세서의 SSE2 명령 또는 네온 지침의 ARM 프로세서를 대상 으로합니다.자동 벡터기 또한는 최신 사용 SSE4.2 명령은 컴퓨터에서 지 원하는 경우 설정 합니다.

기본적으로, 자동 벡터화 사용 가능 합니다.코드에서 벡터화 성능을 비교 하려는 경우 사용할 수 있습니다 #pragma loop(no_vector) 주어진된 모든 루프의 벡터화를 사용 하지 않도록 설정 합니다.

#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
   A[i] = B[i] + C[i];

모든 pragma 지시문, 대체 pragma 구문이 __pragma(loop(no_vector)) 도 지원 합니다.

자동 Parallelizer에 지정한 대로 /Qvec-report (Auto-Vectorizer Reporting Level) 명령줄 옵션 중 하나를 성공적으로 보고만 루프를 벡터화-/Qvec-report:1-또는 둘 다 실패 하 고 성공적으로 벡터화 루프-/Qvec-report:2).

이유 코드 및 메시지에 대 한 자세한 내용은 Vectorizer and Parallelizer Messages.

벡터화 실제로 작동 하는 방식을 보여 주는 예제를 보려면 프로젝트 오스틴 2 부 6: 페이지 말릴

참고 항목

참조

loop

/Qpar(자동 평행화 도우미)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

기타 리소스

병렬 프로그래밍 네이티브 코드에서

Vectorizer and Parallelizer Messages