Я проверил производительность моего GPU по отношению к себе и процессору для разных размеров матриц и обнаружил противоположность тому, что предлагает большинство литературы по GPU: вычислительные преимущества GPU уменьшаются с размером массива.Код, результаты и спецификации показаны ниже.Примечательные наблюдения:
- Утилита GPU остается на уровне ниже 10%, согласно диспетчеру задач
- ~ (50%, 20%) = (RAM, CPU) использование для больших(K> 9000) массивы
- Значительное снижение отношения скоростей наблюдается около K> 8000
- Разделение матрицы K> 8000 (= 9000)
Xga
на четыре увеличивает векторизованная скорость в два раза
- Мой графический процессор занимает гораздо большее место среди графических процессоров, чем мой процессор ( # 24 против # 174 );таким образом, кажется, что центральный процессор на уровне опережает графический процессор для больших массивов
- поддержка 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