我真的不了解RenderScript的异步行为。有几个例子:
uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) {
...
}
或
void root(const uchar4 *v_in, uchar4 *v_out) {
...
}
我不知道与foreach_root()
使用哪个。甚至,在从调用返回后,结果同步存在。但是,文档提到异步功能无处不在......
如何正确使用内核的并行性?
答案 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。