이페이지의최신내용은아직번역되지않았습니다。최신내용은영문으로볼수있습니다。

PARFOR를언제사용할지결정하기

MATLAB의PARFOR루프

MATLAB®에서PARFOR루프는루프본문의일련의명령문을병렬로실행합니다。MATLAB클라이언트는PARFOR명령을실행하고MATLAB워커가병렬풀의워커에대한루프반복을병렬로실행하도록조율합니다。클라이언트는PARFOR가연산을수행하는데필요한데이터를워커로보내며,워커에서대부분의계산이실행됩니다。결과는클라이언트로다시보내져조합됩니다。

PARFOR루프는여러MATLAB워커가동일한루프를동시에계산할수있기때문에이와비슷한对于루프보다훨씬뛰어난성능을제공할수있습니다。

PARFOR루프본문의각실행을반복이라고합니다。MATLAB워커는특정순서없이서로독립적으로반복을실행합니다。각반복은독립적이므로반복이어떤식으로든동기화된다는보장은없으며동기화해야할필요조차도없습니다。워커개수가루프반복수와같을경우각워커는하나의루프반복을수행합니다。워커보다반복이많을경우일부워커는하나이상의루프반복을수행하게되는데,이경우워커는통신시간을줄이기위해한번에여러반복을수신할수있습니다。

PARFOR를언제사용할지결정하기

느린对于루프가있는경우,PARFOR루프가유용할수있습니다。다음과같은경우에PARFOR사용을고려해보십시오。

  • 실행시간이오래걸리는루프반복이있는경우。이경우여러워커가긴반복을동시에실행할수있습니다。반복횟수가워커개수보다많도록하십시오。그렇지않으면사용가능한모든워커를사용하지않습니다。

  • 많은루프반복이몬테카를로시뮬레이션또는파라미터스윕과같이간단한계산으로구성된경우。PARFOR는각워커가전체반복횟수의일부를실행하도록루프반복을여러그룹으로분할합니다。

PARFOR루프는다음과같은경우에는유용하지않을수있습니다。

  • 对于루프를벡터화한코드가있는경우。일반적으로코드실행속도를높이려면벡터화부터수행해보십시오。자세한내용은벡터화(MATLAB)항목을참조하십시오。코드를벡터화하면멀티스레드특성을가진많은기본MATLAB라이브러리에서제공하는내장병렬처리를활용할수있습니다。그러나벡터화된코드를사용하고로컬워커에만액세스할수있는경우에는PARFOR루프가对于루프보다느리게실행될수도있습니다。PARFOR를사용하려는목적으로벡터화된코드를되돌리려하지마십시오。일반적으로이해결책은잘작동하지않습니다。

  • 실행시간이짧은루프반복이있는경우。이경우병렬연산에드는오버헤드가계산의대부분을차지합니다。

루프내반복이다른반복의결과에따라달라지는경우PARFOR루프를사용할수없습니다。각반복은서로독립적이어야합니다。독립적인루프를처리하는것에대한자세한내용은PARFOR루프반복이서로독립적이어야함항목을참조하십시오。이규칙은简变量를사용하여루프의값을누적하는경우에는적용되지않습니다。

PARFOR를언제사용할지결정할때병렬연산에드는오버헤드를고려하십시오。병렬연산에드는오버헤드에는클라이언트와워커간의통신,조정및데이터전송(데이터송수신)에필요한시간이포함됩니다。반복실행속도가빠른경우이오버헤드는전체시간의상당한부분을차지할수있습니다。다음두가지다른유형의루프반복을살펴보겠습니다。

  • 계산량이많은작업이있는对于루프。이러한루프는일반적으로PARFOR루프로변환하기에적합합니다。계산에필요한시간이데이터전송에필요한시간의상당부분을차지하기때문입니다。

  • 간단한계산작업이있는对于루프。이러한루프는일반적으로PARFOR루프로변환하기에적합하지않습니다。데이터전송에필요한시간이계산에필요한시간에비해상당하기때문입니다。

병렬연산에드는오버헤드가낮은PARFOR의예제

이예제에서는对于루프내에계산량이많은작업으로시작합니다。对于루프는느리므로대신PARFOR루프를사용하여계산속도를높입니다。PARFOR对于루프반복의실행을병렬풀의워커로분할합니다。

이예제에서는행렬의스펙트럼반지름을계산하고对于루프를PARFOR루프로변환합니다。속도가얼마나향상되는지측정하는방법과병렬풀의워커간데이터전송량을측정하는방법을알아봅니다。

  1. MATLAB편집기에서다음对于루프를입력합니다。抽搐TOC을추가하여계산시간을측정합니다。

    抽动N = 200;A = 500;一个零=(N);对于I = 1:N A(I)= MAX(ABS(EIG(RAND(A))));结束TOC
  2. 스크립트를실행하고경과시간을확인합니다。

    经过时间是31.935373秒。

  3. 스크립트에서对于루프를PARFOR루프로바꿉니다。ticBytestocBytes를추가하여병렬풀의워커간데이터전송량을측정합니다。

    抽动ticBytes(GCP);N = 200;A = 500;一个零=(N);PARFORI = 1:N A(I)= MAX(ABS(EIG(RAND(A))));结束tocBytes(GCP)TOC

  4. 4개의워커에서새스크립트를실행하고코드를다시실행합니다。병렬풀을시작하고코드를워커에서사용가능하도록하는데약간의시간이걸리기때문에첫번째실행이두번째실행보다느립니다。두번째실행의데이터전송량과경과시간을확인합니다。

    기본적으로MATLAB은로컬컴퓨터에서워커의병렬풀을자동으로엽니다。

    开始使用“本地”的个人资料...连接到4名工人并行池(parpool)。... BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 55324合计24168经过时间10.760068秒。
    4개의워커에서실행된PARFOR는이에상응하는对于루프계산보다약3배빠릅니다。워커가4개임을감안하면속도가4배빨라지는것이이상적이지만그보다는느립니다。이는데이터를클라이언트에서워커로전송하고다시클라이언트로전송하는데필요한시간등의병렬연산에드는오버헤드때문입니다。ticBytestocBytes의결과를사용하여전송된데이터의양을살펴봅니다。데이터전송에필요한시간은데이터크기에비례한다고가정합니다。이런어림짐작을통해데이터전송에필요한대략적인시간을확인하고병렬연산에드는오버헤드와다른PARFOR루프반복을비교해볼수있습니다。이예제의데이터전송과병렬연산에드는오버헤드는다음예제에비해작습니다。

현재예제는병렬연산에드는오버헤드가낮아PARFOR루프로변환하기적합합니다。병렬연산에드는오버헤드가높은PARFOR의예제항목을참조하여이예제를다음예제의단순루프반복과비교해보십시오。

계산량이많은작업이포함된PARFOR루프의다른예제는중첩PARFOR루프와중첩为루프및기타PARFOR요구사항항목을참조하십시오。

병렬연산에드는오버헤드가높은PARFOR의예제

이예제에서는루프를작성하여간단한사인파를만듭니다。对于루프를PARFOR루프로바꾼다고계산속도가향상되지않습니다。이루프는반복이많지않고실행시간이오래걸리지않으며실행속도가향상이되더라도이를알기힘듭니다。이예제는병렬연산에드는오버헤드가높아PARFOR루프로변환하는것이적합하지않습니다。

  1. 루프를작성하여사인파를만듭니다。抽搐TOC을사용하여경과시간을측정합니다。

    抽动N = 1024;A =零(N);对于I = 1:N A(I,:) =(1:N)* SIN(I * 2 * PI / 1024);结束TOC
    经过时间是0.012501秒。
  2. 对于루프를PARFOR루프로바꿉니다。ticBytestocBytes를추가하여병렬풀의워커간데이터전송량을측정합니다。

    抽动ticBytes(GCP);N = 1024;A =零(N);PARFOR(I = 1:N)A(I,:) =(1:N)* SIN(I * 2 * PI / 1024);结束tocBytes(GCP)TOC

  3. 4개의워커에서스크립트를실행하고코드를다시실행합니다。병렬풀을시작하고코드를워커에서사용가능하도록하는데약간의시간이걸리기때문에첫번째실행이두번째실행보다느립니다。두번째실행의데이터전송량과경과시간을확인합니다。

    BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 13176 2.0615e + 06 2 15188 2.0874e + 06 3 13176 2.4056e + 06 4 13176 1.8567e + 06总计54716 8.4112e + 06]经过时间是0.743855秒。
    연속적인对于루프의경과시간이4개의워커에서실행된PARFOR루프의경과시간보다훨씬짧습니다。이경우对于루프를PARFOR루프로바꿔서얻는이점이없습니다。그이유는데이터전송량이이전예제에서보다훨씬많기때문입니다。병렬연산에드는오버헤드가낮은PARFOR의예제항목을참조하십시오。현재예제에서는병렬연산에드는오버헤드가계산시간의상당부분을차지합니다。따라서사인파반복은PARFOR루프로변환하는것에적합하지않습니다。

이예제에서는병렬연산에드는오버헤드가높은계산을PARFOR루프로변환하는것에이점이없는이유를설명합니다。코드속도향상에대한자세한내용은对于루프를PARFOR루프로변환하기항목을참조하십시오。

참고항목

||

관련항목