5

Nexus 7(Tegra 3、4 + 1コア)で並列計算をテストするために、マンデルブロセットを描画する単純な並列アルゴリズムを実行しました。数回実行した後、シリアルで 1.5 秒、パラレルで 1.0 秒を取得しましたが、パラレルとシリアルは 1.3 秒で非常に接近しています。

正方形は 700x700 ピクセルで、使用するマンデルブロ コードは

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

並列実装では、次のように 2 つの半分のマンデルブロが実行されます。

    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

通常のAndroidシステムは保守的になろうとします。そのため、新しいスレッドを作成して負荷の高い計算を開始すると、Linux カーネルはまず 1 つのコアで実行され、そのコア速度が向上します。コアが一定のしきい値を超えてしばらく「ビジー」になると、カーネルは別のコアを開始します。

同じことが他の方向にも当てはまります。システムが落ち着くと、ゆっくりとコアがオフになり、周波数が低下します。

開発者の観点からは、「通常の」Android ではこれに影響を与えることはできません。Android には、一定量のコアを起動したり、特定のコア周波数を設定したりするための API がありません。


通常の Linux カーネルには、コア周波数とアクティブなコアの数に影響を与えるオプションがあるため、ルート化された Android に切り替えることができれば、より多くのオプションがあります。これは「ガバナー」を通じて行われます。通常の Linux カーネルにはかなりの数のオプションがあります。この質問では、パフォーマンスガバナーの設定に関心があります。これにより、コアが起動し、最高の周波数が維持されます。

Linux カーネル インターフェイスは/sysファイル システムにあります。ここではadb シェルコマンドを示しますが、それを Java の open、read、write コマンドに変換するのはあなたに任せます。

cd /sys/devices/system/cpu

このディレクトリ内には、システムに存在するコアの数を示す仮想ファイルがあります。

cat possible

Tegra 3 の場合、0 ~ 3の答えが返ってくるはずです。カーネルは、コアが 1 つしか実行されていない場合、秘密裏に予備の低電力コアに移動することを知りません。ディレクトリcpu0 cpu1 cpu2 cpu3もあります。カーネルのバージョンによっては、コアがアクティブ化されている場合にのみ表示される場合があります。各 cpu ディレクトリには、 cpufreq サブシステムと対話できるディレクトリcpufreqが含まれています。どのcpu ガバナーが使用可能かを示すファイル scaling_available_governors が含まれている必要があります。ルート化されたシステムでのみ、次のことができます。

echo "performance" >cpu0/cpufreq/scaling_governor

コアを最高周波数で実行し続けるガバナーを設定します。root 化されていないシステムでは、「権限が拒否されました」というエラーが表示されます。


この動作の影響を示すために、Vector Fabrics は OpenCV で修復アルゴリズムを並行して実行するテスト アプリケーションを作成しました。このアプリケーションは、最大 4 コアまでのシーケンシャルおよびパラレルの両方のパフォーマンスを測定します。並列バージョンを 2 回実行しても、コアの起動によって測定値が異なります。自分で見てください (App Store からダウンロード): http://www.vectorfabrics.com/products/case-study/opencv_inpaint

于 2013-05-08T10:05:10.113 に答える