Android上的多重处理
我一直在Android上执行一些测试,以验证算法(如FFT)的性能如果能够并行化,可以提高性能。 我通过使用带有JNI(FFTW)和Java线程(来自JTransforms)的pthread来实现算法。 通过使用预期的线程来获得更好的性能,而不是使用串行算法获得更好的结果。 我不清楚为什么自从我在多核设备上执行这些测试后,我得到了这些结果。 看起来,Android系统使用的调度算法与Linux使用的调度算法有点不同,如果您想要使用多个CPU在Android上执行多重处理,您的运气不好。
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 /算法/ FFTW / FFTW.java。
测试中调用的方法是'执行'。
纯Java示例:https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/jtransforms/fft/DoubleFFT_1D2TAlgorithm.java
这里调用的方法是'执行'。
'execute'和'perform'在另一个线程中被调用。
如果您的程序有多个CPU密集型线程持续运行一段时间,则内核会将线程转移到单独的核心。 否则,内核的动机有两件事:
Android尽可能关闭内核,并且只在CPU需求需要时启用内核。 每个设备的“持续时间”究竟构成什么。
我将两位示例代码放在一起,用于演示多个正在使用的内核(C版,Java版)。
使用拥有systrace支持的rooted设备,您实际上可以以图形方式查看每个内核上运行的线程。
更新:我认为这可能有助于举一个例子,所以我将我的MultiCore.java测试包装在示例应用程序中,并在systrace下的4.3 Nexus 4上运行它。 我创建了一个解释结果的页面。
链接地址: http://www.djcxy.com/p/14911.html