Android renderscript永远不会在gpu

时间:2017-03-28 15:31:20

标签: android gpgpu renderscript

正如标题所说。

我有一个我想要使用的并行图像创建/处理算法。这是一种perlin噪声实现。

// Logging is never used here
#pragma version(1)
#pragma rs java_package_name(my.package.name)
#pragma rs_fp_full

float sizeX, sizeY;
float ratio;

static float fbm(float2 coord)
{ ... }

uchar4 RS_KERNEL root(uint32_t x, uint32_t y)
{
float u = x / sizeX * ratio;
float v = y / sizeY;

float2 p = {u, v};

float res = fbm(p) * 2.0f;   // rs.: 8245 ms, fs: 8307 ms; fs 9842 ms on tablet

float4 color = {res, res, res, 1.0f};
//float4 color = {p.x, p.y, 0.0, 1.0};  // rs.: 96 ms

return rsPackColorTo8888(color);
}

作为比较,当我通过纹理四边形上的片段着色器在gpu上实现它时,这个精确的算法运行至少30 fps。

运行RenderScript的开销应该是最大100毫秒,我通过返回x和y标准化坐标来制作一个简单的位图。

这意味着万一它会使用gpu肯定不会变成10秒。

我正在使用RenderScript的代码:

// The non-support version gives at least an extra 25% performance boost
import android.renderscript.Allocation;
import android.renderscript.RenderScript;

public class RSNoise {

    private RenderScript renderScript;
    private ScriptC_noise noiseScript;

    private Allocation allOut;

    private Bitmap outBitmap;

    final int sizeX = 1536;
    final int sizeY = 2048;

    public RSNoise(Context context) {
        renderScript = RenderScript.create(context);

        outBitmap = Bitmap.createBitmap(sizeX, sizeY, Bitmap.Config.ARGB_8888);
        allOut = Allocation.createFromBitmap(renderScript, outBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE);

        noiseScript = new ScriptC_noise(renderScript);
    }

    // The render function is benchmarked only
    public Bitmap render() {
        noiseScript.set_sizeX((float) sizeX);
        noiseScript.set_sizeY((float) sizeY);
        noiseScript.set_ratio((float) sizeX / (float) sizeY);

        noiseScript.forEach_root(allOut);

        allOut.copyTo(outBitmap);

        return outBitmap;
    }
}

如果我将其更改为FilterScript,使用此帮助(https://stackoverflow.com/a/14942723/4420543),在支持库的情况下,我会得到几百毫秒的情况,在不支持的情况下,我的情况会加倍。精度不影响结果。

我还检查了stackoverflow上的每个问题,但是大多数问题已经过时了,我还尝试使用nexus 5(7.1.1 os版本)和其他几个新设备,但问题仍然存在。

那么,RenderScript何时在GPU上运行?如果有人可以在运行GPU的RenderScript上给我一个例子就足够了。

2 个答案:

答案 0 :(得分:3)

您可以尝试使用rs_fp_relaxed而不是rs_fp_full来运行它吗?

#pragma rs_fp_relaxed

rs_fp_full将强制您的脚本在CP​​U上运行,因为大多数GPU都不支持全精度浮点运算。

答案 1 :(得分:0)

我同意你的猜测。

在Nexux 7(2013,JellyBean 4.3)上,我分别写了一个renderscript和一个filtercript来计算着名的Mandelbrot集。 与执行相同操作的OpenGL片段着色器(所有具有32位浮点数)相比,脚本大约是的3倍。我假设OpenGL使用GPU,其中renderscript(和filterscript!)没有。

然后我分别将相机预览转换(NV21格式 - > RGB)与renderscript,filterscript和ScriptIntrinsicYuvToRGB进行比较。 这里 Intrinsic比自编脚本快4倍。 我再次看到renderscript和filterscript之间的性能没有差异。在这种情况下,我假设自编写的脚本只在内部使用GPU的情况下再次使用CPU(也是?)。