Có thể bật/tắt tính toán-bật/tắt có chọn lọc trong thời gian chạy không? Ví dụ, tạo các lớp FastMath và AccurateMath với lớp cơ sở chung Toán học, để người ta có thể sử dụng cả hai cách triển khai trong suốt thời gian chạy? Cụ thể, tôi không biết liệu việc biên dịch với toán -ffast-math sẽ phát ra một lệnh sẽ, khi được thực hiện, sẽ ảnh hưởng đến tất cả các tính toán số trong chuỗi (ví dụ, thiết lập). một lá cờ để tuôn ra subnormals bằng không).Dynamic -ffast-math
Trả lời
Hãy thử điều này:
gcc -ffast-math -c first.c
gcc -c second.c
gcc -o dyn_fast_math first.o second.o
Đưa duy nhất tên chức năng trong first.c và second.c. Cái này cần phải dùng mẹo. Có rất ít tác động "toàn cầu" của tối ưu hóa trình biên dịch. Nếu có tồn tại, liên kết có thể sẽ thất bại do xung đột.
Tôi đã thử một mẫu nhỏ mà không gặp vấn đề gì.
Đây là một ví dụ.
first.c
extern double second();
double first()
{
double dbl;
dbl = 1.0;
dbl /= 10.0;
return dbl;
}
int main()
{
printf("first = %f\n", first());
printf("second = %f\n", second());
return 0;
}
second.c
double second()
{
double ddbl;
ddbl = 1.0;
ddbl /= 10.0;
return ddbl;
}
biên soạn
gcc -S first.c
gcc -c first.s
gcc -ffast-math -S second.c
gcc -ffast-math -c second.s
gcc -o prog first.o second.o
Kiểm tra differe nce giữa first.s và second.s và bạn sẽ tìm thấy điều này:
movapd %xmm1, %xmm2
divsd %xmm0, %xmm2
movapd %xmm2, %xmm0
thay đổi này:
mulsd %xmm1, %xmm0
Cả hai chức năng được gọi, và cả hai trở lại kết quả mong đợi.
Cảm ơn. Tôi tự hỏi, mặc dù một cái gì đó như thế này là doable mà không thay đổi hệ thống xây dựng, mà trong trường hợp của tôi bao gồm hàng chục trên kịch bản makefile-phong cách cho hàng ngàn tập tin nguồn. Có một toán họC#pragma nhanh không? Googling cho nó dẫn đến một báo cáo lỗi rằng tuyên bố rằng pragma như vậy nên làm việc trong GCC, nhưng không. – Michael
Ah, tôi không biết về một pragma hoặc các phương tiện khác. Thực hiện các sửa đổi hỗ trợ cho cài đặt cho các mục tiêu cụ thể, nếu điều đó có ích. – ash
Nếu bạn không muốn muck với xây dựng hệ thống, bạn có thể làm như sau:
#pragma fast-math push
#pragma fast-math on
[..]
#pragma fast-math pop
GCC có thể có một cú pháp hơi khác nhau, nhưng tôi hy vọng nó có thể quá.
Bạn sẽ cần phải biên dịch hai phiên bản, một phiên bản có tối ưu hóa và một phiên bản không có. Sau đó liên kết chúng và chọn để gọi vào thời gian chạy. – Mysticial
Thật không may là http://stackoverflow.com/questions/7420665/what-does-gccs-ffast-math-actually-do chỉ cung cấp một ví dụ, nhưng hiệu ứng '-ffast-math' chủ yếu là (hoàn toàn?) các lựa chọn biên dịch thời gian, chẳng hạn như biên dịch '/ 10' thành' * 0.1', hoặc “đơn giản hóa” 'a + bab' thành' 0' (nó không phải là số không cho các phép tính IEEE 754). Vì vậy, như Mysticial nói, không có cách nào để bật và tắt cờ tại thời gian chạy: bạn phải biên dịch hai phiên bản nếu đó là những gì bạn thực sự muốn. –
@Mysticial đưa ra nhận xét của bạn thành câu trả lời - đó là waaay duy nhất ... – ldrumm