Как объявить локальный/приватный массив в RenderScript?

Из моих исследований я обнаружил, что невозможно выделить память внутри 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, как ожидалось. Вот почему мои расчеты были ошибочными!


person Mickael Caruso    schedule 08.01.2017    source источник


Ответы (1)


Однако массив, объявленный внутри ядра, по-прежнему является глобальной переменной — все остальные пиксели могут читать и писать в него.

Нет, это неправильно. В вашем примере значения3 верны, и они будут локальными для каждого потока.

person sakridge    schedule 09.01.2017
comment
Надеюсь, ты прав. Мои отладки, похоже, собрали информацию из других потоков. Я опубликую больше кода и результатов позже. - person Mickael Caruso; 09.01.2017