Main Content

스레드 기반 환경과 프로세스 기반 환경 중에서 선택하기

Parallel Computing Toolbox™를 사용하면 스레드 기반 환경 또는 프로세스 기반 환경과 같은 다양한 병렬 환경에서 병렬 코드를 실행할 수 있습니다. 이러한 환경은 각기 다른 이점을 제공합니다.

스레드 기반 환경은 프로세스 워커에 사용 가능한 MATLAB® 함수의 일부만 지원합니다. 지원되지 않는 함수를 사용하기 원한다면 MathWorks 기술 지원팀에 알려주십시오. 지원에 대한 자세한 내용은 스레드 기반 환경에 대한 지원 확인하기 항목을 참조하십시오.

병렬 환경 선택

선택한 병렬 환경의 유형에 따라, 프로세스 워커 또는 스레드 워커에서 기능이 실행됩니다. 어떤 환경이 적합한지 결정하려면 다음 다이어그램과 표를 참조하십시오.

Flowchart for deciding whether to uses process workers, thread workers, or a remote process-based cluster. This information in the flowchart is described in the subsequent tables.

  • parfor 또는 parfeval과 같은 병렬 풀 기능을 사용하려면, 선택한 환경에서 parpool 함수를 사용하여 병렬 풀을 만듭니다.

    환경권장 사항예제
    로컬 컴퓨터에서의 스레드 기반 환경

    메모리 사용량을 줄이고, 스케줄링 속도를 높이고, 데이터 전송 비용을 절감하려면 이 설정을 사용합니다.

    parpool('Threads')

    참고

    'Threads'를 선택하는 경우, 사용하는 코드가 지원되는지 확인하십시오. 자세한 내용은 스레드 기반 환경에 대한 지원 확인하기 항목을 참조하십시오.

    스레드 기반 풀을 통해 충분한 이점을 얻을 수 있는지 확인하려면 ticBytestocBytes를 사용하여 프로세스 기반 풀에서의 데이터 전송을 측정합니다. 데이터 전송이 대용량(예: 100MB 초과)인 경우에는 'Threads'를 사용하십시오.

    로컬 컴퓨터에서의 프로세스 기반 환경

    대부분의 경우와 클러스터 또는 클라우드로 확장하기 전에 프로토타이핑할 경우에 이 설정을 사용합니다.

    parpool('Processes')

    원격 클러스터에서의 프로세스 기반 환경

    계산을 확장하려는 경우 이 설정을 사용합니다.

    parpool('MyCluster')
    여기서 MyCluster는 클러스터 프로파일의 이름입니다.

  • batch와 같은 클러스터 기능을 사용하려면, 선택한 환경에서 parcluster 함수를 사용하여 cluster 객체를 만듭니다. 클러스터 기능은 프로세스 기반 환경에서만 지원됩니다.

    환경권장 사항예제
    로컬 컴퓨터에서의 프로세스 기반 환경

    로컬 리소스가 충분한 경우 또는 클러스터나 클라우드로 확장하기 전에 프로토타이핑하려는 경우 이 설정을 사용합니다.

    parcluster('Processes')

    원격 클러스터에서의 프로세스 기반 환경

    계산을 확장하려는 경우 이 설정을 사용합니다.

    parcluster('MyCluster')

    여기서 MyCluster는 클러스터 프로파일의 이름입니다.

권장 사항

다음과 같은 이점이 있으므로 프로세스 기반 환경을 디폴트로 설정하는 것이 좋습니다.

  • 병렬 언어를 전부 지원합니다.

  • 이전 릴리스와 호환됩니다.

  • 비정상 종료 발생 시 더 안정적입니다.

  • 외부 라이브러리가 스레드 안전성을 갖출 필요가 없습니다.

다음의 경우 스레드 기반 환경을 선택합니다.

  • 사용자의 병렬 코드가 스레드 기반 환경에서 지원됩니다.

  • 메모리 사용량을 줄이고, 스케줄링 속도를 높이고, 데이터 전송 비용을 절감하고자 합니다.

프로세스 워커와 스레드 워커 비교

다음은 스레드 워커의 효율성을 활용하는 예제에서 프로세스 워커와 스레드 워커 간의 성능 비교를 보여줍니다.

데이터를 만듭니다.

X = rand(10000, 10000);

프로세스 워커로 구성된 병렬 풀을 만듭니다.

pool = parpool('Processes');
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 6).

실행 시간을 기록하고 병렬 코드의 데이터 전송을 측정합니다. 이 예제에서는 parfeval 실행을 사용합니다.

ticBytes(pool);
tProcesses = timeit(@() fetchOutputs(parfeval(@sum,1,X,'all')))
tocBytes(pool)
tProcesses = 3.9060

             BytesSentToWorkers    BytesReceivedFromWorkers
             __________________    ________________________

    1                   0                       0          
    2                   0                       0          
    3                   0                       0          
    4                   0                       0          
    5             5.6e+09                   16254          
    6                   0                       0          
    Total         5.6e+09                   16254     

데이터 전송량이 상당합니다. 데이터 전송 비용이 발생하지 않도록 스레드 워커를 사용할 수 있습니다. 현재 병렬 풀을 삭제하고 스레드 기반 병렬 풀을 만듭니다.

delete(pool);
pool = parpool('Threads');

동일한 코드가 실행되는 데 걸리는 시간을 측정합니다.

tThreads = timeit(@() fetchOutputs(parfeval(@sum,1,X,'all')))
tThreads = 0.0232

시간을 비교합니다.

fprintf('Without data transfer, this example is %.2fx faster.\n', tProcesses/tThreads)
Without data transfer, this example is 168.27x faster.

스레드 워커는 데이터 X를 복사하지 않고 사용할 수 있기 때문에 프로세스 워커보다 성능이 뛰어나며, 스케줄링 오버헤드가 적습니다.

프로세스 기반 및 스레드 기반 풀에서 병렬로 최적화 문제 풀기

이 예제에서는 프로세스 기반 및 스레드 기반 풀을 사용하여 병렬로 최적화 문제를 푸는 방법을 보여줍니다.

스레드 기반 풀은 더 적은 양의 데이터 전송, 더 빠른 스케줄링, 감소된 메모리 사용량에 최적화되어 있으므로 사용 시 성능 향상을 기대할 수 있습니다.

문제 설명

벽 너머로 가능한 한 멀리 발사체를 발사하기 위해 대포의 위치와 각도를 변경하는 문제입니다. 대포의 포구 속도는 300m/s입니다. 벽의 높이는 20m입니다. 대포가 벽에 너무 가까이 있으면 너무 가파른 각도로 발사되어 발사체가 충분히 멀리 이동하지 않습니다. 대포가 벽으로부터 너무 멀리 떨어져 있어도 발사체가 충분히 멀리 이동하지 않습니다. 문제에 대한 자세한 내용은 Optimize ODEs in Parallel (Global Optimization Toolbox) 항목 또는 대리 최적화 동영상의 후반부를 참조하십시오.

MATLAB 문제 정식화

문제를 풀기 위해 Global Optimization Toolbox에서 patternsearch 솔버를 호출합니다. 목적 함수는 주어진 위치와 각도로 발사체가 벽 너머에서 땅에 닿는 거리를 계산하는 cannonobjective 헬퍼 함수에 있습니다. 제약 조건은 발사체가 벽에 부딪히는지 혹은 지면에 닿기 전에 벽에 도달하는지 계산하는 cannonconstraint 헬퍼 함수에 있습니다. 이러한 헬퍼 함수는 이 예제를 실행할 때 볼 수 있는 별도의 파일에 있습니다.

patternsearch 솔버에 대해 다음 입력값을 설정합니다. Parallel Computing Toolbox를 사용하려면 최적화 옵션에서 'UseParallel'true로 설정해야 합니다.

lb = [-200;0.05];
ub = [-1;pi/2-.05];
x0 = [-30,pi/3];
opts = optimoptions('patternsearch',...
    'UseCompletePoll', true, ...
    'Display','off',...
    'UseParallel',true);
% No linear constraints, so set these inputs to empty:
A = [];
b = [];
Aeq = [];
beq = [];

프로세스 기반 풀에서 풀기

비교를 위해 먼저 프로세스 기반 병렬 풀에서 문제를 풉니다.

프로세스 워커로 구성된 병렬 풀을 시작합니다.

p = parpool('Processes');
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 6).

나중에 동일한 계산을 재현하기 위해 난수 생성기의 시드값을 디폴트 값으로 설정합니다.

rng default;

루프를 사용하여 문제를 여러 번 풀고 결과의 평균을 구합니다.

tProcesses = zeros(5,1);
for repetition = 1:numel(tProcesses)
    tic
    [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0, ...
        A,b,Aeq,beq,lb,ub,@cannonconstraint,opts);
    tProcesses(repetition) = toc;
end
tProcesses = mean(tProcesses)
tProcesses = 2.7677

스레드 기반 풀과의 비교를 준비하기 위해 현재 병렬 풀을 삭제합니다.

delete(p);

스레드 기반 풀에서 풀기

스레드 워커로 구성된 병렬 풀을 시작합니다.

p = parpool('Threads');
Starting parallel pool (parpool) using the 'Threads' profile ...
Connected to the parallel pool (number of workers: 6).

난수 생성기를 디폴트 설정으로 복원하고 이전과 동일한 코드를 실행합니다.

rng default
tThreads = zeros(5,1);
for repetition = 1:numel(tThreads)
    tic
    [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0, ...
        A,b,Aeq,beq,lb,ub,@cannonconstraint,opts);
    tThreads(repetition) = toc;
end
tThreads = mean(tThreads)
tThreads = 1.5790

스레드 워커와 프로세스 워커의 성능을 비교합니다.

fprintf('In this example, thread workers are %.2fx faster than process workers.\n', tProcesses/tThreads)
In this example, thread workers are 1.75x faster than process workers.

스레드 기반 풀의 최적화로 인한 성능 향상을 볼 수 있습니다.

계산이 완료되면 병렬 풀을 삭제합니다.

delete(p);

스레드 기반 환경이란?

스레드 기반 환경에서는 병렬 언어 기능이 컴퓨터의 코어에서 코드를 실행하는 연산 스레드의 지원을 받는 워커에서 실행됩니다. 이는 동일한 프로세스 내에 공존하고 메모리를 공유할 수 있다는 점에서 연산 프로세스와 다릅니다.

Schematic of a multicore machine showing four thread workers within a single process.

스레드 기반 환경은 프로세스 기반 환경에 비해 다음과 같은 이점이 있습니다.

  • 스레드 워커는 메모리를 공유할 수 있기 때문에 복사 없이 숫자형 데이터에 액세스할 수 있습니다. 따라서 메모리 효율이 더 높습니다.

  • 스레드 간 통신은 시간이 덜 걸립니다. 따라서 태스크 스케줄링 또는 워커 간 통신의 오버헤드가 더 적습니다.

스레드 기반 환경을 사용하는 경우 다음 고려 사항을 염두에 두십시오.

  • 사용하는 코드가 스레드 기반 환경에서 지원되는지 확인합니다. 자세한 내용은 스레드 기반 환경에 대한 지원 확인하기 항목을 참조하십시오.

  • 워커에서 외부 라이브러리를 사용하고 있는 경우에는 라이브러리 함수가 스레드 안전성을 갖췄는지 확인해야 합니다.

프로세스 기반 환경이란?

프로세스 기반 환경에서는 병렬 언어 기능이 컴퓨터의 코어에서 코드를 실행하는 연산 프로세스의 지원을 받는 워커에서 실행됩니다. 연산 프로세스는 서로 독립적이라는 점에서 연산 스레드와 다릅니다.

Schematic of a multicore machine showing four independent process workers.

프로세스 기반 환경은 스레드 기반 환경에 비해 다음과 같은 이점이 있습니다.

  • 모든 언어 기능을 지원하며 이전 릴리스와 호환됩니다.

  • 비정상 종료 발생 시 더 안정적입니다. 프로세스 워커가 비정상적으로 종료되는 경우 MATLAB 클라이언트는 종료되지 않습니다. 코드에서 spmd와 분산 배열이 사용되지 않는 경우에는 프로세스 워커가 비정상적으로 종료되어도 나머지 워커는 계속 실행될 수 있습니다.

  • 워커에서 외부 라이브러리를 사용하는 경우 스레드 안전성을 고려하지 않아도 됩니다.

  • batch와 같은 클러스터 기능을 사용할 수 있습니다.

프로세스 기반 환경을 사용하는 경우 다음 고려 사항을 염두에 두십시오.

  • 코드가 워커에서 파일에 액세스하는 경우, 데이터에 액세스할 수 있도록 'AttachedFiles' 또는 'AdditionalPaths'와 같은 추가 옵션을 사용해야 합니다.

스레드 기반 환경에 대한 지원 확인하기

스레드 워커는 프로세스 워커에 사용 가능한 MATLAB 함수의 일부만 지원합니다. 지원되지 않는 함수를 사용하기 원한다면 MathWorks 기술 지원팀에 알려주십시오.

스레드 워커는 MATLAB Compiler™를 사용하여 생성된 독립 실행형 애플리케이션과 MATLAB Web App Server™에서 호스트되는 웹 앱에서 지원됩니다.

스레드 워커에서 지원되는 함수에 대한 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.

참고 항목

|

관련 항목