'da Android RenderScript kodunun doğru zamanlaması nasıl yapılır RenderScript'te küçük bir CNN uyguladı ve farklı donanımlardaki performansı izlemek istiyorum. Nexus 7 cihazımda zamanlar anlamlı geliyor, ancak NVIDIA Kalkanı üzerinde değiller.Nvidia Shield
CNN (LeNet) bir sırada yer alan 9 katmanda uygulanır, hesaplama sırayla gerçekleştirilir. Her katman ayrı ayrı zamanlanır.
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
kez dağıtım conv1 ve conv2 (konvolüsyon tabakaları) ile bağ için sağ ilgili olan çoğu zaman yapılmıştır: Burada
bir örnektir. Ancak kalkanın üzerindeki zamanlar, 2-4 katmanları için makul olanın ötesine geçiyor ve sonuna doğru toplanıyor gibi görünüyor. Softmax tabakası nispeten küçük bir iştir, bu yüzden 40ms çok büyüktür. Zamanlama yöntemim hatalı olmalı veya başka bir şey devam etmeli.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++;
}
Bir zamanlar forEach_() döndüğünde, iş bitmiş olması gerekiyordu benim anlayış: katmanlarını çalışan
kod şöyle görünür. Her durumda, mRS.finish() son bir engel sağlamalıdır. Ama zamanlara bakıldığında, tek mantıklı açıklama, işlerin arka planda hala işlenmesidir.
Uygulama çok basit, sadece MainActivity'den testi çalıştırıyorum ve logcat'e yazdırıyorum. Android Studio, uygulamayı bir sürüm olarak oluşturur ve USB ile bağlanan cihazda çalıştırır.
(1) RenderScript işlemlerinin doğru yolu nedir? (2) forEach_() öğesi döndüğünde, betik tarafından oluşturulan konuların yapılmasının garanti edildiği doğru mu? (3) Test uygulamamda, doğrudan MainActivity'den çalışıyorum. Bu bir sorun mu (UI iş parçacığının engellenmesi ve uygulamanın yanıt vermemesi dışında)? Bu zamanlamayı etkiliyorsa veya garipliğe neden oluyorsa, böyle bir test uygulaması oluşturmak için uygun bir yol nedir?
CNN açılımı Ve kolay kullanmaktır? –
Konvolüstal Sinir Ağı. – frankhond