2013-07-24 6 views
7

私はAndroid上でいくつかのテストを実行しており、並列化されているとアルゴリズムのパフォーマンス(FFTなど)がどれほど改善できるかを検証しています。私は、JNI(FFTW)とJavaスレッド(JTransformsから)でpthreadを使用してアルゴリズムを実装しました。期待どおりのスレッドを使用してより良いパフォーマンスを得る代わりに、私はシリアルアルゴリズムを使用してより良い結果を得ています。私がマルチコアデバイスでこれらのテストを実行して以来、なぜ私はこれらの結果が得られたのか不明です。 Androidシステムで使用されているスケジューリングアルゴリズムは、Linuxで使用されているものとちょっと違っていて、複数のCPUを使用してAndroid上でマルチプロセッシングを実行したいと思っています。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です。

テストで呼び出されるメソッドは「実行」です。ピュアJavaで

例:ここでは '実行' と呼ばれる方法 https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/jtransforms/fft/DoubleFFT_1D2TAlgorithm.java

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

+0

executeOnExecutorでThreadPoolExecutorまたはAsyncTaskを使用します。 –

+2

私はあなたの最後の文について、どのようなテストを試みたのですか?私たちにいくつかのコードを教えてくれますか? – Desert

+0

ああ、あなたはC++マルチスレッドを使用しています。私は、javaマルチスレッドを使用してみるか、C++をよく知っている人と相談してみることをお勧めします。 – Desert

答えて

3

プログラムでCPUを多用する複数のスレッドが一定期間実行されている場合、カーネルはスレッドをコアに分割します。そうでなければ、カーネルは2つのことによって動機づけられる。

  • コア間のスレッドのシフトは高価(パフォーマンス上)です。
  • コアをオンにするのは高価です(バッテリ単位)。

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

使用中の複数のコア(C versionJava version)を示す2つのサンプルコードをまとめました。

systraceをサポートするルートデバイスでは、どのコアが各コアで実行されているかを実際にグラフィカルに見ることができます。

更新: 私はそれは例を持っているのに役立つかもしれないと思ったので、私はサンプルアプリケーション内で私のMultiCore.javaテストを包み、SYSTRACE下4.3ネクサス4でそれを実行しました。 explains the resultsというページを作成しました。

+0

@ user12707 systraceでいくつかのテストを行い、あなたが得る? –

+0

*私がsystraceでいくつかのテストを行い、最初に結果を示したら助けになると思いました。回答が更新されました。 – fadden

関連する問題