Có thể để cho phép thời gian liên kết optimization trong khi chỉ vô hiệu hóa các răng cưa chặt chẽ đối với một số chức năng?


0 Phiếu
Đã hỏi 25/5/2016 bởi gur_7277 (120 điểm)
program của tôi phù hợp với các quy tắc nghiêm ngặt răng cưa, ngoại trừ một nơi: một unit compilation chứa băm có chức năng như MurmurHash3, SpookyHash, etc. Ngày x86, x86_64 và các chức năng hashing chấp nhận một const char *, đúc chúng để uint32, và process data trong khối 4 byte. Điều này làm cho chúng nhanh hơn nhiều so với xử lý data byte bởi-byte, nhưng tôi tin này vi phạm các quy tắc nghiêm ngặt răng cưa. Ngay bây giờ, tôi compile này unit compilation với - fno nghiêm ngặt-răng cưa, trong khi tôi compile phần còn lại của program với răng cưa - fstrict. Nhưng tôi tự hỏi điều gì sẽ xảy ra nếu tôi kích hoạt tối ưu hóa thời gian liên kết. Như xa như tôi biết, GCC và kêu vang thực hiện sắp xếp của optimization thời gian liên kết bằng cách lưu trữ program source vào tập tin .o, do đó ở giai đoạn nối kết compiler biết code source của toàn bộ chương trình. Rồi sau đó vẫn có thể vô hiệu hóa các răng cưa chặt chẽ đối với các chức năng hashing chỉ? Hoặc tôi bây giờ phải vô hiệu hóa các răng cưa nghiêm ngặt cho toàn bộ chương trình? Hoặc đã làm tôi hiểu sai những điều hoàn toàn, và MurmurHash3 / SpookyHash trong thực tế là tuân thủ nghiêm ngặt aliasing?

1 câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi stike (180 điểm)
Nó nên có thể (ít bạn có thể thử) kể từ khi cung cấp tại GCC function cụ thể tùy chọn pragmas . Bạn có thể thử thêm một cái gì đó như
 #pragma GCC optimize ("-fstrict-aliasing")
trước khi chức năng răng cưa của bạn, và đặt
 #pragma GCC reset_options
sau khi họ. Có lẽ bạn cần để bọc này với
#if __GNUC__ >= 4
và tất nhiên một số #endif ngoài ra, sử dụng thủ thuật xây dựng (ví dụ: autoconf, cmake, hoặc một GNU phức tạp làm cho 4.0 quy tắc, etc...) để xác định HAVE_GENUINE_GCC của riêng bạn như là 1 chỉ cho chính hãng GCC trình biên dịch và của riêng bạn HAVE_GENUINE_CLANG như 1 cho chính hãng kêu vang / LLVM trình biên dịch, vv... Hoặc có lẽ phát hiện pragmas ở trên được hiểu trên một số mẫu mã, và sau đó xác định HAVE_WORKING_PRAGMA_GCC_OPTIMIZE 1. BTW, GCC ít nhất, -flto không phải là lưu trữ trong object các tập tin một đại diện của các nguồn program , nhưng chỉ là một form tiêu hóa của một số đại diện nội bộ GCC (như Gimple, vv...) có được khi biên dịch mã của bạn source . Điều này là khá khác nhau! PS. tôi đã không cố gắng, vì vậy, có lẽ nó không phải là đơn giản.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...