Android multi-core
Eu executei um algoritmo paralelo simples desenhando o conjunto de mandelbrot para testar cálculos paralelos em um Nexus 7 (núcleos Tegra 3, 4 + 1). Depois de correr várias vezes, recebo 1,5 segundos para serial e 1,0 para paralela, mas paralelos e serial chegam muito perto um do outro em 1,3 segundo.
O quadrado é 700x700 pixels, e o código mandelbrot que eu uso é de
http://rosettacode.org/wiki/Mandelbrot_set#Java
A implementação paralela executa duas metades de mandelbrot como esta
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();
}
});
}
Eu executei uma adição vetorial simples antes e encontrei resultados anedóticos semelhantes (sem rigor científico). Então, eu me pergunto se há algo especial que uma pessoa precisa fazer para fazer o Android ativar vários núcleos para realizar uma tarefa.
Com base em conversas rápidas com o Google, pode ser que os núcleos estejam inativos e aguardem que a computação seja realmente longa (vários segundos) antes que os núcleos sejam ligados ... Isso é verdade? Em caso afirmativo, há chamadas de API do Java (sem JNI) que podem ser feitas para ativar antecipadamente os núcleos?