2010-08-14 8 views
5

Tôi đọc (http://www.stereopsis.com/FPU.html) được đề cập trong (What is the fastest way to convert float to int on x86). Có ai biết nếu các diễn viên đơn giản chậm (xem đoạn dưới đây) cũng áp dụng cho kiến ​​trúc ARM?Fast float to int chuyển đổi và nổi điểm chính xác trên ARM (iPhone 3GS/4)

inline int Convert(float x) 
{ 
    int i = (int) x; 
    return i; 
} 

Để áp dụng một số thủ thuật được đề cập trong bài viết FPU, bạn phải đặt độ chính xác cho hoạt động điểm nổi. Làm thế nào để tôi làm điều đó trên ARM?

Biến nổi nhanh nhất để chuyển đổi int trên kiến ​​trúc ARM là gì?

Cảm ơn!

+1

Vui lòng không đặt tên cho chức năng như thế này 'Chuyển đổi' trong mã thực: P –

+0

@Billy: Tôi hiểu rõ điểm của bạn. Floor sẽ tốt hơn :-) –

+0

trở lại trong ngày (15 hoặc nhiều năm trước) đã có một vấn đề hiệu suất trên x86 khi thực hiện bình thường typecasts (int) afloat, điều này là do float2int mặc định trong thanh ghi fpu là một tầng và không phải là một vòng. Vì vậy, cho mã để được nhanh chóng trong thời đại đặc biệt lắp ráp đã được viết. Bất kỳ mã nào được lấy từ thời điểm đó sẽ mong đợi chuyển đổi float sang số nguyên để sử dụng thao tác sàn so với một vòng bình thường. Tuy nhiên bạn có thể nhận được một hit kép bằng cách sử dụng một chức năng sàn và sau đó một diễn viên để int so với chỉ là một diễn viên để int (vòng đến gần nhất). – Medran

Trả lời

10

Phiên bản ngắn, "không".

Bài viết đó rất cổ xưa và thậm chí không áp dụng cho các hệ thống x86 hiện đại, không kể ARM. Một dàn diễn viên đơn giản với số nguyên là khá nhanh trên ARMv7 (iPhone 3GS/4), mặc dù có một gian hàng khiêm tốn chuyển dữ liệu từ thanh ghi VFP/NEON sang thanh ghi mục đích chung. Tuy nhiên, do dữ liệu float của bạn có thể đến từ việc tính toán được thực hiện trong sổ đăng ký VFP/NEON, bạn sẽ phải trả tiền cho di chuyển đó bất kể bạn thực hiện chuyển đổi như thế nào.

Tôi không nghĩ rằng đây là một con đường có lợi nhuận để tối ưu hóa trừ khi bạn có dấu vết cho thấy rằng đây là một nút cổ chai lớn cho chương trình của bạn. Thậm chí sau đó, chuyển đổi nhanh nhất là chuyển đổi bạn không làm; bạn sẽ hầu như luôn luôn tốt hơn trong việc tìm kiếm các cách thuật toán để loại bỏ các chuyển đổi khỏi chương trình của bạn.

Nếu bạn làm thực cần phải tối ưu hóa chuyển đổi, nhìn vào vcvt.i32.f32 hướng dẫn, chuyển đổi một vector của hai hoặc bốn số dấu chấm động để một vector của hai hoặc bốn số nguyên mà không di chuyển dữ liệu ra khỏi NEON đăng ký (và do đó, mà không phát sinh gian hàng mà tôi đã đề cập). Tất nhiên, bạn sẽ cần phải thực hiện các phép tính số nguyên tiếp theo của bạn trên đơn vị NEON để có thể tối ưu hóa lợi nhuận.

Câu hỏi: Bạn là gì thực sự đang cố gắng làm gì? Tại sao bạn nghĩ rằng bạn cần chuyển đổi float-> int nhanh hơn?