2012-02-12 41 views
5

Tôi đang phát triển cho nền tảng AVR và tôi có một câu hỏi. Tôi không muốn thư viện dấu chấm động được liên kết với mã của tôi, nhưng tôi thích khái niệm có giá trị tương tự của phạm vi 0.0 ... 1.0 thay vì 0 ... 255 và 0 ... 1023, tùy thuộc vào thậm chí cho dù tôi đang sử dụng cổng làm đầu vào hay đầu ra.Tối ưu hóa điểm nổi biên dịch GCC

Vì vậy, tôi đã quyết định nhân các đối số của các chức năng đầu vào/đầu ra theo 1023.0 và 255.0, liên tục. Bây giờ, câu hỏi của tôi là: nếu tôi thực hiện việc phân chia như thế này:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0))) 

sẽ GCC (với cờ O3 bật) tối ưu hóa thời gian biên dịch multiplications điểm, được biết đến tại thời gian biên dịch và đúc một thể thiếu nổi loại, thành các hoạt động số nguyên? (Tôi biết rằng khi sử dụng các macro này với các đối số không liên tục, việc tối ưu hóa là không thể, tôi chỉ muốn biết nếu nó sẽ được thực hiện trong trường hợp khác.)

+1

Đây không phải là phép nhân, không chia? ('analog_out (7, 0.5)' trở thành một ghi '0,5 * 255' thành cổng 7, chứ không phải là ghi 0 cắt nhỏ từ 1/510) ... – Borealid

+0

vâng, chắc chắn :) Đã sửa. –

+3

Hãy thử và tìm hiểu! 'gcc -S' sẽ tạo ra một vùng kết xuất. Bạn có thể muốn '-O2 -ffast-math' cho điều này, không phải' -O3' ('-O3' bật tối ưu hóa mà hầu như luôn luôn là một mạng * mất *, giống như nội tuyến quá tích cực, nó có nghĩa là để được sử dụng trên một tệp mà chương trình của bạn dành 90% thời gian của nó). – zwol

Trả lời

3

GCC luôn phải thực hiện xếp liên tục nếu bạn cung cấp bit dưới dạng chữ số. Nếu bạn muốn trình biên dịch thực thi constness, bạn có thể lấy đi một cái gì đó như thế này:

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0)) 
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0))) 
2

Nói chung, tôi nghĩ rằng gcc -O2 sẽ làm tất cả số học trên hằng số tại thời gian biên dịch.
Nó sẽ không chuyển đổi nó thành số học số nguyên - chỉ với một số nguyên không đổi.

Có thể rất nguy hiểm khi dựa vào, đặc biệt nếu người khác duy trì mã. Một tình huống khi truyền một tham số không liên tục đến một macro sẽ dẫn đến lỗi không tốt.

+0

Nó không dẫn đến lỗi, tôi chỉ muốn nó được tối ưu hóa. –

Các vấn đề liên quan