5

我运行了简单的并行算法,绘制了 mandelbrot 集来测试 Nexus 7(Tegra 3、4+1 内核)上的并行计算。运行几次后,串行时间为 1.5 秒,并行时间为 1.0 秒,但并行和串行在 1.3 秒时非常接近。

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

http://rosettacode.org/wiki/Mandelbrot_set#Java

并行实现像这样运行两半 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 启动多个内核来完成任务。

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

4

2 回答 2

2

这听起来像是RenderScript的候选者。简而言之,它允许您利用所有可用的加速资源(多核、GPU 计算、dsp 等)进行计算量大的操作。从文档:

Renderscript 使您的应用程序能够通过所有可用处理器内核的自动并行化运行操作。它还支持不同类型的处理器,例如 CPU、GPU 或 DSP。Renderscript 对于执行图像处理、数学建模或任何需要大量数学计算的操作的应用程序很有用。

您必须用 C 重写您的 Mandelbrot 代码,但您不必将其分解为多个部分,因为会为您处理并行化。

从 Android 代码中使用 RenderScript 很简单,如此所述。

于 2013-04-08T07:53:41.453 回答
2

一个普通的安卓系统会尽量保守。因此,如果您创建一个新线程并开始一些繁重的计算,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,您可以在其中与cpufreq 子系统进行交互。它应该包含一个文件 scaling_available_governors,显示哪些cpu调控器可用。仅在有根系统上,您可以执行以下操作:

echo "performance" >cpu0/cpufreq/scaling_governor

设置将保持核心以最高频率运行的调控器。在非根系统上,您将收到错误“权限被拒绝”。


为了展示这种行为的影响,Vector Fabrics 创建了一个测试应用程序,该应用程序在 OpenCV 上并行执行修复算法。该应用程序可测量多达 4 个内核的顺序和并行性能。即使在运行并行版本两次时,由于启动内核,测量值也会有所不同。自己看看(从应用商店下载): http ://www.vectorfabrics.com/products/case-study/opencv_inpaint

于 2013-05-08T10:05:10.113 回答