Android上的多处理

use*_*707 7 c java java-native-interface multithreading android

我一直在Android上执行一些测试,以验证算法(如FFT)在并行化时的性能有多好.我已经使用pthread与JNI(FFTW)和Java线程(来自JTransforms)实现了算法.通过使用预期的线程获得更好的性能,我使用串行算法得到了更好的结果.我不清楚为什么我在多核设备上执行这些测试后得到了这些结果.似乎Android系统使用的调度算法与Linux使用的调度算法有所不同,如果您想在Android上使用多个CPU进行多处理,那么您运气不佳.

使用FFTW的示例:JNI代码位于https://github.com/maxrosan/DspBenchmarking/blob/master/jni/fftw_jni.c,其接口为https://github.com/maxrosan/DspBenchmarking/blob/master/ src/br/usp/ime/dspbenchmarking/algorithms/fftw/FFTW.java.

测试中调用的方法是'execute'.

纯Java示例:https: //github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/jtransforms/fft/DoubleFFT_1D2TAlgorithm.java

这里调用的方法是'perform'.

'execute'和'perform'在另一个线程内调用.

fad*_*den 3

如果您的程序有多个 CPU 密集型线程持续运行,内核会将线程转移到单独的内核。否则,内核是由两件事驱动的:

  • 在内核之间转移线程的成本很高(就性能而言)。
  • 打开核心是昂贵的(电池方面)。

Android 会在可能的情况下关闭内核,并且仅在 CPU 需求需要时才启用它们。“持续时间”的具体构成因设备而异。

我将两段示例代码放在一起,演示了多核的使用(C 版本Java 版本)。

使用具有systrace支持的 root 设备,您实际上可以以图形方式查看每个内核上正在运行的线程。

更新: 我认为提供一个示例可能会有所帮助,因此我将 MultiCore.java 测试包装在示例应用程序中,并在 systrace 下的 4.3 Nexus 4 上运行它。我创建了一个页面来解释结果