Sau khi đọc xung quanh chủ đề, có nhiều bằng chứng từ nhiều nguồn sử dụng tiêu chuẩn C hoặc C++ phôi để chuyển đổi từ dấu phẩy động sang số nguyên trên Intel rất chậm. Để đáp ứng đặc tả ANSI/ISO, các CPU Intel cần thực hiện một số lượng lớn các lệnh bao gồm cả các lệnh cần thiết để chuyển đổi chế độ làm tròn của phần cứng FPU.Làm cách nào để đảm bảo dấu ấn được gạch chân trong gcc?
Có một số cách giải quyết được mô tả trong các tài liệu khác nhau, nhưng rõ ràng nhất và di động nhất có vẻ là lời gọi() được thêm vào các tiêu chuẩn C99 và C++ 0x. Nhiều tài liệu nói rằng một trình biên dịch nên nội tuyến mở rộng các chức năng này khi tối ưu hóa được kích hoạt, dẫn đến mã đó là nhanh hơn so với một diễn viên thông thường, hoặc một cuộc gọi chức năng.
Tôi thậm chí còn tìm thấy các tham chiếu đến các túi theo dõi tính năng gcc để thêm phần mở rộng nội tuyến này vào trình tối ưu hoá gcc, nhưng trong các thử nghiệm hiệu suất của riêng tôi, tôi không thể làm cho nó hoạt động. Tất cả các nỗ lực của tôi cho thấy hiệu suất in ấn chậm hơn nhiều so với dàn diễn viên C hoặc C++ đơn giản. Kiểm tra đầu ra lắp ráp của trình biên dịch, và tháo các đối tượng đã biên dịch luôn hiển thị một lời gọi rõ ràng đến một hàm bên ngoài() hoặc lrintf() bên ngoài.
Phiên bản gcc tôi đã làm việc với 4.4.3 và 4.6.1 và tôi đã thử một số kết hợp cờ trên các mục tiêu 32bit và 64bit x86, bao gồm các tùy chọn để bật SSE rõ ràng.
Làm cách nào để nhận được gcc để mở rộng nội dòng, và cho tôi chuyển đổi nhanh?
Bạn đã thực sự lược tả và xác nhận rằng sử dụng diễn viên rõ ràng đang dùng một số lượng đáng kể thời gian chạy chương trình của bạn? –
Hồ sơ cho thấy rằng tôi có thể nhận được chênh lệch tốc độ 2-4% bằng cách sử dụng macro được viết bằng tay được nâng lên từ một bài viết. Điều này là đáng giá khi tính toán đang được thực hiện giữa các khung của một ứng dụng dựng hình 3D. –
bạn đã đặt '-fno-math-errno' chưa? bạn cũng nên xem xét sử dụng '-ffast-math', mà không phải lúc nào cũng là một tùy chọn nếu bạn dựa vào các ngữ nghĩa fp cụ thể ... – Christoph