gpuArray

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

Описание

gpuArray объект представляет массив, сохраненный на графическом процессоре. Работать с gpuArray объекты, используйте любую поддерживающую графический процессор функцию MATLAB®. Можно использовать массив для прямых вычислений или в ядрах 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, чтобы действовать с 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 Запуска на графическом процессоре. Например, используйте комбинацию diagexpmmodвокруг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              

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

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

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