Là một phần mở rộng cho câu trả lời moyner của , về chip sqrt
thường là một rsqrt
, tức là một đối ứng căn bậc hai mà tính . Vì vậy, nếu trong mã của bạn, bạn sẽ chỉ sử dụng1/r(nếu bạn đang thực hiện động lực phân tử, bạn có thể), bạn có thể tính toántrực tiếp và tiết kiệm cho mình phép chia. Lý do tại saođược tính toán thay vìlà phép lặp Newton của nó không có phân chia, chỉ có phép cộng và phép nhân.a → 1 / a--√1 / rr = rsqrt(r2)
rsqrt
sqrt
Là một lưu ý phụ, các bộ phận cũng được tính toán lặp lại và hầu như chỉ chậm như rsqrt
trong phần cứng. Nếu bạn đang tìm kiếm hiệu quả, tốt hơn hết là bạn nên cố gắng loại bỏ các phân chia không cần thiết.
Một số kiến trúc hiện đại hơn như kiến trúc POWER của IBM không cung cấp rsqrt
per-se, nhưng ước tính chính xác đến một vài bit, ví dụ FRSQRTE . Khi người dùng gọi rsqrt
, điều này tạo ra một ước tính và sau đó một hoặc hai lần (bao nhiêu là bắt buộc) thuật toán của Newton hoặc Goldschmidt bằng cách sử dụng phép nhân và phép cộng thông thường. Ưu điểm của phương pháp này là các bước lặp có thể được sắp xếp theo đường ống và xen kẽ với các hướng dẫn khác mà không chặn FPU (để biết tổng quan rất hay về khái niệm này, mặc dù trên các kiến trúc cũ hơn, xem Luận án Tiến sĩ của Rolf Strebel ).
Đối với tiềm năng tương tác, sqrt
có thể tránh hoàn toàn thao tác bằng cách sử dụng phép nội suy đa thức của hàm tiềm năng, nhưng công việc của riêng tôi (được triển khai mdcore
) trong lĩnh vực này cho thấy, ít nhất là trên các kiến trúc kiểu x86, sqrt
hướng dẫn này đủ nhanh.
Cập nhật
Vì câu trả lời này dường như nhận được khá nhiều sự chú ý, tôi cũng muốn giải quyết phần thứ hai của câu hỏi của bạn, nghĩa là nó có thực sự đáng để thử cải thiện / loại bỏ các hoạt động cơ bản như sqrt
không?
Trong bối cảnh mô phỏng Động lực học phân tử, hoặc bất kỳ mô phỏng dựa trên hạt nào với các tương tác giới hạn cắt, có rất nhiều điều có được từ các thuật toán tốt hơn cho việc tìm kiếm hàng xóm. Nếu bạn đang sử dụng danh sách Di động hoặc bất cứ thứ gì tương tự, để tìm hàng xóm hoặc tạo danh sách Verlet , bạn sẽ tính toán một số lượng lớn khoảng cách cặp đôi giả. Trong trường hợp ngây thơ, chỉ có 16% các cặp hạt được kiểm tra sẽ thực sự nằm trong khoảng cách giới hạn của nhau. Mặc dù không có tương tác nào được tính toán cho các cặp như vậy, nhưng việc truy cập dữ liệu hạt và tính toán khoảng cách theo cặp giả có chi phí lớn.
Công việc của riêng tôi trong lĩnh vực này ( ở đây , ở đây và ở đây ), cũng như của những người khác (ví dụ ở đây ), cho thấy làm thế nào những tính toán giả này có thể tránh được. Các thuật toán tìm hàng xóm này thậm chí còn thực hiện các danh sách Verlet, như được mô tả ở đây .
Điểm tôi muốn nhấn mạnh là mặc dù có thể có một số cải tiến để đạt được từ việc biết / khai thác tốt hơn kiến trúc phần cứng cơ bản, nhưng cũng có những lợi ích lớn hơn có thể có khi nghĩ lại các thuật toán cấp cao hơn.
rsqrtps
và AVXvrsqrtps
cũng là ước tính, chúng nhận được 11 đến 12 bit đầu tiên chính xác và bạn nên tinh chỉnh bằng phép lặp Newton hoặc hai nếu bạn muốn độ chính xác cao hơn. Đây là các hướng dẫn 5/1 và 7/1 (độ trễ / thông lượng nghịch đảo) trên Sandy Bridge (xem bảng hướng dẫn của tài liệu Intel hoặc Agner Fog tương đương với phép nhân. Ngược lại, độ chính xác đầy đủ(v)sqrtps
(hoặc độ chính xác kép(v)sqrtpd
) mất 10-43 / 10-43 (xem bảng hướng dẫn để biết chi tiết).