2015-06-04 2 views
0

РезюмеПроблемы с копированием обработки данных обратно в 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(); 

ответ

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