7

Android でいくつかのテストを実行して、並列化した場合にアルゴリズム (FFT など) のパフォーマンスがどの程度向上するかを検証しました。pthread と JNI (FFTW) および Java スレッド (JTransforms から) を使用してアルゴリズムを実装しました。期待どおりにスレッドを使用してパフォーマンスを向上させる代わりに、シリアル アルゴリズムを使用してより良い結果を得ました。マルチコアデバイスでこれらのテストを実行したため、なぜこれらの結果が得られたのかは不明です。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/algorithms/fftw/FFTW.java .

テストで呼び出されるメソッドは「execute」です。

純粋な Java の例: https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/jtransforms/fft/DoubleFFT_1D2TAlgorithm.java

ここで呼び出されるメソッドは「実行」です。

「実行」と「実行」は別のスレッド内で呼び出されます。

4

1 に答える 1

3

プログラムに複数の CPU 集中型スレッドが一定期間実行されている場合、カーネルはスレッドを別のコアにシフトします。それ以外の場合、カーネルは次の 2 つのことによって動機付けられます。

  • コア間でスレッドをシフトすると、コストがかかります (パフォーマンス面で)。
  • コアをオンにするとコストがかかります (バッテリーに関して)。

Android は可能な限りコアをオフにし、CPU の需要が必要な場合にのみコアを有効にします。「持続期間」を正確に構成するものは、デバイスによって異なります。

複数のコアの使用例を示すサンプル コードを 2 つまとめました ( C バージョンJava バージョン)。

systraceをサポートするルート化されたデバイスを使用すると、実際に各コアで実行されているスレッドをグラフィカルに確認できます。

更新: 例があると役立つかもしれないと思ったので、MultiCore.java テストをサンプル アプリ内にラップし、systrace の下で 4.3 Nexus 4 で実行しました。結果を説明するページを作成しました。

于 2013-07-30T23:29:24.793 に答える