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

gpuArray

GPU에 저장된 배열

설명

gpuArray 객체는 GPU에 저장된 배열을 나타냅니다. gpuArray 객체로 작업하려면 GPU 지원 MATLAB® 함수를 사용하십시오. 직접 계산할 때 이 배열을 사용하거나 GPU에서 실행되는 CUDA 커널에서 이 배열을 사용할 수 있습니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오.

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

생성

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
복소수 지원 여부:

객체 함수

arrayfunApply function to each element of array on GPU
gather로컬 작업 공간으로 분산 배열 또는 gpuArray 전송
pagefunApply function to each page of array on GPU

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

classUnderlyingClass of elements within gpuArray or distributed array
existsOnGPUDetermine if gpuArray or CUDAKernel is available on GPU
isaUnderlyingtall형 배열 데이터가 지정된 클래스의 데이터인지 확인
isequal배열의 동일성 확인
isnumeric입력값이 숫자형 배열인지 확인
issparse입력값이 희소 형식인지 확인
length가장 큰 배열 차원의 길이
ndims배열의 차원 수
size배열 크기

gpuArray 객체에 대한 기타 메서드는 너무 많아 여기에 다 나열할 수 없습니다. 대부분 같은 이름 MATLAB 함수와 비슷하며, 동일하게 동작합니다. 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              

이 예제에서는 몬테카를로 적분 방법을 통해 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에서 GPU 지원 함수 및 연산자를 사용하므로 계산은 자동으로 GPU에서 실행됩니다. MATLAB 배열에서 사용하는 것과 동일한 구문을 사용하여 요소별 곱셈과 같은 이항 연산을 수행할 수 있습니다. GPU 지원 함수에 대한 자세한 내용은 GPU에서 MATLAB 함수 실행하기 항목을 참조하십시오.

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

    3.1403

이 예제에서는 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는 다음 옵션을 지원합니다.

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

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

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

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

  • gpurng를 사용하여 GPU에서 난수 스트림을 제어할 수 있습니다.

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

    • 조밀 배열의 요소 개수.

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

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

대안

일부 MATLAB 함수에서 gpuArray 출력값을 지정해 gpuArray 객체를 만들 수도 있습니다. 다음 표에는 gpuArray 객체를 직접 만들 수 있는 사용 가능한 MATLAB 함수가 나와 있습니다.

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

접두사가 gpuArray인 함수에 대한 클래스별 도움말을 보려면 다음을 입력합니다.

help gpuArray.functionname

여기서 functionname은 메서드의 이름입니다. 예를 들어, colon에 대한 도움말을 가져오려면 다음을 입력합니다.

help gpuArray.colon

R2010b에 개발됨