作为测试,我试图尽可能多地从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上运行。所以:
感谢。
答案 0 :(得分:1)
您使用的是什么设备?并非所有设备都附带GPU驱动程序。
此外,该内核将受内存限制,因为您的算术加载比率为1:1。