Как максимизировать утилиту MATLAB для GPU? - PullRequest
2 голосов
/ 11 марта 2019

Я проверил производительность моего GPU по отношению к себе и процессору для разных размеров матриц и обнаружил противоположность тому, что предлагает большинство литературы по GPU: вычислительные преимущества GPU уменьшаются с размером массива.Код, результаты и спецификации показаны ниже.Примечательные наблюдения:

  1. Утилита GPU остается на уровне ниже 10%, согласно диспетчеру задач
  2. ~ (50%, 20%) = (RAM, CPU) использование для больших(K> 9000) массивы
  3. Значительное снижение отношения скоростей наблюдается около K> 8000
  4. Разделение матрицы K> 8000 (= 9000) Xga на четыре увеличивает векторизованная скорость в два раза
  5. Мой графический процессор занимает гораздо большее место среди графических процессоров, чем мой процессор ( # 24 против # 174 );таким образом, кажется, что центральный процессор на уровне опережает графический процессор для больших массивов
  6. поддержка GPU последнего процессора и производительности процессора поддерживает (5) ;GPU не так сильно превосходит ожидания

В чем причина - мой код, или MATLAB, или аппаратная конфигурация недостаточно используют GPU?Как это выяснить и решить?


%% CODE: centroid indexing in K-means algorithm
    % size(X) = [16000, 3]
    % size(centroids) = [K, 3]
    % Xga = gpuArray(single(X)); cga = gpuArray(single(centroids));
    % Speed ratio = t2/t1, if t2 > t1 - else, t1/t2

%% TIMING
    f1 = fasterFunction(...);
    f2 = slowerFunction(...);
    t1 = gputimeit(f1)  % OR timeit(f1) for non-GPU arrays
    t2 = timeit(f2)     % OR gputimeit(f2) for GPU arrays

%% FUNCTIONS
function out = vecHammer(X, c, K, m)
  [~, out] = min(reshape(permute(sum((X-permute(c,[3 2 1])).^2,2),[1 2 3]),m,K),[],2);
end

function out = forvecHammer(X, c, m)
out = zeros(m,1);
  for j=1:m
    [~,out(j)] = min(sum(((X(j,:))'-c').^2));
  end
end

function out = forforHammer(X,c,m,K)
out = zeros(m,1); idxtemp = zeros(K,1);
  for i=1:m
    for j=1:K
      idxtemp(j) = sum((X(i,:)-c(j,:)).^2,2);
    end
  [~, out(i)] = min(idxtemp);
  end
end

1 Ответ

0 голосов
/ 12 мая 2019

Возможный ответ - данные были просто слишком малы, и только так много можно распараллелить; мой графический процессор извлекает гигабайтный набор данных с несколькими процентными точками - этот размер едва достигает 10 МБ.

...