Запуск функций MATLAB на графическом процессоре

Функции MATLAB с аргументами gpuArray

Сотни функций в MATLAB® и другие тулбоксы запускаются автоматически на графическом процессоре, если вы поставляете gpuArray аргумент.

A = gpuArray([1 0 1; -1 -2 0; 0 1 -1]);
e = eig(A);

Всякий раз, когда вы вызываете любую из этих функций с по крайней мере одним gpuArray в качестве входного параметра данных, функция выполняется на графическом процессоре. Функция генерирует в результате gpuArray, если только возврат данных MATLAB не является более подходящим (для примера, size). Можно смешать входы с использованием как gpuArray, так и массивов MATLAB в одном вызове функции. Чтобы узнать больше о том, когда функция запускается на графическом процессоре или центральном процессоре, смотрите Специальные условия для входов gpuArray. Функции, поддерживающие графический процессор, включают дискретное преобразование Фурье (fft), матричное умножение (mtimes), левое матричное деление (mldivide), и сотни других. Для получения дополнительной информации см. раздел Проверка функций, поддерживаемых графическим процессором.

Проверяйте функции, поддерживаемые графическим процессором

Если функция MATLAB имеет поддержку для gpuArrays, можно проконсультироваться с дополнительной информацией об использовании графического процессора на ее странице функции. См. GPU Arrays в разделе Extended Capabilities в конце страницы функции.

Совет

Отфильтрованный список функций MATLAB, поддерживающих массивы GPU, см. в Списке функций (GPU-массивы).

Несколько тулбоксов MATLAB включают функции со встроенной поддержкой графический процессор. Чтобы просмотреть списки всех функций в этих тулбоксах, поддерживающих gpuArrays, используйте ссылки в следующей таблице. Функции в списках с предупреждающими индикаторами имеют ограничения или указания по применению, характерные для выполнения функции на графическом процессоре. Проверить указания по применению и ограничения можно в разделе Extended Capabilities страницы с описанием функции. Для получения информации об обновлениях отдельных функций, поддерживающих графический процессор, см. примечания к релизу.

Имя тулбоксаСписок функций с поддержкой gpuArrayДокументация для конкретного графического процессора
MATLABФункции с поддержкой gpuArray 
Statistics and Machine Learning Toolbox™Функции с поддержкой gpuArray (Statistics and Machine Learning Toolbox) 
Image Processing Toolbox™Функции с поддержкой gpuArray (Image Processing Toolbox)Вычисление графического процессора (набор Image Processing Toolbox)
Deep Learning Toolbox™

Функции с поддержкой gpuArray (Deep Learning Toolbox)

* (см. также «Глубокое обучение с использованием графических процессоров»)

Computer Vision Toolbox™Функции с поддержкой gpuArray (Computer Vision Toolbox)Генерация кода графического процессора (Computer Vision Toolbox)
Communications Toolbox™Функции с поддержкой gpuArray (Communications Toolbox)Поддержка генерации кода и ускорения (Communications Toolbox)
Signal Processing Toolbox™Функции с поддержкой gpuArray (Signal Processing Toolbox)Генерация кода и поддержка графический процессор (набор Signal Processing Toolbox)
Audio Toolbox™Функции с поддержкой gpuArray (Audio Toolbox)Генерация кода и поддержка графический процессор (Audio Toolbox)
Wavelet- Toolbox™Функции с поддержкой gpuArray (Wavelet Toolbox)Генерация кода и поддержка графический процессор (Wavelet Toolbox)
Curve Fitting Toolbox™Функции с поддержкой gpuArray (Curve Fitting Toolbox) 

Вы можете просматривать поддерживаемые графическим процессором функции из всех MathWorks® продукты по следующей ссылке: функции, поддерживаемые графическим процессором. Также можно фильтровать по продукту. На панели Help нажмите Functions. В списке функций перейдите на левую панель, чтобы выбрать продукт, например, MATLAB. В нижней части левой панели выберите GPU Arrays. Если вы выбираете продукт, который не имеет функций с поддержкой GPU, то GPU Arrays фильтр недоступен.

Глубокое обучение с использованием графических процессоров

Для многих функций в Deep Learning Toolbox поддержка GPU происходит автоматически, если у вас есть подходящие графический процессор и Parallel Computing Toolbox™. Вам не нужно преобразовывать свои данные в gpuArray. Ниже приведен неисчерпывающий список функций, которые по умолчанию запуск на графическом процессоре при наличии.

Для получения дополнительной информации об автоматической поддержке GPU в Deep Learning Toolbox, смотрите Глубокое Обучение с Большими Данными на графических процессорах и в Parallel (Deep Learning Toolbox).

Для расширенных сетей и рабочих процессов, которые используют сети, определенные как dlnetwork (Deep Learning Toolbox) объекты или функции модели, преобразуйте ваши данные в gpuArray. Используйте функции с поддержкой gpuArray (Deep Learning Toolbox), чтобы запустить пользовательские циклы обучения или предсказание на графическом процессоре.

Проверяйте или выбирайте графический процессор

Если у вас есть графический процессор, то MATLAB автоматически использует его для расчетов GPU. Вы можете проверить свой графический процессор, используя gpuDevice функция. Если у вас есть несколько графических процессоров, то можно использовать gpuDevice для выбора одного из них или использования нескольких графических процессоров с параллельным пулом. Для получения примера смотрите Идентифицируйте и выберите устройство GPU и используйте несколько графических процессоров в параллельном пуле. Чтобы проверить, поддерживается ли ваш графический процессор, см. раздел «Поддержка GPU по релизу».

Для глубокого обучения MATLAB обеспечивает автоматическую параллельную поддержку нескольких графических процессоров. Смотрите Глубокое Обучение с MATLAB на нескольких графических процессорах (Deep Learning Toolbox).

Использование функций 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 устраняет ошибки округления.

Заточка изображения с помощью графический процессор

В этом примере показано, как заточить изображение с помощью функций gpuArrays и GPU.

Прочтите изображение и отправьте его на графический процессор с помощью gpuArray функция.

image = gpuArray(imread('peppers.png'));

Преобразуйте изображение в двойное и примените свертки, чтобы получить градиентное изображение. Затем, используя градиентное изображение, заточите изображение в множитель amount.

dimage = im2double(image); 
gradient = convn(dimage,ones(3)./9,'same') - convn(dimage,ones(5)./25,'same');
amount = 5;
sharpened = dimage + amount.*gradient;

Измените размер, постройте график и сравните оригинальные и заточенные изображения.

imshow(imresize([dimage, sharpened],0.7));
title('Original image (left) vs sharpened image (right)');

Вычислите набор Мандельброта с помощью функций с поддержкой GPU

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

Работа с разреженными массивами на графическом процессоре

Следующие функции поддерживают разреженные gpuArrays.

abs
acos
acosd
acosh
acot
acotd
acoth
acsc
acscd
acsch
angle
asec
asecd
asech
asin
asind
asinh
atan
atand
atanh
bicg
bicgstab
ceil
cgs
classUnderlying
conj
cos
cosd
cosh
cospi
cot
cotd
coth
csc
cscd
csch
ctranspose
deg2rad
diag
end
eps
exp
expint
expm1
find
fix
floor
full
gmres
gpuArray.speye
imag
isaUnderlying
isdiag
isempty
isequal
isequaln
isfinite
isfloat
isinteger
islogical
isnumeric
isreal
issparse
istril
istriu
isUnderlyingType
length
log
log2
log10
log1p
lsqr
minus
mtimes
mustBeUnderlyingType
ndims
nextpow2
nnz
nonzeros
norm
numel
nzmax
pcg
plus
qmr
rad2deg
real
reallog
realsqrt
round
sec
secd
sech
sign
sin
sind
sinh
sinpi
size
sparse
spfun
spones
sprandsym
sqrt
sum
tan
tand
tanh
tfqmr
times (.*)
trace
transpose
tril
triu
uminus
underlyingType
uplus 
  

Вы можете создать разреженный gpuArray либо путем вызова sparse с входом gpuArray или путем вызова gpuArray с разреженным входом. Для примера,

x = [0 1 0 0 0; 0 0 0 0 1]
     0     1     0     0     0
     0     0     0     0     1
s = sparse(x)
   (1,2)        1
   (2,5)        1
g = gpuArray(s);   % g is a sparse gpuArray
gt = transpose(g); % gt is a sparse gpuArray
f = full(gt)       % f is a full gpuArray
     0     0
     1     0
     0     0
     0     0
     0     1

Разреженные gpuArrays не поддерживают индексацию. Вместо этого используйте find для поиска ненулевых элементов массива и их индексов строк и столбцов. Затем замените значения, которые вы хотите, и создайте новый разреженный gpuArray.

Работа со сложными числами на графическом процессоре

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

Для примера при создании gpuArray, который может иметь отрицательные элементы, используйте G = gpuArray(complex(p)), тогда можно успешно выполнить sqrt(G).

Или в пределах функции, переданной в arrayfun, если x является вектором вещественных чисел, и некоторые элементы имеют отрицательные значения, sqrt(x) генерирует ошибку; вместо этого следует позвонить sqrt(complex(x)).

Если результатом является gpuArray комплексных данных, и все мнимые части равны нулю, эти части сохраняются, и данные остаются сложными. Это может иметь влияние при использовании sort, isrealи так далее.

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

ФункцияВходная область значений для реального выхода
acos(x)abs(x) <= 1
acosh(x)x >= 1
acoth(x)abs(x) >= 1
acsc(x)abs(x) >= 1
asec(x)abs(x) >= 1
asech(x)0 <= x <= 1
asin(x)abs(x) <= 1
atanh(x)abs(x) <= 1
log(x)x >= 0
log1p(x)x >= -1
log10(x)x >= 0
log2(x)x >= 0
power(x,y)x >= 0
reallog(x)x >= 0
realsqrt(x)x >= 0
sqrt(x)x >= 0

Особые условия для входов gpuArray

Функции, поддерживающие графический процессор, выполняются на графическом процессоре только тогда, когда данные находятся на графическом процессоре. Например, следующий код запускается на графическом процессоре, потому что данные, первый вход, находится на графическом процессоре:

>> sum(gpuArray(magic(10)),2);
Однако этот код не запускается на графическом процессоре, потому что данные, первый вход, не на графическом процессоре:
>> sum(magic(10),gpuArray(2));
Если ваш входной параметр gpuArrays содержит такие элементы, как размерности, коэффициенты масштабирования или количество итераций, то функция собирает их и вычисляет на центральном процессоре. Функции выполняются только на графическом процессоре, когда фактическими аргументами данных являются gpuArrays.

Список благодарностей

MAGMA является библиотекой линейных алгебр- стандартных программ, которые используют преимущества графического процессора ускорения. Линейные алгебры, реализованные для gpuArrays в Parallel Computing Toolbox, используют MAGMA для достижения высокой эффективности и точности.

См. также

|

Похожие примеры

Подробнее о