首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步RenderScript

异步RenderScript
EN

Stack Overflow用户
提问于 2015-10-31 17:15:59
回答 1查看 168关注 0票数 0

我并不真正理解RenderScript的异步行为。这里有几个例子:

代码语言:javascript
复制
uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
  ...
}

代码语言:javascript
复制
void root(const uchar4 *v_in, uchar4 *v_out) {
  ...
}

我不知道在foreach_root()中使用哪一个。甚至,从调用返回后,结果也会同步出现。然而,文档中到处都提到了异步功能...

对于内核的并行性,应该如何正确使用它?

EN

回答 1

Stack Overflow用户

发布于 2017-04-22 07:15:28

您的第一个内核示例需要一个uchar4返回值:

代码语言:javascript
复制
uchar4 u4;
u4 = (uchar4){x,y,x+y,x-y};  // using the x,y from kernel, for example
return u4;

你的第二个内核示例将结果直接放在*v_out指针的位置(*表示指针)。

代码语言:javascript
复制
uchar4 u4: 
...
*v_out = u4;

有什么不同?没什么,只要你的内核结果是一个renderscript原语(uchar4,float2,int,double3 ...)可以被“退还”。这在大多数情况下都是如此。

你是对的:只要内核正在运行(并用数据填充输出分配),实际的线程就会在下一次使用输出分配时被阻塞。考虑一下这个简单的基准测试

代码语言:javascript
复制
long t1 = System.nanoTime();
myScript.forEach_root(.....    // triggers (starts) the script parallel / asynchron
long t2 = System.nanoTime();
// HERE is the blocking !
aOut.copyTo(bitmap);           // aOut : Allocation object
long t3 = System.nanoTime();

t1获取启动时间,然后脚本被触发(异步、并行)。在“触发器”t2被获取后立即执行。异步运行的脚本尚未完成。t2只会比t1稍大一点(几纳秒)。

然后,输出分配被用来将它的数据复制到位图。。在执行之前,这一行将阻塞代码,直到所有内核都完成。最后,t3标志着它的终结。

整个计算时间(脚本+ aOut.copyTo..)是t3-t1,而不是 t2-t1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33449930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档