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

GPU에서 MATLAB 함수 실행하기

gpuArray 인수를 갖는 MATLAB 함수

많은 MATLAB® 함수와 여러 툴박스가 gpuArray 인수를 제공받으면 자동으로 GPU에서 실행됩니다.

A = gpuArray([1 0 1; -1 -2 0; 0 1 -1]);
e = eig(A);

하나 이상의 gpuArray를 데이터 입력 인수로 사용하여 이러한 함수를 호출할 때마다 함수가 GPU에서 실행됩니다. size처럼 MATLAB 데이터를 반환하는 것이 더 적합한 경우를 제외하고, 이 함수는 결과로 gpuArray를 생성합니다. 동일한 함수 호출에서 gpuArray와 MATLAB 배열을 둘 다 사용하여 입력값을 혼합할 수 있습니다. 함수가 GPU 또는 CPU에서 실행되는 경우에 대한 자세한 내용은 gpuArray 입력값의 특수 조건 항목을 참조하십시오. GPU 지원 함수에는 이산 푸리에 변환(fft), 행렬 곱셈(mtimes), 행렬 왼쪽 나눗셈(mldivide)을 비롯하여 수백 개가 있습니다. 자세한 내용은 GPU 지원 함수 확인하기 항목을 참조하십시오.

GPU 지원 함수 확인하기

GPU 지원 기능이 있는 MATLAB 함수인 경우 이 함수의 도움말 페이지에서 GPU 사용과 관련한 추가 정보를 참조할 수 있습니다. 함수 도움말 페이지 마지막에 나오는 확장 기능(Extended Capabilities) 섹션에서 GPU 배열(GPU Arrays)을 참조하십시오.

함수가 GPU를 지원하는지 찾아보고 제품별로 필터링할 수도 있습니다. 도움말(Help) 표시줄에서 함수(Function)를 클릭합니다. 함수 목록의 왼쪽 창에서 찾아볼 제품, 예를 들어, MATLAB을 선택합니다. 왼쪽 창 하단에서 GPU 배열(GPU Arrays)을 선택합니다. GPU 지원 함수가 없는 제품을 선택할 경우 GPU 배열(GPU Arrays) 필터를 사용할 수 없습니다.

각 GPU 지원 함수의 업데이트에 대한 자세한 내용은 릴리스 정보를 참조하십시오.

GPU를 확인하거나 선택하기

GPU가 있는 경우 MATLAB은 GPU 계산에 자동으로 GPU를 사용합니다. gpuDevice 함수를 사용하여 GPU를 확인할 수 있습니다. 여러 개의 GPU가 있는 경우에는 gpuDevice를 사용하여 그중 하나를 선택하거나, 여러 개의 GPU를 병렬 풀에서 사용할 수 있습니다. 예제는 Identify and Select a GPUUse Multiple GPUs in a Parallel Pool 항목을 참조하십시오. GPU 지원 여부를 확인하려면 릴리스별 GPU 지원 항목을 참조하십시오.

심층 학습을 위해 MATLAB은 다중 GPU에 대한 자동 병렬 연산을 지원합니다. Deep Learning with MATLAB on Multiple GPUs (Deep Learning Toolbox) 항목을 참조하십시오.

GPU에서 MATLAB 함수 사용하기

이 예제에서는 GPU 지원 MATLAB 함수를 사용하여 gpuArray로 연산을 수행하는 방법을 보여줍니다. gpuDevice 함수를 사용하여 GPU의 속성을 확인할 수 있습니다.

gpuDevice
ans = 
  CUDADevice with properties:

                      Name: 'GeForce GTX 1080'
                     Index: 1
         ComputeCapability: '6.1'
            SupportsDouble: 1
             DriverVersion: 10
            ToolkitVersion: 10
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 8.5899e+09
           AvailableMemory: 6.9342e+09
       MultiprocessorCount: 20
              ClockRateKHz: 1733500
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 1
            DeviceSelected: 1

-15에서 15까지의 값을 반복하는 행 벡터를 만듭니다. 이 벡터를 GPU로 전송하고 gpuArray를 생성하려면 gpuArray 함수를 사용하십시오.

X = [-15:15 0 -15:15 0 -15:15];
gpuX = gpuArray(X);
whos gpuX
  Name      Size            Bytes  Class       Attributes

  gpuX      1x95                4  gpuArray              

gpuArray로 연산을 수행하려면 GPU 지원 MATLAB 함수를 사용하십시오. MATLAB은 자동으로 GPU에서 계산을 실행합니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오. 예를 들어, diag, expm, mod, absfliplr의 조합을 사용해 보겠습니다.

gpuE = expm(diag(gpuX,-1)) * expm(diag(gpuX,1));
gpuM = mod(abs(gpuE),2);
gpuF = gpuM + fliplr(gpuM);

결과를 플로팅합니다.

imagesc(gpuF);
colormap(flip(gray));

GPU에서 다시 데이터를 전송해야 하는 경우 gather를 사용합니다. CPU로 다시 수집하는 작업은 비용이 많이 들 수 있으며, gpuArray를 지원하지 않는 함수에서 결과를 사용할 필요가 없는 한 일반적으로 필요하지 않습니다.

result = gather(gpuF);
whos result
  Name         Size            Bytes  Class     Attributes

  result      96x96            73728  double              

GPU를 사용하여 이미지를 선명하게 만들기

이 예제에서는 gpuArray와 GPU 지원 함수를 사용하여 이미지를 선명하게 만드는 방법을 보여줍니다.

이미지를 읽어 들이고 gpuArray 함수를 사용하여 이미지를 GPU로 보냅니다.

image = gpuArray(imread('peppers.png'));

이미지를 double형으로 변환하고 컨벌루션을 적용하여 기울기 이미지를 얻습니다. 그런 다음 기울기 이미지를 사용하여 인자 amount로 이미지를 선명하게 만듭니다.

dimage = im2double(image); 
gradient = convn(dimage,ones(3)./9,'same') - convn(dimage,ones(5)./25,'same');
amount = 5;
sharpened = dimage + amount.*gradient;

원래 이미지와 선명해진 이미지의 크기를 조정하고 플로팅하여 비교합니다.

imshow(imresize([dimage, sharpened],0.7));
title('Original image (left) vs sharpened image (right)');

GPU 지원 함수를 사용하여 Mandelbrot 집합 계산하기

이 예제에서는 GPU 지원 MATLAB 함수를 사용하여 잘 알려진 수학 구조인 Mandelbrot 집합을 계산하는 방법을 보여줍니다. gpuDevice 함수를 사용하여 GPU를 확인합니다.

파라미터를 정의합니다. Mandelbrot 알고리즘은 실수부와 허수부로 구성된 그리드를 반복합니다. 다음 코드는 반복 횟수, 그리드 크기 및 그리드 제한을 정의합니다.

maxIterations = 500;
gridSize = 1000;
xlim = [-0.748766713922161, -0.748766707771757];
ylim = [ 0.123640844894862,  0.123640851045266]; 

gpuArray 함수를 사용하여 GPU로 데이터를 전송하고 gpuArray를 만들거나, 또는 GPU에서 직접 배열을 만들 수 있습니다. gpuArraylinspace 같은 많은 함수의 GPU 버전을 제공하여 데이터 배열을 만들 때 사용할 수 있도록 합니다. 자세한 내용은 GPU 배열 직접 만들기 항목을 참조하십시오.

x = gpuArray.linspace(xlim(1),xlim(2),gridSize);
y = gpuArray.linspace(ylim(1),ylim(2),gridSize);
whos x y
  Name      Size              Bytes  Class       Attributes

  x         1x1000                4  gpuArray              
  y         1x1000                4  gpuArray              

많은 MATLAB 함수가 gpuArray를 지원합니다. GPU 지원 함수에 gpuArray 인수를 제공하면 함수가 자동으로 GPU에서 실행됩니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오. 알고리즘에 대한 복소수 그리드를 만들고 결과에 대한 배열 count를 만듭니다. 이 배열을 GPU에서 직접 만들려면 ones 함수를 사용하고 'gpuArray'를 지정하십시오.

[xGrid,yGrid] = meshgrid(x,y);
z0 = complex(xGrid,yGrid);
count = ones(size(z0),'gpuArray');

다음 코드는 GPU 지원 함수를 사용하여 Mandelbrot 알고리즘을 구현합니다. 코드가 gpuArray를 사용하기 때문에 계산은 GPU에서 수행됩니다.

z = z0;
for n = 0:maxIterations
    z = z.*z + z0;
    inside = abs(z) <= 2;
    count = count + inside;
end
count = log(count);

계산이 완료되면 결과를 플로팅합니다.

imagesc(x,y,count)
colormap([jet();flipud(jet());0 0 0]);
axis off

GPU에서 희소 형식 배열 사용하기

다음 함수는 희소 형식 gpuArray를 지원합니다.

abs
angle
bicg
bicgstab
ceil
cgs
classUnderlying
conj
ctranspose
deg2rad
end
expm1
find
fix
floor
full
gmres
gpuArray.speye
imag
isaUnderlying
isdiag
isempty
isequal
isequaln
isfloat
isinteger
islogical
isnumeric
isreal
issparse
istril
istriu
length
log1p
lsqr
minus
mtimes
ndims
nextpow2
nnz
nonzeros
norm
numel
nzmax
pcg
plus
rad2deg
real
realsqrt
round
sign
size
sparse
spfun
spones
sprandsym
sqrt
sum
transpose
tril
triu
uminus
uplus  

gpuArray 입력값으로 sparse를 호출하거나 희소 형식 입력값으로 gpuArray를 호출하여 희소 형식 gpuArray를 만들 수 있습니다. 예를 들면 다음과 같습니다.

x = [0 1 0 0 0; 0 0 0 0 1]
     0     1     0     0     0
     0     0     0     0     1
s = sparse(x)
   (1,2)        1
   (2,5)        1
g = gpuArray(s);   % g is a sparse gpuArray
gt = transpose(g); % gt is a sparse gpuArray
f = full(gt)       % f is a full gpuArray
     0     0
     1     0
     0     0
     0     0
     0     1

희소 형식 gpuArray는 인덱싱을 지원하지 않습니다. 대신 find를 사용하여 배열에서 0이 아닌 배열 요소, 그리고 이러한 요소의 행 인덱스와 열 인덱스를 찾습니다. 그런 다음 원하는 값을 대체하고 희소 형식 gpuArray를 새로 생성합니다.

GPU에서 복소수 사용하기

GPU에서 실행되는 함수의 출력값이 복소수일 수 있는 경우, 이 함수의 입력 인수를 명시적으로 복소수로 지정해야 합니다. 이는 arrayfun이 실행하는 코드에서 호출되는 함수나 gpuArray에 적용됩니다.

예를 들어, 음의 요소가 있을 수 있는 gpuArray를 만들 경우 G = gpuArray(complex(p))를 사용하면 sqrt(G)를 성공적으로 실행할 수 있습니다.

또는 arrayfun에 전달되는 함수 내에서 x가 실수로 구성된 벡터이고 일부 요소에 음의 값이 있는 경우 sqrt(x)는 오류를 생성하므로 대신 sqrt(complex(x))를 호출해야 합니다.

결과가 복소수 데이터로 구성된 gpuArray이고 모든 허수부가 0인 경우 이 허수부는 유지되고 데이터는 복소수를 유지합니다. 따라서 sort, isreal 등을 사용할 때 영향을 미칠 수 있습니다.

다음 표에는 복소수 데이터를 반환할 수 있는 함수와 함께 출력값이 실수를 유지하는 입력 범위가 나열되어 있습니다.

함수실수 출력값에 대한 입력 범위
acos(x)abs(x) <= 1
acosh(x)x >= 1
acoth(x)abs(x) >= 1
acsc(x)abs(x) >= 1
asec(x)abs(x) >= 1
asech(x)0 <= x <= 1
asin(x)abs(x) <= 1
atanhabs(x) <= 1
log(x)x >= 0
log1p(x)x >= -1
log10(x)x >= 0
log2(x)x >= 0
power(x,y)x >= 0
reallog(x)x >= 0
realsqrt(x)x >= 0
sqrt(x)x >= 0

gpuArray 입력값의 특수 조건

GPU 지원 함수는 데이터가 GPU에 있는 경우에만 GPU에서 실행됩니다. 예를 들어, 다음 코드는 첫 번째 입력값인 데이터가 GPU에 있기 때문에 GPU에서 실행됩니다.

>> sum(gpuArray(magic(10)),2);
그러나 다음 코드는 첫 번째 입력값인 데이터가 GPU에 있지 않기 때문에 GPU에서 실행되지 않습니다.
>> sum(magic(10),gpuArray(2));
입력 인수 gpuArray에 차원, 스케일링 인자 또는 반복 횟수 등의 항목이 포함되어 있는 경우 함수는 이 항목을 수집하고 CPU에서 계산합니다. 함수는 실제 데이터 인수가 gpuArray인 경우에만 GPU에서 실행됩니다.

감사의 글

MAGMA는 GPU 가속을 활용하는 선형 대수 루틴 라이브러리입니다. Parallel Computing Toolbox™에서 gpuArray에 구현된 선형 대수 함수는 우수한 성능과 정확도를 확보하기 위해 MAGMA를 활용합니다.

참고 항목

|

관련 예제

세부 정보