如何最大化MATLAB的GPU实用程序?

时间:2019-03-11 19:32:26

标签: matlab performance parallel-processing gpu

我已经针对不同的矩阵大小对GPU和其自身以及CPU的性能进行了调查,发现与大多数GPU文献所提出的相反:GPU的计算优势随阵列大小而减小。代码,结果和规格如下所示。值得注意的观察:

  1. 根据任务管理器,GPU实用程序仍不到10%
  2. 〜(50%,20%)=大(K> 9000)阵列的(RAM,CPU)使用率
  3. 在K> 8000附近观察到明显的速比下降
  4. 将K> 8000(= 9000)Xga矩阵分解为四个增加矢量化速度的两倍
  5. 我的GPU在GPU中的排名远高于我的CPU(#24#174);因此,对于大型阵列来说,标准的CPU似乎会优于 GPU
  6. 上一张图片的GPU与CPU基准测试支持(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 :(得分:0)

可能的答案是-数据太小了,只能并行化那么多;我的GPU提取了一个具有几个百分点的千兆字节数据集-这个数据集几乎只有10MB。