주요 콘텐츠

parfor

설명

parfor LoopVar = InitVal:EndVal; Statements; end는 생성된 MEX 함수에 루프를 생성하거나 공유 메모리 멀티코어 플랫폼에서 병렬로 실행되는 C/C++ 코드에 루프를 생성합니다.

parfor 루프는 InitValEndval 사이에서 LoopVar의 값에 대한 Statements를 실행합니다. LoopVar은 1씩 증가하는 정수 값의 벡터를 지정합니다.

예제

parfor (LoopVar = InitVal:EndVal, NumThreads); Statements; end는 병렬 for 루프를 만들 때 최대 NumThreads개 스레드를 사용합니다.

예제

예제

모두 축소

parfor 루프가 포함된 MATLAB® 함수에 대한 MEX 함수와 독립 실행형 C 라이브러리를 생성합니다. 코드 생성기에 사용 가능한 최대 코어 수를 사용하도록 지시합니다.

parfor 루프에서 고속 푸리에 변환 함수 fft를 호출하는 MATLAB 함수 test_parfor를 정의합니다. 루프 반복이 병렬로 실행되므로 이 평가는 유사한 for 루프보다 훨씬 빠르게 완료될 수 있습니다.

function a = test_parfor %#codegen
  a = ones(10,256);  
  r = rand(10,256);
  parfor i = 1:10
    a(i,:) = real(fft(r(i)));
  end
end

명령줄에서 test_parfor에 대한 MEX 함수를 생성합니다. 최대 스레드 수를 지정하지 마십시오.

codegen test_parfor

MEX 함수를 명령줄에서 실행합니다. MEX 함수는 사용 가능한 코어를 사용합니다.

test_parfor_mex

test_parfor에 대한 독립 실행형 C 라이브러리를 생성합니다. 최대 스레드 수를 지정하지 마십시오. 생성된 C 코드는 사용 가능한 코어에서 루프 반복을 병렬로 실행합니다.

codegen -config:lib test_parfor

parfor 루프에 대한 코드를 생성하는 경우의 최대 스레드 수를 지정합니다.

입력 인수 u를 사용하여 parfor 루프의 최대 스레드 수를 지정하는 MATLAB 함수 specify_num_threads를 작성합니다.

function y = specify_num_threads(u) %#codegen
  y = ones(1,100);
  parfor (i = 1:100,u)
    y(i) = i;
  end
end

specify_num_threads에 대한 MEX 함수를 생성합니다. -args 0을 사용하여 u가 double형 스칼라임을 지정합니다.

codegen specify_num_threads -args 0

최대 4개의 스레드에서 함수가 병렬로 실행되도록 지정하여, 생성된 MEX 함수를 실행합니다. 생성된 MEX 함수는 최대 4개의 코어에서 실행됩니다. 사용 가능한 코어 수가 4개 미만인 경우, MEX 함수는 호출 시점에 사용 가능한 최대 코어 수로 실행됩니다.

specify_num_threads_mex(4)

test_parfor에 대한 C 코드를 생성합니다. -args 0을 사용하여 u가 double형 스칼라임을 지정합니다. 생성 코드에서 parfor 루프의 반복은 u에 지정된 최대 개수만큼의 코어에서 실행됩니다. 더 적은 수의 코어를 사용할 수 있는 경우 호출 시점에 사용 가능한 개수만큼의 코어에서 반복이 실행됩니다.

codegen -config:lib test_parfor -args 0 

parfor 루프에 대한 MEX 함수를 생성하기 전에 병렬화를 비활성화합니다.

parfor 루프에서 고속 푸리에 변환 함수 fft를 호출하는 MATLAB 함수 test_parfor를 작성합니다.

function a = test_parfor %#codegen
  a = ones(10,256);  
  r = rand(10,256);
  parfor i = 1:10
    a(i,:) = real(fft(r(i)));
  end
end

test_parfor에 대한 MEX 함수를 생성합니다. OpenMP 사용을 비활성화하여, codegen이 여러 스레드에서 실행될 수 있는 MEX 함수를 생성하지 않도록 합니다.

codegen -O disable:OpenMP test_parfor

codegen이 현재 폴더에 MEX 함수 test_parfor_mex를 생성합니다.

MEX 함수를 실행합니다.

test_parfor_mex

MEX 함수는 단일 스레드에서 실행됩니다.

병렬화와 비활성화된 경우 MATLAB Coder™parfor 루프를 for로 처리합니다. 소프트웨어는 단일 스레드에서 실행되는 MEX 함수를 생성합니다. 병렬화를 비활성화하면 생성된 MEX 함수 또는 C/C++ 코드의 직렬 버전과 병렬 버전의 성능을 비교할 수 있습니다. 병렬화를 비활성화하면 병렬 버전의 문제를 디버그할 수도 있습니다.

입력 인수

모두 축소

초기값이 InitVal이고 최종 값이 EndVal인 루프 인덱스 변수입니다.

루프 인덱스 변수 Loopvar의 초기값입니다. EndVal인 경우 parfor 범위 벡터를 지정하며, 형식 M:N의 범위 벡터여야 합니다.

루프 인덱스 변수 LoopVar의 최종 값입니다. InitVal인 경우 parfor 범위 벡터를 지정하며, 형식 M:N의 범위 벡터여야 합니다.

parfor 루프를 실행할 일련의 MATLAB 명령입니다.

같은 라인에 두 개 이상의 문을 배치하는 경우 세미콜론으로 문을 구분합니다. 예를 들면 다음과 같습니다.

parfor i = 1:10
 arr(i) = rand(); arr(i) = 2*arr(i)-1;
end

사용할 최대 스레드 수입니다. 상한이 지정된 경우 MATLAB Coder는 추가 코어를 사용할 수 있는 경우에도 이 숫자를 초과하여 사용하지 않습니다. 사용자가 사용 가능 코어 수를 초과하여 스레드를 요청하는 경우 MATLAB Coder는 호출 시점에 사용 가능한 최대 코어 수를 사용합니다. 루프 반복 횟수가 스레드 수보다 적은 경우 일부 스레드는 작업을 수행하지 않습니다.

parfor 루프를 여러 스레드에서 실행할 수 없는 경우(예: 1개의 코어만 사용할 수 있는 경우 또는 NumThreads가 0인 경우) MATLAB Coder는 직렬 방식으로 루프를 실행합니다.

제한 사항

  • OpenMP(Open Multiprocessing) 애플리케이션 인터페이스를 지원하는 컴파일러를 사용해야 합니다. 지원되는 컴파일러를 참조하십시오. OpenMP를 지원하지 않는 컴파일러를 사용하는 경우, MATLAB Coderparfor 루프를 for 루프로 처리합니다. 생성된 MEX 함수 또는 C/C++ 코드에서 루프 반복은 단일 스레드에서 실행됩니다.

  • OpenMP 애플리케이션 인터페이스는 JIT MEX 컴파일과 호환되지 않습니다. JIT Compilation Does Not Support OpenMP 항목을 참조하십시오.

  • parfor 루프 내부에서는 다음 구문을 사용하지 마십시오.

    • parfor 루프의 본문에서 coder.extrinsic을 사용하여 외재적 함수를 호출할 수 없습니다.

    • parfor 루프 내부의 전역 변수에는 쓰기를 할 수 없습니다.

    • MATLAB Coder는 축소에서 coder.ceval을 사용하는 것을 지원하지 않습니다. 예를 들어, 다음 parfor 루프에 대한 코드는 생성할 수 없습니다.

      parfor i = 1:4
        y = coder.ceval('myCFcn',y,i);
      end
      대신, coder.ceval을 사용하여 C 코드를 호출하는 로컬 함수를 작성하고 이 함수를 parfor 루프에서 호출하십시오. 예를 들면 다음과 같습니다.
      parfor i = 1:4
        y = callMyCFcn(y,i);
      end
      function y = callMyCFcn(y,i)
       y = coder.ceval('mCyFcn', y , i);
      end

    • parfor 루프에는 varargin 또는 varargout을 사용할 수 없습니다.

  • 루프 인덱스의 유형은 타깃 하드웨어에서 정수 유형으로 표현할 수 있어야 합니다. 멀티워드 유형이 필요하지 않은 유형을 생성 코드에 사용하십시오.

  • 독립 실행형 코드 생성 시 parfor에는 실행 파일 또는 라이브러리를 빌드하기 위한 툴체인 접근법이 필요합니다.

  • MATLAB 코드에서 parfor를 사용하려면 Parallel Computing Toolbox™ 라이선스가 필요합니다.

제한 사항의 전체 목록을 보려면 parfor Restrictions을 참조하십시오.

  • 다음의 경우에 parfor 루프를 사용하십시오.

    • 간단한 계산에 많은 루프 반복이 필요한 경우. parfor는 루프 반복을 그룹으로 나누어 각 스레드가 하나의 반복 그룹을 실행할 수 있도록 합니다.

    • 실행하는 데 시간이 오래 걸리는 루프 반복이 있는 경우.

  • 루프의 반복이 다른 반복의 결과에 따라 달라지는 경우에는 parfor 루프를 사용하지 마십시오.

    축소는 이 규칙의 예외 중 하나입니다. 축소 변수는 모든 반복에 따라 달라지는 값을 누적하지만, 반복 순서와는 관계가 없습니다.

  • 입력 인수 NumThreads는 생성 코드에 OpenMP num_threads() 절을 설정합니다. OpenMP는 환경 변수 OMP_NUM_THREADS를 설정하거나 omp_set_num_threads()를 사용하여 C/C++에서 스레드의 수를 전역적으로 제한하는 기능도 지원합니다. 자세한 내용은 openMP 사양을 참조하십시오. https://www.openmp.org/specifications/

버전 내역

R2012b에 개발됨