gpt4 book ai didi

Android renderscript 从不在 gpu 上运行

转载 作者:搜寻专家 更新时间:2023-11-01 08:27:56 25 4
gpt4 key购买 nike

正如标题所说。

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

// 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);
}

作为比较,当我通过纹理四边形上的 fragment 着色器在 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 操作系统版本),但问题仍然存在。

那么,RenderScript 什么时候在 GPU 上运行?如果有人能给我一个关于运行 GPU 的 RenderScript 的例子就足够了。

最佳答案

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

#pragma rs_fp_relaxed

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

关于Android renderscript 从不在 gpu 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43073774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com