异步RenderScript

时间:2015-10-31 09:15:59

标签: asynchronous kernel renderscript

我真的不了解RenderScript的异步行为。有几个例子:

uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
  ...
}

void root(const uchar4 *v_in, uchar4 *v_out) {
  ...
}

我不知道与foreach_root()使用哪个。甚至,在从调用返回后,结果同步存在。但是,文档提到异步功能无处不在......

如何正确使用内核的并行性?

1 个答案:

答案 0 :(得分:0)

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

uchar4 u4;
u4 = (uchar4){x,y,x+y,x-y};  // using the x,y from kernel, for example
return u4;

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

uchar4 u4: 
...
*v_out = u4;

有什么区别?没有,只要你的内核结果是 一个renders脚原语(uchar4,float2,int,double3 ......),可以“返回”。这在大多数情况下都是如此。

你是对的:只要内核正在运行(并用数据填充分配),实际线程将在下一个点被阻止,将使用out分配。考虑这个简单的基准

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后的Immidiat。异步运行脚本尚未完成。 t2只会比t1(几纳秒)大得多。

然后 out分配用于将其数据复制到位图。 在此行之前,代码会阻塞,直到所有内核完成。 最后t3标志着结束。

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