gpuArray

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

Описание

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

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

Создание

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

Синтаксис

G = gpuArray(X)

Описание

пример

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

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

развернуть все

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

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

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. Чтобы передать его графическому процессору и создать 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. MATLAB автоматически выполняет вычисления на графическом процессоре. Для получения дополнительной информации смотрите функции MATLAB Выполнения на графическом процессоре. Например, используйте комбинацию diag, expm, mod, abs и fliplr.

gpuE = expm(diag(gpuX,-1)) * expm(diag(gpuX,1));
gpuM = mod(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              

Этот пример показывает, как использовать функции 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;

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

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

    3.1403

Этот пример показывает, как использовать поддерживающие графический процессор функции MATLAB, чтобы вычислить известную математическую конструкцию: Множество Мандельброта. Проверяйте свой графический процессор с помощью функции 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 аргумент к любой поддерживающей графический процессор функции, функция запускается автоматически на графическом процессоре. Для получения дополнительной информации смотрите функции MATLAB Выполнения на графическом процессоре. Создайте комплексную сетку для алгоритма и создайте массив count для результатов. Чтобы создать этот массив непосредственно на графическом процессоре, используйте функцию ones и задайте '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.

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

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

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

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

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

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

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

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

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

Для специфичной для класса справки на функциях с префиксом gpuArray ввести

help gpuArray.functionname

где functionname является именем метода. Например, чтобы получить справку на colon, ввести

help gpuArray.colon

Представленный в R2010b