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