Wielordzeniowy Android
Uruchomiłem prosty równoległy algorytm rysujący zestaw mandelbrota w celu przetestowania obliczeń równoległych na Nexusie 7 (rdzenie Tegra 3, 4 + 1). Po kilkukrotnym uruchomieniu otrzymuję 1,5 sekundy dla szeregowego i 1.0 dla równoległego, ale równoległe i szeregowe przychodzą bardzo blisko siebie po 1,3 sekundy.
Kwadrat wynosi 700x700 pikseli, a kod mandelbrota, którego używam, pochodzi z
http://rosettacode.org/wiki/Mandelbrot_set#Java
Równoległa realizacja prowadzi dwie połówki mandelbrota w ten sposób
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();
}
});
}
Przedtem uruchomiłem prosty dodatek wektorowy i znalazłem podobne niepotwierdzone wyniki (brak rygoru naukowego). Zastanawiam się więc, czy trzeba zrobić coś specjalnego, aby Android uruchomił wiele rdzeni, aby wykonać zadanie.
Na podstawie szybkich rozmów z Google może się zdarzyć, że rdzenie są uśpione i czekają, aż obliczenia będą naprawdę długie (wiele sekund), zanim rdzenie zostaną włączone ... Czy to prawda? Jeśli tak, czy są wywołania API z Java (bez JNI), które można zrobić, aby prewencyjnie obudzić rdzenie?