Я реализовал CNN в RenderScript, описанном в previous question, который породил этот. В основном, при работеRenderScript speedup 10x при форсировании реализации ЦП по умолчанию
adb shell setprop debug.rs.default-CPU-driver 1
существует 10x убыстрение как на Nvidia Shield и Nexus 7. Среднее время вычисления идет от около 50мс 5мс, тест приложение идет от около 50fps до 130 или более. Существует два алгоритма свертки:
(1) движущееся ядро
(2) im2col и GEMM из RenderScriptIntrinsicsBLAS.
Оба опыта аналогичного ускорения. Вопрос в том, почему это происходит и может ли этот эффект быть создан из кода предсказуемым образом? И подробная информация об этом доступна где-то?
Edit:
В соответствии с предложениями ниже, я проверил использование отделки() и CopyTo(), вот разбивка процедуры. Сообщение об ускоренном состоянии происходит после вызова copyTo(), но без финиша(). Uncommenting finish() добавляет около 1 мс к времени.
double forwardTime = 0;
long t = System.currentTimeMillis();
//double t = SystemClock.elapsedRealtime(); // makes no difference
for (Layer a : layers) {
blob = a.forward(blob);
}
mRS.finish(); // adds about 1ms to measured time
blob.copyTo(outbuf);
forwardTime = System.currentTimeMillis() - t;
Может быть, это не имеет никакого отношения, но на NVIDIA Shield я получаю сообщение об ошибке при запуске, который исчезает при работе с ADB оболочки setprop debug.rs.default-CPU-водитель 1
E/Renderscript: rsAssert failed: 0, in vendor/nvidia/tegra/compute/rs/driver/nv/rsdNvBcc.cpp
I 'm устанавливает compileSdkVersion, minSdkVersion и targetSdkVersion до 23 прямо сейчас, с buildToolsVersion "23.0.2". Таблетки полностью адаптированы к самой последней версии Android. Не уверен в минимальной цели, которую мне нужно установить и у вас есть ScriptIntrinsicsBLAS.
Я использую #pragma rs_fp_relaxed во всех сценариях. В Allocations используются флаги по умолчанию.
This question имеет аналогичную ситуацию, но оказалось, что OP создает новые объекты Script каждый вычислительный раунд. Я ничего не делаю, все сценарии и распределения создаются во время init.
хммм, это довольно интересно. Shield Tablet и Nexus7 имеют совершенно разные аппаратные средства, но демонстрируют одинаковое поведение. Возможно, вы можете попробовать следующее, чтобы получить дополнительную информацию: 1. Вместо того, чтобы запускать его один раз и получать время, запустите вычисление за 1 или 10 и подсчитайте завершенные итерации, чтобы получить среднее время. 2. Не используйте rs_fp_relaxed и посмотрите, какая разница. 3. Разделите время как исходное сообщение, чтобы увидеть, какая часть больше всего затронута. –
Кроме того, для ScriptIntrinsicsBLAS, если вы используете платформу Renderscript (android.rderscript), то minSDK должно быть 23. Если вы используете поддержку библиотеки RenderScript (android.support.v8.renderscript), то minSdkVersion может быть как 8, так и targetSdkVersion должно быть 23+. Есть несколько настроек для поддержки lib BLAS в будущих buildtools 24.0.0, особенно для BNNM. Но, возможно, лучше иметь отдельный поток для истории поддержки lib и держать это в чистоте. –