2013-07-24 4 views
7

Ich habe einige Tests auf Android durchgeführt, um zu überprüfen, wie gut die Leistung eines Algorithmus (wie FFT) verbessert werden kann, wenn es parallelisiert wird. Ich habe die Algorithmen mit pthread mit JNI (FFTW) und Java-Threads (von JTransforms) implementiert. Anstatt eine bessere Leistung zu erzielen, indem Threads wie erwartet verwendet werden, habe ich bessere Ergebnisse mit dem seriellen Algorithmus. Es ist mir unklar, warum ich diese Ergebnisse erhalten habe, seit ich diese Tests an Multicore-Geräten durchgeführt habe. Es scheint, dass der Zeitplanungsalgorithmus, der vom Android-System verwendet wird, sich von dem von Linux verwendeten unterscheidet, und Sie haben kein Glück, wenn Sie mehr als eine CPU für die Multiprozessorverarbeitung auf Android verwenden möchten.Multiprocessing auf Android

Beispiel mit FFTW: Der JNI-Code ist in https://github.com/maxrosan/DspBenchmarking/blob/master/jni/fftw_jni.c und seine Schnittstelle ist https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/fftw/FFTW.java.

Die in Tests aufgerufene Methode ist 'Ausführen'.

Beispiel mit reinem Java: https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/jtransforms/fft/DoubleFFT_1D2TAlgorithm.java

Hier die Methode 'ausführen' genannt wird.

'execute' und 'perform' werden in einem anderen Thread aufgerufen.

+0

Verwenden Sie ThreadPoolExecutor oder AsyncTask mit executeOnExecutor. –

+2

Ich bin mir nicht sicher über Ihren letzten Satz, welche Art von Tests haben Sie versucht? Kannst du uns etwas Code zeigen? – Desert

+0

Oh, Sie benutzen C++ Multithreading. Ich schlage vor, Sie versuchen, Java Multithreading oder konsultieren Sie mit Menschen, die C++ gut, nur um zu überprüfen, ob alles in Ordnung ist. – Desert

Antwort

3

Wenn Ihr Programm über mehrere CPU-intensive Threads verfügt, die für einen längeren Zeitraum ausgeführt werden, verschiebt der Kernel die Threads in separate Kerne. Ansonsten ist der Kernel durch zwei Dinge motiviert:

  • Das Verschieben eines Threads zwischen Kernen ist teuer (leistungsmäßig).
  • Das Einschalten eines Kerns ist teuer (batteriebetrieben).
  • Android schaltet die Cores nach Möglichkeit aus und aktiviert sie nur, wenn die CPU-Anforderungen dies erfordern. Was genau eine "Dauer" ausmacht, ist von Gerät zu Gerät unterschiedlich.

    Ich habe zwei Bits Beispielcode zusammengestellt, die mehrere verwendete Kerne demonstrieren (C version, Java version).

    Mit einem gerooteten Gerät, das systrace unterstützt, können Sie grafisch sehen, welcher Thread auf jedem Kern ausgeführt wird.

    Update: Ich dachte, es könnte ein Beispiel haben, zu helfen, so dass ich schlang meinen MultiCore.java Test in einer Probe App und lief es auf einen 4,3 Nexus 4 unter systrace. Ich habe eine Seite erstellt, die explains the results.

    +0

    @ user12707 können Sie einige Tests mit Systrace machen und uns zeigen, was du erhältst? –

    +0

    Ich dachte, es könnte helfen, wenn ich einige Tests mit Systrace gemacht und die Ergebnisse zuerst gezeigt habe. Antwort aktualisiert – fadden