Tôi đã thực hiện ứng dụng tính toán chuyên sâu bằng cách sử dụng OpenCV
cho iOS
. Tất nhiên là chậm. Nhưng nó chậm hơn 200 lần so với nguyên mẫu PC của tôi. Vì vậy, tôi đã tối ưu hóa nó xuống. Từ 15 giây đầu tiên, tôi đã có thể đạt được tốc độ 0,4 giây. Tôi tự hỏi nếu tôi tìm thấy tất cả mọi thứ và những gì người khác có thể muốn chia sẻ. Những gì tôi đã làm:Tốc độ tối đa từ IOS/iPad/iPhone
Thay thế "
double
" loại dữ liệu bên trong OpenCV thành "float
". Double là 64bit và 32bit CPU không thể dễ dàng xử lý chúng, vì vậy float đã cho tôi một số tốc độ. OpenCV sử dụng gấp đôi rất thường xuyên.Đã thêm "
-mpfu=neon
" vào tùy chọn trình biên dịch. Tác dụng phụ là vấn đề mới mà trình biên dịch giả lập không hoạt động nữa và mọi thứ có thể được kiểm tra chỉ trên phần cứng riêng.Thay thế
sin()
vàcos()
triển khai với 90 bảng tra cứu giá trị. Tăng tốc rất lớn! Điều này là phần nào đối diện với PC, nơi tối ưu hóa như vậy không cung cấp cho bất kỳ tăng tốc. Có mã hoạt động theo độ và giá trị này được chuyển đổi thành radian chosin()
vàcos()
. Mã này cũng đã bị xóa. Nhưng các bảng tra cứu đã thực hiện công việc.Đã bật
"thumb optimizations"
. Một số bài đăng trên blog đề xuất chính xác nhưng điều này là do ngón tay cái khiến mọi thứ thường chậm hơn trênarmv6
.armv7
không có bất kỳ vấn đề gì và làm mọi việc nhanh hơn và nhỏ hơn.Để đảm bảo tối ưu hóa ngón tay cái và
-mfpu=neon
hoạt động tốt nhất và không giới thiệu các sự cố, tôi đã xóa hoàn toàn mục tiêu armv6. Tất cả mã của tôi được biên dịch thànharmv7
và điều này cũng được liệt kê là yêu cầu trong cửa hàng ứng dụng. Điều này có nghĩa là tối thiểuiPhone
sẽ là3GS
. Tôi nghĩ rằng nó là OK để thả những người lớn tuổi. Dù sao những cái cũ có CPU chậm hơn và ứng dụng chuyên sâu CPU cung cấp trải nghiệm người dùng xấu nếu được cài đặt trên thiết bị cũ.Dĩ nhiên tôi sử dụng
-O3 flag
Tôi đã xóa
"dead code"
từ OpenCV. Thường thì khi tối ưu hóa OpenCV tôi thấy mã rõ ràng là không cần thiết cho dự án của tôi. Ví dụ thường có thêm"if()"
để kiểm tra kích thước pixel là 8 bit hoặc 32 bit và tôi biết rằng tôi chỉ cần 8bit. Điều này loại bỏ một số mã, cung cấp trình tối ưu hóa cơ hội tốt hơn để loại bỏ một cái gì đó nhiều hơn hoặc thay thế bằng các hằng số. Ngoài ra mã phù hợp tốt hơn vào bộ nhớ cache.
Bất kỳ thủ thuật và ý tưởng nào khác? Đối với tôi cho phép ngón tay cái và thay thế lượng giác với tra cứu đã thúc đẩy các nhà sản xuất và làm tôi ngạc nhiên. Có lẽ bạn biết một cái gì đó nhiều hơn để làm mà làm cho các ứng dụng bay?
Gia tốc này mới đối với tôi. Nó vẫn còn chút khó khăn để sử dụng vì nó cần mức độ lắp ráp của tư duy. Nhưng vẫn có thể và có thể sẽ thử. Tôi đánh dấu nó được chấp nhận sau này vì tôi muốn xem liệu chúng ta có gợi ý hữu ích hơn ở đây không. –
Có một phiên trong các video WWDC 2012 đề cập hoàn toàn với khung Tăng tốc. Bạn nên xem qua nó ^^ – borrrden
http://adcdownload.apple.com//wwdc_2012/wwdc_2012_session_pdfs/session_708__the_accelerate_framework.pdf và https://developer.apple.com/videos/wwdc/2012/#708 dường như để được liên kết cho nó –