2013-07-24 3 views
7

Я выполнял некоторые тесты на Android, чтобы проверить, насколько хороша производительность алгоритма (например, FFT), если он будет распараллелен. Я реализовал алгоритмы, используя pthread с JNI (FFTW) и потоками Java (из JTransforms). Вместо того, чтобы получать лучшую производительность, используя потоки, как ожидалось, у меня есть лучшие результаты с использованием последовательного алгоритма. Мне непонятно, почему у меня есть эти результаты, так как я выполнил эти тесты на многоядерных устройствах. Похоже, что алгоритм планирования, используемый системой Android, немного отличается от используемого Linux, и вам не повезло, если вы хотите использовать более одного процессора для многопроцессорности на 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

Используйте ThreadPoolExecutor или AsyncTask с executeOnExecutor. –

+2

Я не уверен в вашем последнем предложении, какие тесты вы пробовали? Можете ли вы показать нам какой-то код? – Desert

+0

О, так вы используете многопоточность C++. Я предлагаю вам попробовать использовать многопоточность java или проконсультироваться с людьми, которые хорошо знают C++, просто чтобы проверить, все ли в порядке с ним. – Desert

ответ

3

Если ваша программа имеет несколько потоков, интенсивно работающих с ЦП, которые работают в течение длительного периода времени, ядро ​​переносит потоки на отдельные ядра. В противном случае ядро ​​мотивировано двумя вещами:

  • Смещение нити между сердечниками дорого (по высоте).
  • Поворот сердечника на дорогой (по батарее).

Android выключает, когда это возможно, и разрешает их только тогда, когда требует от них потребность в ЦП. То, что именно составляет «устойчивый период», варьируется от устройства к устройству.

Я собрал два бита примера кода, которые демонстрируют использование нескольких ядер (C version, Java version).

С корневым устройством, имеющим поддержку systrace, вы можете увидеть графически, какая нить работает на каждом ядре.

Update: Я думал, что это может помочь иметь пример, поэтому я обернул мой тест MultiCore.java внутри приложения образца и запустил его на 4,3 Nexus 4 под Systrace. Я создал страницу, которая explains the results.

+0

@ user12707 Можете ли вы сделать несколько тестов со скоростью и показать нам, что Вы получаете? –

+0

Я полагал, что это может помочь, если * I * провела несколько тестов с systrace и показала результаты в первую очередь. Ответ обновлен. – fadden

Смежные вопросы