2010-08-31 20 views
5

Gợi ý và cáo buộc rất nhiều rằng số học với NaN có thể 'chậm' trong FPU phần cứng. Cụ thể trong FPU x64 hiện đại, ví dụ: trên Nehalem i7, điều đó vẫn đúng? Các nhân FPU có bị đảo lộn ở cùng tốc độ không phụ thuộc vào giá trị của toán hạng?Số học NaN chậm trong Intel x64 FPU như thế nào?

Tôi có một số mã nội suy có thể đi lang thang ngoài các dữ liệu được xác định, và tôi đang cố gắng xác định xem có nhanh hơn để kiểm tra NaN (hoặc một số giá trị sentinel khác) ở đây và ở mọi nơi hay không. điểm. Có, tôi sẽ điểm chuẩn trường hợp cụ thể của tôi (nó có thể bị chi phối bởi cái gì đó khác hoàn toàn, như băng thông bộ nhớ), nhưng tôi rất ngạc nhiên khi không thấy một bản tóm tắt ngắn gọn ở đâu đó để giúp trực giác của tôi.

Tôi sẽ làm điều này từ CLR, nếu nó tạo sự khác biệt về hương vị của NaN được tạo.

+0

Theo như tôi biết, chỉ có một giá trị 'NaN'. – zneak

+3

@zneak: Ít nhất, IEEE-754 định nghĩa các NaN "yên tĩnh" và "báo hiệu" với các mẫu bit khác nhau. –

+0

@Jim Lewis Tôi đoán đó là xa hơn những gì tôi biết. – zneak

Trả lời

6

Đối với giá trị của nó, sử dụng lệnh SSE mulsd với NaN là khá chính xác nhanh như với hằng số 4.0 (được chọn bởi cuộn xúc xắc công bằng, được đảm bảo là ngẫu nhiên).

Mã này:

for (unsigned i = 0; i < 2000000000; i++) 
{ 
    double j = doubleValue * i; 
} 

tạo ra mã máy này (bên trong vòng lặp) với kêu vang (tôi giả sử máy ảo NET sử dụng lệnh SSE khi nó có thể quá):

movsd  -16(%rbp), %xmm0 ; gets the constant (NaN or 4.0) into xmm0 
movl  -20(%rbp), %eax  ; puts i into a register 
cvtsi2sdq %rax, %xmm1   ; converts i to a double and puts it in xmm1 
mulsd  %xmm0, %xmm1  ; multiplies xmm0 (the constant) with xmm1 (i) 
movsd  %xmm1, -32(%rbp) ; puts the result somewhere on the stack 

Và với hai tỷ lần lặp lại, số NaN (như được xác định bằng macro C NAN từ <math.h>) mất khoảng 0.017 ít hơn giây để thực thi trên i7 của tôi. Sự khác biệt có thể do bộ lập lịch tác vụ gây ra.

Vì vậy, công bằng, chúng chính xác là nhanh.

+0

+1 để đo thay vì đoán! –

+0

Nó luôn luôn tốt đẹp để xem một ai đó kết quả hồ sơ thực tế, nhưng OP yêu cầu cho một bản tóm tắt súc tích và đặc biệt không cho một giải pháp chuẩn. Vì vậy, -1. lấy làm tiếc. FWIW, tôi đã làm một điểm chuẩn trên trình biên dịch cl.exe VS.2015 và chạy bên trong một thời gian chạy đơn (Unity 5.5.2, trên thực tế) và tìm thấy kiểm tra isNaN là ORDERS của cường độ chậm hơn. Vì vậy, chỉ vì bạn đã tìm thấy một ví dụ mà tốc độ của nó không trả lời câu hỏi cho dù nó nói chung là nhanh. – Imi

+0

@Imi, bạn đã xem mã mà nó tạo ra chưa? Ngoài ra, câu trả lời này không có isNaN ở bất kỳ đâu. – zneak

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