Как правильно настроить синхронизацию кода Android RenderScript на Nvidia Shield

Я реализовал небольшую CNN в RenderScript и хочу профилировать производительность на другом оборудовании. На моем Nexus 7 времена имеют смысл, а на NVIDIA Shield их нет.

CNN (LeNet) реализован в 9 слоях, находящихся в очереди, вычисления выполняются последовательно. Каждый слой рассчитан индивидуально.

Вот пример:

       conv1  pool1 conv2  pool2 resh1 ip1    relu1  ip2    softmax
nexus7 11.177 7.813 13.357 8.367 8.097 2.1    0.326  1.557  2.667
shield 13.219 1.024 1.567  1.081 0.988 14.588 13.323 14.318 40.347

Распределение времен примерно подходит для связи, причем conv1 и conv2 (слои свертки) занимают большую часть времени. Но на щите времена выходят за рамки разумного для слоев 2-4 и, кажется, приближаются к концу. Слой softmax - это относительно небольшая работа, поэтому 40 мс слишком велики. Мой метод синхронизации должен быть неисправен, или что-то еще происходит.

Код для запуска слоев выглядит примерно так:

double[] times = new double[layers.size()];
int layerindex = 0;
for (Layer a : layers) {

    double t = SystemClock.elapsedRealtime(); 
    //long t = System.currentTimeMillis(); // makes no difference

    blob = a.forward(blob); // here we call renderscript forEach_(), invoke_() etc

    //mRS.finish(); // makes no difference

    t = SystemClock.elapsedRealtime() - t; 
    //t = System.currentTimeMillis() - t; // makes no difference

    times[layerindex] += t; // later we take average etc

    layerindex++;
}

Насколько я понимаю, как только forEach_ () вернется, работа должна быть завершена. В любом случае, mRS.finish () должен обеспечить окончательный барьер. Но, глядя на времена, единственное разумное объяснение состоит в том, что задания все еще обрабатываются в фоновом режиме.

Приложение очень простое, я просто запускаю тест из MainActivity и печатаю в logcat. Android Studio создает приложение в виде релиза и запускает его на устройстве, подключенном через USB.

(1) Как правильно определять время процессов RenderScript? (2) Верно ли, что при возврате forEach_ () потоки, созданные скриптом, гарантированно будут завершены? (3) В моем тестовом приложении я просто запускаю прямо из MainActivity. Является ли это проблемой (кроме блокировки потока пользовательского интерфейса и отключения приложения)? Если это влияет на время или вызывает странность, как правильно настроить тестовое приложение, подобное этому?

Ответы на вопрос(2)

Ваш ответ на вопрос