2011-09-14 16 views
8

CáC++ biên dịch Intel C cung cấp hai tùy chọn cho việc kiểm soát điểm nổi:gì là dấu chấm động đầu cơ và làm thế nào nó khác với mô hình điểm nổi của trình biên dịch

-fp-đầu cơ (nhanh/an toàn/nghiêm ngặt/off) - fp-model (chính xác/nhanh/chặt chẽ và nguồn/đôi/mở rộng)

Tôi nghĩ rằng tôi hiểu mô hình fp nào. Nhưng fp-đầu cơ là gì và nó liên quan như thế nào đến mô hình fp? Tôi chưa tìm thấy bất kỳ tài liệu intel nào giải thích điều này!

Trả lời

13

-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.

+1

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ệ. –

1

Thực hiện lệnh và thực thi đầu cơ có thể dẫn đến ngoại lệ không liên quan hoặc tăng ngoại lệ vào sai thời điểm.

Nếu điều đó quan trọng đối với bạn, bạn có thể sử dụng tùy chọn fp-speculation để kiểm soát việc suy đoán các chỉ lệnh dấu phẩy động.

Đối (một chút) biết thêm thông tin: http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/copts/common_options/option_fp_speculation.htm

+1

Cờ đang kiểm soát * phần mềm * đầu cơ bởi trình biên dịch, chứ không phải thực thi đầu cơ phần cứng.Thực thi đầu vào trong một bộ xử lý không theo thứ tự * không thể tăng các ngoại lệ không liên quan - bất kỳ ngoại lệ giả nào được vá tại thời điểm nghỉ hưu, để hiệu ứng quan sát được đối với bất kỳ chương trình nào như thể các lệnh được thực thi theo thứ tự chương trình. –

+2

@Stephen: Có, và trình biên dịch CÓ THỂ tạo ra logic để vá mọi thứ cũng được, nhưng điều đó làm chậm chương trình. Do đó các tùy chọn khác nhau để trao đổi tốc độ với hành vi ngoại lệ chính xác. –

+0

Trình biên dịch không cần tạo bất kỳ mã nào để "vá" phần cứng * đầu cơ. Đó là xử lý trong silicon. Ở đây chúng ta đang nói về trình biên dịch làm những việc như nâng các hoạt động độ trễ dài trên các điểm chi nhánh (* phần mềm * đầu cơ). –

-1

Trên hệ điều hành Windows: 1.Phiên bản tính toán nổi của ứng dụng 32 bit so với ứng dụng 64 bit, cùng mã có thể cung cấp cho bạn kết quả khác nhau !!!! Không có vấn đề gì cờ bạn chọn:) !!!!

2.Phương trình tính toán trình biên dịch phòng thu thực tế 32 bit so với ứng dụng 64 bit, cùng một kết quả đầu ra mã giống nhau.

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và sau khi bạn có [đủ danh tiếng] (http://stackoverflow.com/help/privileges/comment), bạn sẽ có thể nhận xét về bất kỳ bài đăng nào. –

+0

Đây không phải là phê phán hoặc làm rõ. Đó là sự thật đơn giản từ expiriense của tôi và kể từ khi tôi đang làm việc tại Intel và giao dịch với trình biên dịch Intel Tôi nghĩ rằng tôi có thể viết bình luận mà không "đủ danh tiếng" – user3004288

+0

https://software.intel.com/en-us/forums/topic/271440 – user3004288

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