0

根据我的研究,我发现无法从 RenderScript 内部分配内存。例如,int* values = new int[10];在 C99 中是不允许的。我希望这个数组只对正在处理的当前像素是本地的,这样的动态分配将保证它是否是从内核函数内部声明和实例化的。

我知道这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 开始。这就是为什么我的计算是错误的!

4

1 回答 1

1

然而,在内核中声明的数组仍然是一个全局变量——所有其他像素都可以读取和写入它。

不,这是不正确的。在您的示例中 values3 是正确的,它将是每个线程的本地。

于 2017-01-09T01:23:23.577 回答