Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

gpuArray

GPU에 저장된 배열

설명

gpuArray 객체는 GPU 메모리에 저장된 배열을 나타냅니다. MATLAB®과 기타 툴박스의 많은 함수들이 gpuArray 객체를 지원하므로, 사용자는 코드를 최소한으로 변경하여 GPU에서 코드를 실행할 수 있습니다. gpuArray 객체로 작업하려면 gpuArray를 지원하는 MATLAB 함수(예: fft, mtimes 또는 mldivide)를 사용하십시오. MATLAB과 기타 툴박스에서 gpuArray를 지원하는 함수의 전체 목록을 보려면 GPU 지원 함수를 참조하십시오. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오.

GPU로부터 배열을 가져오려면 gather 함수를 사용하십시오(예를 들어, gpuArray 객체를 지원하지 않는 함수를 사용하는 경우).

참고

GPU를 사용할 수 없는 경우 gpuArray 데이터가 포함된 MAT 파일을 메모리 내 배열로 불러올 수 있습니다. GPU 없이 불러온 gpuArray 객체는 사용이 제한되며 계산에 사용할 수 없습니다. GPU 없이 불러온 gpuArray 객체를 사용하려면 gather 함수로 배열 내 내용을 가져오십시오.

생성

gpuArray를 사용하여 MATLAB 작업 공간에 있는 배열을 gpuArray 객체로 변환합니다. 이 밖에도 몇몇 MATLAB 함수에서 gpuArray 객체를 직접 만들 수 있습니다. 자세한 내용은 GPU에서 배열 설정하기 항목을 참조하십시오.

설명

예제

G = gpuArray(X)는 배열 X를 GPU에 복사하고 gpuArray 객체를 반환합니다.

입력 인수

모두 확장

GPU에 전달할 배열로, 숫자형 배열 또는 논리형 배열로 지정됩니다. GPU 장치에 데이터를 저장할 수 있는 충분한 여유 메모리가 있어야 합니다. X가 이미 gpuArray 객체인 경우 gpuArrayX를 그대로 출력합니다.

희소 배열도 GPU로 전송할 수 있습니다. gpuArray는 배정밀도의 희소 배열만 지원합니다.

예: G = gpuArray(magic(3));

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
복소수 지원 여부:

객체 함수

arrayfunGPU에서 배열의 각 요소에 함수 적용
gather로컬 작업 공간으로 분산 배열, Composite 객체 또는 gpuArray 객체 전송
pagefunApply function to each page of distributed or GPU array

gpuArray 객체의 특성을 확인하기 위한 몇 가지 메서드가 있습니다. 대부분 같은 이름의 MATLAB 함수와 비슷하게 동작합니다.

isgpuarray입력값이 gpuArray인지 여부 확인
existsOnGPUGPU에서 gpuArray 또는 CUDAKernel을 사용할 수 있는지 여부를 확인합니다.
isUnderlyingTypeDetermine whether input has specified underlying data type
ndims배열의 차원 수
size배열 크기
underlyingTypeType of underlying data determining array behavior

몇몇 MATLAB 툴박스에는 gpuArray를 지원하는 함수가 포함되어 있습니다. 이러한 툴박스에서 gpuArray 객체를 지원하는 모든 함수 목록을 보려면 다음 표에 나와 있는 링크를 사용하십시오. 목록에서 정보 표시가 있는 함수에는 GPU에서 함수 실행 시 유의해야 할 사용법 관련 참고 및 제한 사항이 있습니다. 함수 도움말 페이지의 확장 기능 섹션에서 사용법 관련 참고 및 제한 사항을 확인할 수 있습니다. gpuArray를 지원하는 각 함수의 업데이트에 대한 자세한 내용은 릴리스 정보를 참조하십시오.

툴박스 이름gpuArray를 지원하는 함수 목록GPU 관련 문서
MATLABgpuArray를 지원하는 함수 
Statistics and Machine Learning Toolbox™gpuArray를 지원하는 함수 (Statistics and Machine Learning Toolbox)Analyze and Model Data on GPU (Statistics and Machine Learning Toolbox)
Image Processing Toolbox™gpuArray를 지원하는 함수 (Image Processing Toolbox)GPU 연산 (Image Processing Toolbox)
Deep Learning Toolbox™

gpuArray를 지원하는 함수 (Deep Learning Toolbox)

*(GPU를 사용한 딥러닝 항목 참조)

Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud (Deep Learning Toolbox)

복수의 GPU에서 MATLAB을 사용한 딥러닝 (Deep Learning Toolbox)

Computer Vision Toolbox™gpuArray를 지원하는 함수 (Computer Vision Toolbox)GPU 코드 생성 및 가속 (Computer Vision Toolbox)
Communications Toolbox™gpuArray를 지원하는 함수 (Communications Toolbox)코드 생성 및 가속 지원 (Communications Toolbox)
Signal Processing Toolbox™gpuArray를 지원하는 함수 (Signal Processing Toolbox)코드 생성 및 GPU 지원 (Signal Processing Toolbox)
Audio Toolbox™gpuArray를 지원하는 함수 (Audio Toolbox)Code Generation and GPU Support (Audio Toolbox)
Wavelet Toolbox™gpuArray를 지원하는 함수 (Wavelet Toolbox)코드 생성 및 GPU 지원 (Wavelet Toolbox)
Curve Fitting Toolbox™gpuArray를 지원하는 함수 (Curve Fitting Toolbox) 

모든 MathWorks® 제품에서 gpuArray를 지원하는 함수의 목록은 gpuArray 지원 함수 페이지를 참조하십시오. 또는 제품별로 필터링할 수도 있습니다. 도움말 표시줄에서 함수를 클릭합니다. 함수 목록의 왼쪽 창에서 찾아볼 제품, 예를 들어, MATLAB을 선택합니다. 왼쪽 창 하단에서 GPU 배열을 선택합니다. gpuArray를 지원하는 함수가 없는 제품을 선택할 경우 GPU 배열 필터가 제공되지 않습니다.

예제

모두 축소

데이터를 CPU에서 GPU로 전송하기 위해 gpuArray 함수를 사용합니다.

배열 X를 만듭니다.

X = [1,2,3];

X를 GPU로 전송합니다.

G = gpuArray(X);

GPU에 데이터가 있는지 확인합니다.

isgpuarray(G)
ans = logical
   1

배열 G의 요소별 제곱을 계산합니다.

GSq = G.^2;

결과 GSq를 다시 CPU로 전송합니다.

XSq = gather(GSq)
XSq = 1×3

     1     4     9

GPU에 데이터가 없는지 확인합니다.

isgpuarray(XSq)
ans = logical
   0

몇몇 MATLAB 함수에 옵션 "gpuArray"를 지정하여 GPU에서 직접 데이터를 만들 수 있습니다.

GPU에서 직접 난수로 구성된 배열을 만듭니다.

G = rand(1,3,"gpuArray")
G =

    0.3640    0.5421    0.6543

출력값이 GPU에 저장되었는지 확인합니다.

isgpuarray(G)
ans = logical
   1

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

gpuDevice
ans = 
  CUDADevice with properties:

                      Name: 'Quadro P620'
                     Index: 2
         ComputeCapability: '6.1'
            SupportsDouble: 1
     GraphicsDriverVersion: '511.79'
               DriverModel: 'WDDM'
            ToolkitVersion: 11.2000
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152 (49.15 KB)
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 2147287040 (2.15 GB)
           AvailableMemory: 1615209678 (1.62 GB)
               CachePolicy: 'balanced'
       MultiprocessorCount: 4
              ClockRateKHz: 1354000
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 1
           DeviceAvailable: 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              760  gpuArray              

gpuArray 객체로 연산을 수행하려면 gpuArray를 지원하는 MATLAB 함수를 사용하십시오. MATLAB은 자동으로 GPU에서 계산을 실행합니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오. 예를 들면 diag, expm, mod, round, abs, fliplr을 함께 사용합니다.

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

결과를 플로팅합니다.

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

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

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

  result      96x96            73728  double              

GPU와 CPU 사이에는 수치 정밀도와 알고리즘의 차이가 있으므로 일반적으로 CPU에서 코드를 실행한 결과와 GPU에서 코드를 실행한 결과가 서로 다를 수 있습니다. CPU와 GPU에서 계산되는 각각의 답은 참값인 해석적 결과에 대한 부동소수점 근삿값으로서 둘은 똑같이 타당한 답이지만, 계산 과정에서의 반올림 동작이 서로 다릅니다. 이 예제에서 결과는 정수이며 round는 반올림 오차를 제거합니다.

이 예제에서는 몬테카를로 적분 방법을 통해 MATLAB 함수와 연산자를 gpuArray 객체와 함께 사용하여 함수의 적분을 계산하는 방법을 보여줍니다.

샘플링할 점의 개수를 정의합니다. rand 함수로 임의의 점을 만들어 x 좌표와 y 좌표가 모두 구간 [-1,1]로 국한된 함수 정의역에서 점을 샘플링합니다. GPU에서 직접 확률 배열을 만들려면 rand 함수를 사용하고 "gpuArray"를 지정합니다. 자세한 내용은 GPU에서 배열 설정하기 항목을 참조하십시오.

n = 1e6;
x = 2*rand(n,1,"gpuArray")-1;
y = 2*rand(n,1,"gpuArray")-1;

적분할 함수를 정의하고 이 함수에서 몬테카를로 적분식을 사용합니다. 이 함수는 단위원 내에서 점을 샘플링하여 π의 근삿값을 구합니다. 이 코드는 gpuArray 객체에 gpuArray 지원 함수와 연산자를 사용하므로 계산은 자동으로 GPU에서 실행됩니다. MATLAB 배열에 사용하는 것과 동일한 구문을 사용하여 요소별 곱셈과 같은 이항 연산을 수행할 수 있습니다. gpuArray 지원 함수에 대한 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오.

f = x.^2 + y.^2 <= 1;
result = 4*1/n*f*ones(n,1,"gpuArray")
result =

    3.1403

제한 사항

  • 다음 항목은 모두 intmax("int32")를 초과할 수 없습니다.

    • 조밀 배열의 요소 개수.

    • 희소 배열의 0이 아닌 요소의 개수.

    • 지정된 차원의 크기. 예를 들어, zeros(0,3e9,"gpuArray")는 허용되지 않습니다.

  • distributed 함수 또는 codistributed 함수를 사용하여 병렬 풀의 워커 간에 gpuArray를 분산시키는 것은 지원되지 않습니다. 여러 GPU가 있고 병렬 풀의 각 워커가 고유한 GPU에 대한 액세스 권한을 가지고 있다면 수동으로 데이터를 분할하거나 처음부터 데이터를 각 워커별 gpuArray 객체로 나누어 생성할 수 있습니다. 병렬 풀에서 gpuArray 데이터를 사용하는 방법을 보여주는 예제는 Run MATLAB Functions on Multiple GPUs 항목을 참조하십시오.

  • 향상된 성능이 필요한 경우 또는 함수를 GPU에서 사용할 수 없는 경우 gpuArray는 다음 옵션을 지원합니다.

    • gpuArray 객체에서 순수하게 요소별로 동작하는 코드만 미리 컴파일하고 실행하려면 arrayfun 함수를 사용합니다.

    • CUDA® 장치 코드 또는 라이브러리 호출이 포함된 C++ 코드를 실행하려면 MEX 함수를 사용합니다. 자세한 내용은 CUDA 코드가 포함된 MEX 함수 실행 항목을 참조하십시오.

    • CUDA C++로 작성된 기존 GPU 커널을 실행하려면 MATLAB CUDAKernel 인터페이스를 사용합니다. 자세한 내용은 GPU에서 CUDA 또는 PTX 코드 실행하기 항목을 참조하십시오.

    • MATLAB 코드에서 CUDA 코드를 생성하려면 GPU Coder™를 사용합니다. 자세한 내용은 Get Started with GPU Coder (GPU Coder) 항목을 참조하십시오.

  • GPU에서 난수 스트림을 제어하려면 gpurng 함수를 사용합니다.

대안

일부 MATLAB 함수에서 gpuArray 출력값을 지정해 gpuArray 객체를 만들 수도 있습니다. 다음 표에는 gpuArray 객체를 직접 만들 수 있는 MATLAB 함수가 나와 있습니다. 자세한 내용은 함수 도움말 페이지의 확장 기능 섹션을 참조하십시오.

eye(___,"gpuArray")true(___,"gpuArray")
false(___,"gpuArray")zeros(___,"gpuArray")
Inf(___,"gpuArray")gpuArray.colon
NaN(___,"gpuArray")gpuArray.freqspace
ones(___,"gpuArray")gpuArray.linspace
rand(___,"gpuArray")gpuArray.logspace
randi(___,"gpuArray")gpuArray.speye
randn(___,"gpuArray") 

확장 기능

버전 내역

R2010b에 개발됨