Main Content

for 루프를 parfor 루프로 변환하기

for 루프를 parfor 루프로 변환하도록 코드를 수정해야만 하는 경우가 있습니다. 이 예제에서는 간단한 중첩 for 루프를 사용하여 parfor 루프 문제를 진단하고 수정하는 방법에 대해 설명합니다. MATLAB®에서 다음 코드를 실행하고 결과를 확인해 보십시오.

for x = 0:0.1:1
    for y = 2:10
        A(y) = A(y-1) + y;
    end
end

코드의 속도를 높이려면 for 루프를 parfor 루프로 변환해 보십시오. 이 코드가 오류를 생성한다는 것을 알 수 있습니다.

parfor x = 0:0.1:1
    parfor y = 2:10
        A(y) = A(y-1) + y;
    end
end

이 경우, 코드 수정 없이 단순히 for 루프를 parfor 루프로 변환할 수 없습니다. 오류 없이 제대로 작동하게 하려면 몇 군데 코드를 변경해야 합니다. 문제를 진단하려면 MATLAB 편집기의 코드 분석기 메시지를 확인하십시오.

Example MATLAB Code Analyzer messages indicating that parfor or spmd cannot be used inside another parfor loop and that the parfor-loop cannot run due to the way variable x is used.

이 코드는 for 루프를 parfor 루프로 변환할 때 생기는 흔한 문제를 보여줍니다.

Parfor-loop example code showing common problems, including using a noninteger as the parfor loop variable, using nested parfor loops, and making an iteration of a parfor-loop dependent on a previous iteration.

이러한 문제를 해결하려면 parfor를 사용하도록 코드를 수정해야 합니다. parfor 루프의 본문은 비결정적 순서로 여러 MATLAB 워커를 사용하여 병렬 풀에서 실행됩니다. 따라서 parfor 루프의 본문이 다음 요구 사항을 충족해야 합니다.

  1. parfor 루프의 본문은 독립적이어야 합니다. 반복은 비결정적 순서로 병렬 실행되므로 하나의 루프 반복이 이전 반복에 영향을 받을 수 없습니다. 다음 예제를 보십시오.

    A(y) = A(y-1) + y;
    위 코드는 독립적이지 않으므로 parfor를 사용할 수 없습니다. 독립성 문제를 처리하는 다음 단계는 parfor 루프 반복이 서로 독립적이어야 함 항목을 참조하십시오.

  2. parfor 루프를 또다른 parfor 루프 내에 중첩할 수 없습니다. 이 예제에는 두 개의 중첩된 for 루프가 있으므로 하나의 for 루프만 parfor 루프로 바꿀 수 있습니다. 대신 다른 parfor 루프의 본문 내에서 parfor 루프를 사용하는 함수를 호출할 수 있습니다. 그러나 모든 워커가 가장 바깥쪽 루프를 병렬화하는 데 사용되기 때문에 이러한 중첩 parfor 루프는 계산적인 이점이 없습니다. 중첩 루프를 처리하는 방법에 대한 자세한 내용은 중첩 parfor 루프와 중첩 for 루프 및 기타 parfor 요구 사항 항목을 참조하십시오.

  3. parfor 루프 변수는 연속으로 증가하는 정수여야 합니다. 다음 예제를 보십시오.

    parfor x = 0:0.1:1
    위 코드에는 정수가 아닌 루프 변수가 있으므로 여기서는 parfor를 사용할 수 없습니다. 루프 변수의 값을 알고리즘에서 요구하는 정수 값으로 변경하면 이 문제를 해결할 수 있습니다. parfor 루프 변수 문제 해결의 다음 단계는 parfor 루프 변수는 연속으로 증가하는 정수여야 함 항목을 참조하십시오.

  4. parfor 루프는 for 루프에서처럼 일찍 빠져나올 수 없습니다. parfor 루프의 본문에 return 문이나 break 문을 삽입하지 마십시오. 서로 간의 통신 없이는 루프를 실행 중인 다른 MATLAB 인스턴스에서는 언제 멈춰야 할지를 알 수 없습니다. 대안으로 parfeval을 고려할 수 있습니다.

    for 루프를 parfor 루프로 변환하는데 여전히 문제가 있다면 parfor 루프에서 변수 문제 해결하기 항목을 참조하십시오.

tictoc을 사용하여 parfor 루프를 프로파일링하여 이에 상응하는 for 루프와 비교하여 속도 향상을 측정할 수 있습니다. 병렬 풀의 워커 간 데이터 전송량을 측정하려면 ticBytestocBytes를 사용합니다. 자세한 내용 및 예제는 Profiling parfor-loops 항목을 참조하십시오.

참고 항목

| |

관련 항목