-fp-model
ảnh hưởng cách tính toán dấu chấm động được thực hiện, và có thể thay đổi kết quả số (bằng cách cấp phép tối ưu hóa không an toàn hoặc bằng cách thay đổi độ chính xác mà trung gian kết quả được đánh giá).
-fp-speculation
không thay đổi kết quả bằng số, nhưng có thể ảnh hưởng đến cờ động nào được nâng lên bằng thao tác (hoặc bẫy nào được kích hoạt). 99,99% người lập trình không cần quan tâm đến những thứ này, vì vậy bạn có thể chạy với mặc định và không lo lắng về nó.
Dưới đây là ví dụ cụ thể; giả sử bạn có chức năng sau:
double foo(double x) {
// lots of computation
if (x >= 0) return sqrt(x);
else return x;
}
sqrt
là, tương đối chậm. Nó sẽ được tốt đẹp để Palăng việc tính toán sqrt(x)
như thế này:
double foo(double x) {
const double sqrtx = sqrt(x);
// lots of computation
if (x >= 0) return sqrtx;
else return x;
}
Bằng cách này, chúng tôi cho phép tính toán của sqrt
để tiến hành đồng thời với tính toán khác, giảm độ trễ của chức năng của chúng tôi. Tuy nhiên, có một vấn đề; nếu x
là số âm, thì sqrt(x)
sẽ tăng cờ không hợp lệ. Trong chương trình ban đầu, điều này không bao giờ có thể xảy ra, bởi vì sqrt(x)
chỉ được tính nếu x
là không âm. Trong chương trình sửa đổi, sqrt(x)
được tính vô điều kiện. Do đó, nếu x
là số âm, chương trình sửa đổi sẽ tăng cờ không hợp lệ, trong khi chương trình gốc thì không.
Cờ -fp-speculation
cung cấp cho bạn một cách để thông báo cho trình biên dịch xem bạn có quan tâm đến những trường hợp này hay không, vì vậy, nó biết được liệu nó có được phép chuyển đổi như vậy hay không.
Nguồn
2011-09-14 15:46:33
Hãy xem xét một biến thể khác, trong đó 'sqrt (x)' được đánh giá vô điều kiện. Rõ ràng việc tối ưu hóa tương tự được áp dụng, nhưng bây giờ thay vì một ngoại lệ FPU không liên quan, chúng tôi có một ngoại lệ FPU xảy ra quá sớm, có thể trước khi bộ nhớ khác ghi được từ bộ xử lý bẫy. Việc thực thi đầu cơ có thể không chỉ dẫn đến các ngoại lệ FPU bổ sung mà còn thay đổi thời gian của các ngoại lệ. –