Android 多核安卓

Android 多核安卓,android,multicore,Android,Multicore,我已经运行了简单的并行算法来绘制mandelbrot集,以测试Nexus7(Tegra3,4+1内核)上的并行计算。在运行了几次之后,我得到了1.5秒的串行和1.0秒的并行,但是并行和串行在1.3秒的时候非常接近 正方形是700x700像素,我使用的mandelbrot代码来自 并行实现像这样运行mandelbrot的两部分 public void mandelbrotParallel() { Thread t1 = new Thread(new Runnable() {

我已经运行了简单的并行算法来绘制mandelbrot集,以测试Nexus7(Tegra3,4+1内核)上的并行计算。在运行了几次之后,我得到了1.5秒的串行和1.0秒的并行,但是并行和串行在1.3秒的时候非常接近

正方形是700x700像素,我使用的mandelbrot代码来自

并行实现像这样运行mandelbrot的两部分

    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();
        }
    });
}
我以前运行过一个简单的向量加法,发现了类似的轶事结果(没有科学严谨性)。所以我想知道,要让Android启动多个内核来完成一项任务,是否需要做什么特别的事情


根据与谷歌的快速对话,可能是内核处于休眠状态,等待计算真正长时间运行(几秒钟),然后再打开内核。。。这是真的吗?如果是这样的话,是否有来自Java(没有JNI)的API调用可以用来抢先唤醒内核?

这听起来像是一个很好的选择。简而言之,它允许您利用所有可用的加速资源(多核、GPU计算、dsp等)执行计算成本高昂的操作。从文档中:

Renderscript使您的应用程序能够使用 跨所有可用处理器内核的自动并行化。信息技术 还支持不同类型的处理器,如CPU、GPU或 数字信号处理器。Renderscript对于执行图像处理的应用程序非常有用, 数学建模,或任何需要大量 数学计算

你必须用C重写你的Mandelbrot代码,但你不必把它分解成碎片,因为并行化将为你解决


使用Android代码中的RenderScript非常简单。

A正常的Android系统试图保持保守。因此,如果您创建一个新线程并开始一些繁重的计算,Linux内核将首先在一个内核上运行并提高其内核速度。一旦内核在某个阈值上“忙碌”了一段时间,内核才会启动另一个内核

在另一个方面也是如此:一旦系统平静下来,它将慢慢关闭内核并降低频率

从开发者的角度来看,你不能在“正常”的Android上影响这一点。Android没有API来唤醒一定数量的内核或设置一定的内核频率


如果你可以切换到一个有根的Android,你有更多的选择,因为普通的Linux内核确实有影响核心频率和活动核心数量的选项。 这是通过“管理者”完成的。普通的Linux内核有很多选择。对于这个问题,您感兴趣的是设置性能调控器,它将保持核心处于唤醒状态并保持其最高频率

Linux内核接口位于/sys文件系统中。我将在这里展示adb shell命令,并将其转换为Java开放、读写命令

cd /sys/devices/system/cpu
在此目录中,您将找到指示系统中存在多少内核的虚拟文件:

cat possible
在您的Tegra 3案例中,应该给出0-3的答案。内核不知道如果只有一个内核在运行,它会秘密地转移到备用的低功耗内核。 还有目录cpu0 cpu1 cpu2 cpu3。根据内核版本的不同,它们可能仅在内核被激活时出现。 每个cpu目录都包含一个目录cpufreq,您可以在其中与进行交互。它应该包含一个显示哪些可用的文件。 只有在根系统上,才能执行以下操作:

echo "performance" >cpu0/cpufreq/scaling_governor
设置调速器,使堆芯以最高频率运行。在非根系统上,将出现错误“权限被拒绝”


要显示此行为的影响,请选择Vector Fabrics 创建了一个测试应用程序,该应用程序在上执行修复算法 并行OpenCV。应用程序测量顺序和顺序 高达4核的并行性能。即使在运行并行程序时 版本两次,测量值因启动堆芯而不同。 自己看看(从应用商店下载):

(我是RS工程师之一)看看AOSP——frameworks/base/graphics/RenderScriptTests/ImageProcessing包含我编写的Mandelbrot实现。应该给你一个好主意,从哪里开始。不久前,我把它作为一种评估内核在负载下是否会唤醒的方法。一般来说,内核会被减慢或禁用以保持电池寿命,并且只有在内核检测到多核负载时才会“启动”。自旋上升延迟因设备而异。作为参考,在我的Nexus 4上,测试在约1700ms(1个线程)和约1800ms(4个线程)内完成,表明测试开始后不久所有内核都在使用中。