exponenta event banner

gpuArray

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

Описание

A gpuArray объект представляет массив, хранящийся в графическом процессоре. Для работы с gpuArray используйте любую функцию MATLAB ® с поддержкой графического процессора. Массив можно использовать для прямых вычислений или в ядрах CUDA, которые выполняются на GPU. Дополнительные сведения см. в разделе Выполнение функций 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 на GPU
isequalОпределение равенства массива
isnumericОпределите, является ли ввод числовым массивом
issparseОпределение разреженности входных данных
isUnderlyingTypeОпределите, был ли на входе указан базовый тип данных
lengthДлина наибольшего размера массива
ndimsКоличество измерений массива
sizeРазмер массива
underlyingTypeТип базовых данных, определяющих поведение массива

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

Примеры

свернуть все

В этом примере показано, как использовать функции MATLAB с поддержкой графического процессора для работы с 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 с поддержкой графического процессора. 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              

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

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

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

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

Определите функцию для интеграции и используйте формулу интеграции Монте-Карло. Эта функция аппроксимирует значение δ точками выборки в пределах единичной окружности. Поскольку код использует функции и операторы с поддержкой GPU в gpuArrays, вычисления автоматически выполняются на GPU. Можно выполнять двоичные операции, такие как элементное умножение, используя тот же синтаксис, что и массивы 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 предоставляет версии GPU многих функций, которые можно использовать для создания массивов данных, таких как 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');

Следующий код реализует алгоритм Мандельброта с помощью функций с поддержкой GPU. Поскольку код использует gpuArrays, вычисления выполняются на 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

Совет

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

  • Управлять потоком случайных чисел на GPU можно с помощью 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, тип

help gpuArray.colon
Представлен в R2010b