PKUEcho / AndroidOS

0 stars 0 forks source link

Have you understand the mechanism in Renderscript? #1

Open jay2002 opened 7 years ago

jay2002 commented 7 years ago

I have read your questions in stack overflow, but I still confuse about the mechanism in renderscript... Can I have a discussion with you?

PS: 我猜你是PKU CS的?真心求探讨。。。网上各种解答我已经找了一遍,各种答复理解不能。我目前的情况是一调用RenderScript,cpu占用率就特别高,感觉根本没用到GPU

PKUEcho commented 7 years ago

你好,我也是网上各种没找到Renderscript有用的资料,后来也放弃了它。。你可以把你的问题发给我,我尽力帮忙。

2016-12-09 14:29 GMT+08:00 jay2002 notifications@github.com:

I have read your questions in stack overflow, but I still confuse about the mechanism in renderscript... Can I have a discussion with you?

PS: 我猜你是PKU CS的?真心求探讨。。。网上各种解答我已经找了一遍,根本没找到靠谱的

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/PKUEcho/AndroidOS/issues/1, or mute the thread https://github.com/notifications/unsubscribe-auth/AGpItve3dU4oo8TP_ypkoQ4Ju7Hb6CrQks5rGPVVgaJpZM4LIn55 .

jay2002 commented 7 years ago

好的,谢谢! 我测了3款手机,Samsung s4、oppo r7、oppo r9,均是Android5.0+或5.1+的,按stackoverflow上rs开发者的说法,gpu应该是rs已经适配了(除非驱动没更新……)。 现在的情况是这样,我for循环只运行RenderScript的部分,这三台机器中有两台cpu占用率特别高(高达70%),我怀疑在我测试的机型上RenderScript部分的代码根本没运行到gpu上。而另外一台cpu占用率不高的呢,速度又不快,感觉就像cpu单核运行(我尼玛。。。)。 我也怀疑过自己写的代码比较坑,然后我就试了官方提供的RS Blur API,代码如下:

public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) {
    //Create renderscript
    RenderScript rs = RenderScript.create(context);

    //Create allocation from Bitmap
    Allocation allocation = Allocation.createFromBitmap(rs, bitmap);

    Type t = allocation.getType();

    //Create allocation with the same type
    Allocation blurredAllocation = Allocation.createTyped(rs, t);

    //Create script
    ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    //Set blur radius (maximum 25.0)
    blurScript.setRadius(radius);
    //Set input for script
    blurScript.setInput(allocation);
    //Call script for output allocation
    //for(int i = 0; i < 10; i++)
        blurScript.forEach(blurredAllocation);

    //Copy script result into bitmap
    blurredAllocation.copyTo(bitmap);

    //Destroy everything to free memory
    allocation.destroy();
    blurredAllocation.destroy();
    blurScript.destroy();
    t.destroy();

    return bitmap;
}

然后发现结果也是类似的。所以我的猜测是,RS只在Nexus那几款手机上实现了GPU并行,其他不支持的手机都是CPU并行。但是好像网上的说法又不是这样。。。

我在StackOverflow上发现你提了类似的问题,后来你说你确认在GPU Workloads看到了运行在GPU的痕迹,我想知道你是怎么确认的?

我的QQ是 18147①45,如果你不介意,我们可以加QQ探讨一下

PKUEcho commented 7 years ago

据我所知,userspace层的GPU驱动,包括OpenGL ES和RenderScript是各个厂商自己写的,因此确实可能只在Nexus上会schedule到GPU上。 我当时是试了AOSP自带的代码: https://android.googlesource.com/platform/frameworks/rs/+/master/java/tests/ImageProcessing。发现其中有部分图片处理的RS程序是跑在GPU上的(记得有个叫level vec3 relexed是在GPU上的)。 至于如何检测,我记得我当时是把上面这个代码改了一下,可以放在后台多线程密集运行,然后看看是不是会卡到前台的应用。 以上大概就是我做过的东西了,我只是想制造一些GPU的workloads,所以并没有怎么研究RS这个东西,感觉都没人用。

在 2016年12月10日 下午1:39,jay2002 notifications@github.com写道:

好的,谢谢! 我测了3款手机,Samsung s4、oppo r7、oppo r9,均是Android5.0+或5.1+的, 按stackoverflow上rs开发者的说法,gpu应该是rs已经适配了(除非驱动没更新……)。 现在的情况是这样,我for循环只运行RenderScript的部分,这三台机器中有两台cpu占用率特别高(高达70%), 我怀疑在我测试的机型上RenderScript部分的代码根本没运行到gpu上。而另外一台cpu占用率不高的呢, 速度又不快,感觉就像cpu单核运行(我尼玛。。。)。 我也怀疑过自己写的代码比较坑,然后我就试了官方提供的RS Blur API,代码如下:

public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) { //Create renderscript RenderScript rs = RenderScript.create(context);

//Create allocation from Bitmap
Allocation allocation = Allocation.createFromBitmap(rs, bitmap);

Type t = allocation.getType();

//Create allocation with the same type
Allocation blurredAllocation = Allocation.createTyped(rs, t);

//Create script
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
//Set blur radius (maximum 25.0)
blurScript.setRadius(radius);
//Set input for script
blurScript.setInput(allocation);
//Call script for output allocation
//for(int i = 0; i < 10; i++)
    blurScript.forEach(blurredAllocation);

//Copy script result into bitmap
blurredAllocation.copyTo(bitmap);

//Destroy everything to free memory
allocation.destroy();
blurredAllocation.destroy();
blurScript.destroy();
t.destroy();

return bitmap;

}

然后发现结果也是类似的。所以我的猜测是,RS只在Nexus那几款手机上实现了GPU并行,其他不支持的手机都是CPU并行。 但是好像网上的说法又不是这样。。。

我在StackOverflow上发现你提了类似的问题,后来你说你确认在GPU Workloads看到了运行在GPU的痕迹,我想知道你是怎么确认的?

我的QQ是 18147①45,如果你不介意,我们可以加QQ探讨一下

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/PKUEcho/AndroidOS/issues/1#issuecomment-266181154, or mute the thread https://github.com/notifications/unsubscribe-auth/AGpItgb0FyjFry2G27wEg32B06TcLB1Aks5rGjsigaJpZM4LIn55 .

jay2002 commented 7 years ago

好的,谢谢~ 我在android studio下开了gpu monitor,但是感觉这个只监控了绘制相关的opengl操作。。。 我现在也没辙了,找机会拿台nexus机器测试,得到结论就算结了吧。。。 感觉RS真的能普遍地放到手机GPU上算的话,还是比较前景的,这个需求感觉挺大。不过感觉目前g做的还是不够完善,而且接口开放的不够完整。估计6或7以后会慢慢变好吧