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

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

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

Проверяйте или выберите GPU

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

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

Используйте функции 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              

Увеличьте резкость изображения Используя графический процессор

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

Считайте изображение и отправьте его в графический процессор с помощью функции 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)');

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

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

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

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

abs
angle
bicg
bicgstab
ceil
cgs
classUnderlying
conj
ctranspose
deg2rad
end
expm1
find
fix
floor
full
gmres
gpuArray.speye
imag
isaUnderlying
isdiag
isempty
isequal
isequaln
isfloat
isinteger
islogical
isnumeric
isreal
issparse
istril
istriu
length
log1p
lsqr
minus
mtimes
ndims
nextpow2
nnz
nonzeros
norm
numel
nzmax
pcg
plus
rad2deg
real
realsqrt
round
sign
size
sparse
spfun
spones
sprandsym
sqrt
sum
transpose
tril
triu
uminus
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
atanhabs(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, чтобы достигнуть высокой производительности и точности.

Смотрите также

|

Связанные примеры

Больше о