РезюмеПроблемы с копированием обработки данных обратно в Java из Renderscript
Я передаю структуру, содержащую постоянный массив размера поплавка к Renderscript функции Foreach. Моя проблема вернула данные на Java.
фон
Я работаю по оптимизации алгоритма обработки изображений с использованием Renderscript. FAE для производителя платы утверждает, что OpenCL не поддерживается на нашем оборудовании и что Google «не особо заботится» о OpenCL. У SOM, который мы используем, есть GPGPU Vivante GC2000, и есть поддержка OpenCL в соответствии с документацией по оборудованию. Все, что не выдерживало, RenderScript стало технологией, которую мы решили.
Описание проблемы
Для проверки настройки Renderscript для приложения, я создал 100x100 массив поплавка с данными постоянными испытаниями. Кажется, что данные попадают на уровень Renderscript, потому что я могу распечатать результаты с помощью rsDebug, и они соответствуют ожидаемым значениям. После выполнения фильтрации по массиву я вижу, что массив был изменен. Однако, когда я передаю массив обратно на Java (см. Источник ниже), я не вижу изменений.
Что я Пробовал
С начала этого проекта, я попробовал множество подходов, которые не кажется, чтобы получить тягу.
Сначала я реализовал часть renderscript в C++. Я переключился на Java, потому что я не мог заставить класс C++ правильно отражать, а документация для использования NDK и renderscript вместе еще более разрежена, чем Java API. Я предположил, что это ошибка в компиляторе llvm rs, потому что он терпит неудачу, когда пытается создать заголовок класса. Он генерирует файл с одним «/», и он, похоже, терпит неудачу, когда пытается вставить атрибут в верхней части.
Я также попробовал библиотеку поддержки с теми же результатами; выходные данные не заполняются.
Я попытался скопировать данные из привязанного указателя на примитивы и структуру строки/столбца. Я также попытался использовать rsElementSetAt/rsElementGetAt и все еще ничего.
Я попытался использовать старшую для Each signatue: void root (...) вместо версии атрибута. Я все еще не смог получить обработанные данные. Я также пробовал различные способы фактического вызова функции forEach путем установки глобального сценария и глобальных распределений для ввода/вывода и вызова функции, которая вызывает rsForEach.
Я попытался скопировать данные в виде различных примитивов, но исключение вызывается из-за несогласованных значений типа (для распределения, содержащего структуры DataUnit, тип NONE).
Актуальна
Основываясь на этой информации, может кто-нибудь сказать, если я делаю что-то/не делать что-то правильно? Кажется, он должен работать, но мне не повезло с этим. Если у кого-то есть представление об этом, я бы очень признателен за это. Благодаря!
testcript.RS
typedef struct DataUnit {
float rows[100];
float cols[100];
} DataUnit_t;
DataUnit_t __attribute__((kernel)) oldtest(DataUnit_t v_in, uint32_t x, uint32_t y)
{
DataUnit_t tmpd;
for(int i = 0; i < 100; i++) {
float a = -1, b = -1, c = -1;
switch(i) {
case 0:
a = 0;
b = v_in.cols[i];
c = v_in.cols[i+1];
break;
case 99:
a = v_in.cols[i-1];
b = v_in.cols[i];
c = 0;
break;
default:
a = v_in.cols[i-1];
b = v_in.cols[i];
c = v_in.cols[i+1];
break;
}
tmpd.cols[i] = 11.3f;
//v_out.cols[i] = (float)(((a/4.0f)+(b/2.0f)+(c/4.0f))/3);
}
// From using the old kernel signature (root)
//*v_out = tmpd;
return tmpd;
}
Инициализация в Java
ScriptField_DataUnit dataOut = new ScriptField_DataUnit(mRS, 100);
ScriptField_DataUnit dataIn = new ScriptField_DataUnit(mRS, 100);
for(int i = 0; i < mWidth; i++) {
ScriptField_DataUnit.Item item = new ScriptField_DataUnit.Item();
for(int j = 0; j < item.rows.length; j++) {
// Set the positions of the columns and rows
item.rows[j] = (float)mBufIn[(i*mWidth)+j];
item.cols[j] = (float)mBufIn[(j*mHeight)+i];
}
dataIn.set(item, i, false);
// Not sure about setting dataOut items. If this isn't done,
// the members holding the actual data are null but it's unclear if this is the way to do it
dataOut.set(new ScriptField_DataUnit.Item(), i, false);
}
dataIn.copyAll();
dataOut.copyAll();