如何最大化MATLAB';什么是GPU实用程序?

如何最大化MATLAB';什么是GPU实用程序?,matlab,performance,parallel-processing,gpu,Matlab,Performance,Parallel Processing,Gpu,我调查了我的GPU在不同矩阵大小下相对于自身和CPU的性能,发现与大多数GPU文献所建议的相反:GPU的计算优势随着阵列大小而减弱。代码、结果和规格如下所示。值得注意的意见: 根据任务管理器,GPU实用程序仍低于10% 大型(K>9000)阵列的~(50%,20%)=(RAM,CPU)使用率 在K>8000左右,观察到相当大的速比下降 将K>8000(=9000)Xga矩阵拆分为四个矩阵将矢量化速度提高两倍 我的GPU在GPU中的排名远远高于我的CPU(vs.);因此,对于更大的阵列,一个普通的

我调查了我的GPU在不同矩阵大小下相对于自身和CPU的性能,发现与大多数GPU文献所建议的相反:GPU的计算优势随着阵列大小而减弱。代码、结果和规格如下所示。值得注意的意见:

  • 根据任务管理器,GPU实用程序仍低于10%
  • 大型(K>9000)阵列的~(50%,20%)=(RAM,CPU)使用率
  • 在K>8000左右,观察到相当大的速比下降
  • 将K>8000(=9000)
    Xga
    矩阵拆分为四个矩阵将矢量化速度提高两倍
  • 我的GPU在GPU中的排名远远高于我的CPU(vs.);因此,对于更大的阵列,一个普通的CPU似乎比GPU性能更好
  • Last pic的GPU与CPU基准测试支持(5);GPU并不像预期的那么优越
  • 罪魁祸首是什么?我的代码、MATLAB或硬件配置是否未充分利用GPU?如何发现并解决




    可能的答案是——数据太小,只能并行处理这么多数据;我的GPU拉一个千兆字节的数据集,只有几个百分点——这一个几乎没有测量到10MB

    我不知道如何阅读Matlab代码,但如果将图1-4的代码的性能描述为受内存带宽的限制,是否公平,因为每个数组元素似乎很少进行计算?至于最后一张图,消费级GPU(如GTX 1070)的双精度运算吞吐量较低,因此观察到的矩阵乘法性能(计算范围)与我预期的一样。Wikipedia列出GTX 1070具有180到202 DP GFLOPS,具体取决于核心频率(此GPU具有动态时钟)。对于受内存吞吐量限制的计算,您预计GPU的优势系数约为7(i7-7700hq的最大理论带宽为37.5 GB/秒,GTX 1070的最大理论带宽为250 GB/秒)。这些数字将有所不同,这取决于CPU安装的DRAM速度和GPU的任何供应商超频;对于足够小的阵列,CPU上也会有基于缓存的加速。@njuffa感谢您的响应;对双精度的良好观察-我添加了单精度测试结果。简要解释代码:数据点的X=(X,y,z)坐标的行;c=相同,但适用于另一组点。目标是找到最接近X中给定数据点的c(质心)。vecHammer中的“和”加上差平方;'“置换”将c转换为[1 x 3 x K](3D)数组,允许在一次操作中从x的每一行中减去c的每一行,对于3D->2D,第二个“置换”。@njuffa对于内存吞吐量限制计算,不确定;Xga=gpuArray(X)在进行任何计算之前将X传输到GPU上,这一次被排除在性能测试之外。(除非你没有提到传输时间;我不熟悉“内存吞吐量”)不管是什么情况,我都看不出GPU自吹自擂处理大数据有什么道理;虽然7倍的优势是显著的,但仍低于经常引用的数百个数字。此外,单精度测试显示出26倍的优势;为什么GPU与CPU矢量化测试中没有反映出这一点?据我所知,所报道的100倍的加速并不是GPU供应商自吹自擂,而是肆无忌惮的研究人员在兜售论文。通过比较标量单线程CPU实现和完全优化的GPU实现,很容易做到这一点。一般来说,对于应用程序级加速,高端GPU与高端CPU的优势应在2倍到10倍的范围内,平均约为5倍。这里你看到的是积木,所以范围可能更大。由于我不理解你的代码(不是MATLAB用户)的功能,我将不再做进一步的评论。
    %% 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