Я выполнил простой параллельный алгоритм, нарисовав набор mandelbrot для тестирования параллельных вычислений на Nexus 7 (ядра Tegra 3, 4 + 1). После запуска несколько раз я получаю 1,5 секунды для последовательного и 1,0 для параллельных, но параллельные и последовательные приходят очень близко друг к другу на 1,3 секунды.Многоядерный Android
Квадрат 700x700 пикселей, а код Мандельброта я использую из
http://rosettacode.org/wiki/Mandelbrot_set#Java
Параллельная реализация проходит две половинки Мандельброта, как это
public void mandelbrotParallel() {
Thread t1 = new Thread(new Runnable() {
public void run() {
mandelbrotOne();
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
mandelbrotTwo();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mHandler.post(new Runnable() {
public void run() {
v.setBmp(bmp);
v.invalidate();
}
});
}
Я запустить простой вектор дополнение до и нашел похожие анекдотические результаты (без научной строгости). Поэтому мне интересно, есть ли что-то особенное, чтобы заставить Android запускать несколько ядер, чтобы выполнить задание.
Основываясь на быстрых разговорах с Google, возможно, что ядра неактивны и ждут, что вычисление будет действительно длительным (несколько секунд) до включения сердечников ... Это правда? Если да, существуют ли API-вызовы от Java (нет JNI), которые можно выполнить для предварительного пробуждения ядер?
Некоторое время назад я бросил http://bigflake.com/cpu-spinner.c.txt вместе, как способ оценки того или не будить сердечники up когда внизу груз. Вообще говоря, ядра замедляются или отключаются, чтобы сохранить время автономной работы, и только «развернуться», когда ядро обнаруживает многоядерную нагрузку. Задержка отжима зависит от устройства. Для справки, на моем Nexus 4 тест закончился в ~ 1700 мс с 1 нитью и ~ 1800 мс с 4 потоками, что указывает на то, что все ядра были использованы вскоре после начала теста. – fadden