RenderScript GPU性能与设备GFLOPS不相上下?

时间:2014-10-13 09:43:25

标签: performance opencl gpu benchmarking renderscript

作为测试,我试图尽可能多地从GPU中获取GFLOPS,只是为了看看我们可以通过RenderScript进行计算的距离。

为此,我使用了一个GPU缓存友好的内核,它(希望)不会受到内存访问的限制以进行测试:

#pragma rs_fp_relaxed
rs_allocation input;

float __attribute__((kernel)) compute(float in, int x)
{
    float sum = 0;
    if (x < 64) return 0;
    for (int i = 0; i < 64; i++) {
        sum += rsGetElementAt_float(input, x - i);
    }
    return sum;
}

在Java方面,我只是调用内核几次:

for (int i = 0; i < 1024; i++) {
    m_script.forEach_compute(m_inAllocation, m_outAllocation);
}

如果分配大小为1M浮点数,那么GPU上的最大值大约为1-2 GFLOPS,最大值应为100 GFLOPS(Snapdragon 600,APQ8064AB),的计算性能要低50倍-100倍。。< / p>

我尝试展开循环(10%差异),使用更大或更小的总和(<5%差异),不同的分配大小(<5%差异),1D或2D分配(无差异),但是来了远不及设备上应该可能的GFLOPS数量。我甚至认为整个内核只在CPU上运行。

在类似意义上,查看RenderScript基准测试应用程序(https://compubench.com/result.jsp?benchmark=compu20的结果,线条设备的顶部仅在高斯模糊下达到约60M像素/秒。天真(不可分离)实现中的5x5模糊需要大约50 FLOPS /像素,导致3 GFLOPS而不是这些GPU具有的300 GFLOPS。

有什么想法吗?

(有关设备功能的概述,请参阅http://kyokojap.myweb.hinet.net/gpu_gflops/

编辑:

使用设备上可用的OpenCL库(Samsung S4,4.4.2)我已将RenderScript测试程序重写为OpenCL并通过NDK运行它。基本上相同的设置(1M浮动缓冲区和运行内核1024次)我现在可以获得大约25 GFLOPS,,这是RenderScript性能的10倍,是理论设备最大值的4倍。

对于RenderScript,无法知道内核是否在GPU上运行。所以:

  • 如果RenderScript内核确实在GPU上运行,为什么它这么慢?
  • 如果内核没有在GPU上运行,哪些设备在GPU上运行RenderScript(除了很可能是Nexus系列)?

感谢。

1 个答案:

答案 0 :(得分:1)

您使用的是什么设备?并非所有设备都附带GPU驱动程序。

此外,该内核将受内存限制,因为您的算术加载比率为1:1。