从我的研究中,我发现无法从RenderScript内部分配内存。例如,C99中不允许int* values = new int[10];
。我希望这个数组只对正在处理的当前像素 local ,这样的动态分配可以保证它是否从内核函数内部声明和实例化。
我知道int values[10];
是一个有效的声明。如果我把它放在RenderScript的开头,那么它就变成了一个全局数组,我们可以从Java代码中设置它(使用Allocation
)。
我尝试将int values[10];
放入内核中,我认为这是当前像素的本地内容。我知道声明一个单值变量(如uint32_t,float4等)肯定是当前像素的本地变量。但是,在内核中声明的数组仍然是一个全局变量 - 所有其他像素都可以读取和写入它。
uchar4 RS_KERNEL mykernel(uchar4 in, uint32_t x, uint32_t y){
int* values = (int*)malloc(sizeof(int)*256); // illegal
int* values2 = new int[256]; // illegal
int values3[256]; // legal, but it's global. I want a local array
}
如果您想知道,我想从当前像素(x,y)访问相邻像素。我已经能够做到这一点。但是,我需要将一些像素信息(比如每个相邻像素的颜色分量中的一个)存储在一个数组中,因为我可能需要挑选出最常出现的颜色成分,一旦该数组被排序就会产生确切的中间成分,等等所以,我试图拉模式和中值滤波器,甚至是油画效果 - 所有这些都需要我将相邻像素数据存储在本地数组中。
那么,我们如何在RenderScript中声明一个本地/私有数组,只有正在处理的当前像素才能触及?如果那是不可能的,我如何使用单值变量模拟需要任务的本地数组?
更新
上面的int values3[256];
确实是当前线程的本地。事实证明它可能包含我们不想要的垃圾值。我假设每个索引的值默认为0。有些是,有些则不是。这就是为什么我认为所有其他线程都在写它。我打算将上面的内容记录下来,所以我并不总是按照预期从0开始。这就是为什么我的计算结束了!
答案 0 :(得分:1)
但是,在内核中声明的数组仍然是一个全局变量 - 所有其他像素都可以读取和写入它。
不,这不正确。在您的示例中,values3是正确的,它将是每个线程的本地。