gpuArray

Массив, сохраненный на графическом процессоре

Описание

A gpuArray объект представляет массив, сохраненный в графическом процессоре. Для работы с gpuArray объекты, используйте любой MATLAB с поддержкой GPU® функция. Можно использовать массив для прямых вычислений или в ядрах CUDA, которые выполняются на графическом процессоре. Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре.

Если вы хотите получить массив из графический процессор, например, при использовании функции, которая не поддерживает gpuArray объекты, использовать gather функция.

Примечание

Можно загрузить файлы MAT, содержащие данные gpuArray, как массивы в памяти, когда графический процессор недоступен. gpuArray, загруженный без графический процессор, ограничен, и вы не можете использовать его для расчетов. Чтобы использовать gpuArray, загруженный без графический процессор, извлеките содержимое с помощью gather.

Создание

Использование gpuArray для преобразования массива в рабочем пространстве MATLAB в gpuArray объект. Многие функции MATLAB также позволяют создавать gpuArray объекты непосредственно. Дополнительные сведения см. в разделе Установка массивов на графическом процессоре.

Синтаксис

Описание

пример

G = gpuArray(X) копирует X массива на графический процессор и возвращает gpuArray объект.

Входные параметры

расширить все

Массив для передачи на графический процессор, заданный как числовой или логический массив. Графический процессор должно иметь достаточную свободную память для хранения данных. Если X уже является gpuArray объект, gpuArray выходы X без изменений.

Можно также передавать разреженные массивы на графический процессор. gpuArray поддерживает только разреженные массивы двойной точности.

Пример: G = gpuArray(magic(3));

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного числа: Да

Функции объекта

arrayfunПрименить функцию к каждому элементу массива на графическом процессоре
gatherПеренесите распределенный массив или gpuArray в локальную рабочую область
pagefunПрименить функцию к каждой странице распределенного массива или gpuArray

Существует несколько методов исследования характеристик gpuArray объект. Большинство ведет себя как функции MATLAB того же имени.

existsOnGPUОпределите, доступен ли gpuArray или CUDAKernel на графическом процессоре
isequalОпределите равенство массива
isnumericОпределите, является ли вход числовым массивом
issparseОпределите, является ли вход разреженным
isUnderlyingTypeОпределите, определил ли вход базовый тип данных
lengthДлина наибольшего измерения массива
ndimsКоличество измерений массива
sizeРазмер массива
underlyingTypeТип базовых данных, определяющих поведение массива

Другие методы gpuArray слишком много объектов для перечисления. Большинство напоминает и ведет себя так же, как и функции MATLAB того же имени. См. раздел «Запуск функций MATLAB на графическом процессоре».

Примеры

свернуть все

В этом примере показано, как использовать функции MATLAB с поддержкой GPU для работы с gpuArrays. Проверить свойства своего графического процессора можно с помощью gpuDevice функция.

gpuDevice
ans = 
  CUDADevice with properties:

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

Создайте вектор-строку, который повторяет значения от -15 до 15. Чтобы передать его в графический процессор и создать 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              

Для работы с gpuArrays используйте любую функцию MATLAB с поддержкой GPU. MATLAB автоматически запускает вычисления на графическом процессоре. Для получения дополнительной информации смотрите Запуск функций 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));

Если необходимо перенести данные обратно из графического процессора, используйте gather. Возврат к центральный процессор может быть дорогостоящим и, как правило, не является необходимым, если вам не нужно использовать результат с функциями, которые не поддерживают gpuArray.

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

  result      96x96            73728  double              

В целом могут быть различия в результатах, если вы запускаете код на центральный процессор, из-за численной точности и алгоритмических различий между GPU и CPU. Ответы на CPU и GPU являются одинаково допустимыми приближениями с плавающей точкой к истинному аналитическому результату, подвергнутыми различному округлению во время расчетов. В этом примере результаты являются целыми числами и round устраняет ошибки округления.

В этом примере показов, как использовать функции MATLAB и операторы с gpuArrays, чтобы вычислить интеграл функции, используя метод интегрирования Монте-Карло.

Задайте число точек для выборки. Точки выборки в области функции, интервал [-1,1] в обоих x и координаты y путем создания случайных точек с rand функция. Чтобы создать случайный массив непосредственно на графическом процессоре, используйте rand и задайте 'gpuArray'. Дополнительные сведения см. в разделе Установка массивов на графическом процессоре.

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

Определите функцию для интеграции и используйте на ней формулу интегрирования Монте-Карло. Эта функция аппроксимирует значение π путем дискретизации точек внутри модуля круга. Поскольку код использует функции с поддержкой GPU и операторы на gpuArrays, расчеты автоматически выполняются на графический процессор. Можно выполнить двоичные операции, такие как поэлементное умножение, используя тот же синтаксис, который используют массивы MATLAB. Дополнительные сведения о функциях, поддерживающих графический процессор, см. в разделе Запуск функций MATLAB на графическом процессоре.

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

    3.1403

Этот пример показывает, как использовать функции MATLAB с поддержкой GPU для вычисления хорошо известной математической конструкции: набора Мандельброта. Проверьте свой графический процессор с помощью gpuDevice функция.

Определите параметры. Алгоритм Мандельброта итерирует над сеткой вещественных и мнимых частей. Следующий код определяет количество итераций, размер сетки и пределы сетки.

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

Можно использовать gpuArray функция для передачи данных в графический процессор и создания gpuArrayили можно создать массив непосредственно на графическом процессоре. gpuArray предоставляет версии графический процессор многих функций, которые можно использовать для создания массивов данных, таких как linspace. Для получения дополнительной информации смотрите Создание массивов графических процессоров непосредственно.

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 поддерживают gpuArrays. Когда вы поставляете аргумент gpuArray в любую функцию с поддержкой GPU, функция запускается автоматически на графическом процессоре. Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре. Создайте сложную сетку для алгоритма и создайте массив count для результатов. Чтобы создать этот массив непосредственно на графическом процессоре, используйте ones function, и задать 'gpuArray'.

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

Следующий код реализует алгоритм Мандельброта, используя функции, поддерживающие графический процессор. Поскольку код использует gpuArrays, вычисления происходят на графическом процессоре.

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

Совет

  • Если вам нужна повышенная эффективность, или если функция недоступна для графический процессор, gpuArray поддерживает следующие опции:

    • Чтобы предварительно скомпилировать и запустить чисто поэлементный код на gpuArray объекты, использовать arrayfun функция.

    • Запуск кода С++, содержащего CUDA® код устройства или вызовы библиотеки, используйте MEX-функцию. Для получения дополнительной информации смотрите Запуск MEX-функций, содержащих код CUDA.

    • Чтобы запустить существующие ядра графический процессор, написанные на CUDA C++, используйте интерфейс MATLAB CUDAKernel. Для получения дополнительной информации смотрите Запуск кода CUDA или PTX на графическом процессоре.

    • Чтобы сгенерировать код CUDA из кода MATLAB, используйте GPU Coder™. Для получения дополнительной информации смотрите Запуск с GPU Coder (GPU Coder).

  • Вы можете управлять потоком случайных чисел на графическом процессоре, используя gpurng.

  • Ни одно из следующих не может превысить intmax('int32'):

    • Количество элементов массива плотного массива.

    • Количество ненулевых элементов массива разреженного массива.

    • Размер в любой заданной размерности. Для примера, zeros(0,3e9,'gpuArray') не разрешено.

Альтернативы

Можно также создать gpuArray объект, использующий некоторые функции MATLAB путем определения gpuArray выход. В следующей таблице перечислены доступные функции MATLAB, которые могут создать gpuArray объекты непосредственно.

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, type

help gpuArray.colon
Введенный в R2010b