2017-01-08 23 views
0

Из моих исследований я обнаружил, что невозможно выделить память изнутри RenderScript. Например, int* values = new int[10]; не разрешен в C99. Я бы хотел, чтобы этот массив был локальным только обрабатываемым текущим пикселем, что такое динамическое распределение гарантировало бы, если оно объявлено и инстанцируется изнутри функции ядра.Как объявить локальный/частный массив в RenderScript?

Я знаю, что 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, который может касаться только обрабатываемого текущего пикселя? Если это невозможно, как я могу имитировать локальный массив, требующий задания только с однозначными переменными?


Update

int values3[256]; выше действительно локальными для текущего потока. Оказывается, он может содержать значения мусора, которые мы не хотим. Я предположил, что значение по каждому индексу равно 0 по умолчанию. Некоторые из них, некоторые - нет. Вот почему я подумал, что все остальные темы писали ему. Я намеревался, чтобы вышесказанное было подсчетом, поэтому я не всегда начинал с 0, как ожидалось. Вот почему мои расчеты были отключены!

ответ

1

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

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

+0

Надеюсь, вы правы. Моя отладка, похоже, собрала информацию из других потоков. Я отправлю больше кода и результатов позже. –

 Смежные вопросы

  • Нет связанных вопросов^_^