2013-07-24 29 views
7

Tôi đã thực hiện một số thử nghiệm trên Android để xác minh hiệu suất của thuật toán (như FFT) có thể được cải thiện như thế nào nếu nó được song song. Tôi đã thực hiện các thuật toán bằng cách sử dụng pthread với các chủ đề JNI (FFTW) và Java (từ JTransforms). Thay vì nhận được một hiệu suất tốt hơn bằng cách sử dụng các chủ đề như mong đợi, tôi đã có kết quả tốt hơn bằng cách sử dụng thuật toán nối tiếp. Nó không rõ ràng với tôi tại sao tôi đã có những kết quả kể từ khi tôi thực hiện những thử nghiệm trên các thiết bị đa lõi. Dường như thuật toán lập lịch được hệ thống Android sử dụng khác với hệ thống được Linux sử dụng và bạn không may mắn nếu bạn muốn sử dụng nhiều CPU để thực hiện đa xử lý trên Android.Multiprocessing trên Android

Ví dụ với FFTW: Mã JNI nằm ở https://github.com/maxrosan/DspBenchmarking/blob/master/jni/fftw_jni.c và giao diện của mã là https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/fftw/FFTW.java.

Phương pháp được gọi trong thử nghiệm là 'thực thi'.

Ví dụ với Java tinh khiết: https://github.com/maxrosan/DspBenchmarking/blob/master/src/br/usp/ime/dspbenchmarking/algorithms/jtransforms/fft/DoubleFFT_1D2TAlgorithm.java

Đây là phương pháp được gọi là 'thực hiện'.

'thực thi' và 'thực hiện' được gọi bên trong một chuỗi khác.

+0

Sử dụng ThreadPoolExecutor hoặc AsyncTask với executeOnExecutor. –

+2

Tôi không chắc chắn về câu cuối cùng của bạn, bạn đã thử loại bài kiểm tra nào? Bạn có thể cho chúng tôi thấy một số mã không? – Desert

+0

Ồ, vì vậy bạn đang sử dụng đa luồng C++. Tôi khuyên bạn nên thử sử dụng java đa luồng hoặc tham khảo ý kiến ​​với mọi người, những người hiểu biết về C++ tốt, chỉ để kiểm tra xem mọi thứ có ổn với nó hay không. – Desert

Trả lời

3

Nếu chương trình của bạn có nhiều luồng chuyên sâu CPU chạy trong một khoảng thời gian dài, hạt nhân sẽ chuyển chủ đề thành các lõi riêng biệt. Nếu không, hạt nhân được thúc đẩy bởi hai điều:

  • Việc chuyển luồng giữa các lõi rất tốn kém (hiệu suất).
  • Bật lõi là tốn kém (pin khôn ngoan).

Android tắt lõi khi có thể và chỉ cho phép khi yêu cầu CPU yêu cầu chúng. Những gì chính xác cấu thành một "thời gian bền vững" thay đổi từ thiết bị này sang thiết bị khác.

Tôi kết hợp hai bit mã mẫu chứng minh nhiều lõi đang sử dụng (C version, Java version).

Với thiết bị gốc có hỗ trợ systrace, bạn thực sự có thể xem đồ họa mà chuỗi đang chạy trên mỗi lõi.

Cập nhật: tôi nghĩ rằng nó có thể giúp đỡ để có một ví dụ, vì vậy tôi quấn thử nghiệm MultiCore.java của tôi bên trong một ứng dụng mẫu và chạy nó trên một 4.3 Nexus 4 dưới Systrace. Tôi đã tạo một trang có số explains the results.

+0

@ user12707 bạn có thể làm một số thử nghiệm với systrace và cho chúng tôi thấy những gì bạn lấy? –

+0

Tôi nghĩ rằng nó có thể giúp nếu * tôi * đã làm một số xét nghiệm với systrace và cho thấy kết quả đầu tiên. Đã cập nhật câu trả lời. – fadden