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