Использование более одного графического процессора в Matlab - PullRequest
9 голосов
/ 05 декабря 2011

это вывод ginfo с использованием Jacket / matlab:

Detected CUDA-capable GPUs:
CUDA driver 270.81, CUDA toolkit 4.0
GPU0 Tesla C1060, 4096 MB, Compute 1.3 (single,double) (in use)
GPU1 Tesla C1060, 4096 MB, Compute 1.3 (single,double)
GPU2 Quadro FX 1800, 742 MB, Compute 1.1 (single)
Display Device: GPU2 Quadro FX 1800

Проблема:

  1. Могу ли я использовать два Teslas одновременно (parfor)? Как?
  2. Как узнать количество ядер, которые в данный момент работают / выполняют программу?
  3. После запуска следующего кода и создания Quadro (используется) я обнаружил, что это занимает меньше времени, чем у Tesla, несмотря на то, что у Tesla 240 ядер, а у Quadro только 64? Может быть, потому что это устройство отображения? Может быть, потому что это одинарная точность, а Тесла двойная точность?
clc; clear all;close all;
addpath ('C:/Program Files/AccelerEyes/Jacket/engine');
i = im2double(imread('cameraman.tif'));
i_gpu=gdouble(i);
h=fspecial('motion',50,45);% Create predefined 2-D filter
h_gpu=gdouble(h);
tic;
for j=1:500
    x_gpu = imfilter( i_gpu,h_gpu );
  end
i2 = double(x_gpu); %memory transfer 
t=toc
 figure(2), imshow(i2);

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

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Использование двух Teslas одновременно : напишите MEX-файл и вызовите cudaChooseDevice(0), запустите одно ядро, затем вызовите cudaChooseDevice(1) и запустите другое ядро. Вызовы ядра и копии памяти (т. Е. cudaMemcpyAsync и cudaMemcpyPeerAsync) являются асинхронными. Я привел пример того, как записать MEX-файл (т.е. DLL) в одном из моих других ответов . Просто добавьте второе ядро ​​к этому примеру. К вашему сведению, вам не нужен Jacket, если вы можете заниматься программированием на C / C ++. С другой стороны, если вы не хотите тратить свое время на изучение Cuda SDK или у вас нет компилятора C / C ++, то вы застряли с Jacket или gp-you или GPUlib до тех пор, пока Matlab не изменит способ работы parfor.

Альтернативой является вызов OpenCL из Matlab (снова через MEX-файл). Затем вы можете запустить ядра на всех графических процессорах и процессорах. Опять же, это требует некоторого программирования на C / C ++.

0 голосов
/ 15 октября 2014

В Matlab 2012 функции массива GPU и связанные с ним функции полностью интегрированы в MATLAB, поэтому вам, возможно, не понадобится использовать Jacket для достижения того, что вы пытаетесь сделать.

В сумме поставьте gpuDevice(deviceID); передпри выполнении команд графического процессора, следующие коды будут запущены на deviceID th GPU.Например,

gpuDevice(1);
a = gpuArray(rand(3)); // a is on the first GPU memory
gpuDevice(2);
b = gpuArray(rand(4)); // b is on the second GPU memory

Для запуска нескольких графических процессоров.Проще говоря,

c = cell(1,num_device);
parfor i = 1:num_device
    gpuDevice(i);
    a = gpuArray(magic(3));
    b = gpuArray(rand(3));
    c{i} = gather(a*b);
end

Вы можете увидеть использование памяти GPU, набрав nvidia-smi в командной строке системы.

Этот способ установки идентификатора GPU кажется странным, но это обычный способустановить идентификатор GPU.В CUDA, если вы хотите использовать определенный GPU, тогда cudaSetDevice(gpuId) и следующие коды будут работать на gpuId th GPU.(Индексирование 0 оснований)

---------------------- РЕДАКТИРОВАТЬ ----------------

Протестировано и подтверждено на MATLAB 2012b, MATLAB 2013b.

Проверено с помощью nvidia-smi, что код на самом деле использует другую память GPU.Возможно, вам придется увеличить его очень большое rand(5000) и проверить очень быстро, поскольку временные переменные a и b исчезнут после окончания цикла for

...