2013-05-14 35 views
6

Mục tiêu của tôi là chạy mô phỏng yêu cầu các số không tách rời trên các máy khác nhau có thể có kiến ​​trúc và hệ điều hành CPU khác nhau. Ưu tiên chính là cho cùng trạng thái ban đầu, mỗi máy nên tái tạo mô phỏng chính xác như nhau. Ưu tiên thứ hai là tôi muốn các phép tính có hiệu suất và độ chính xác gần như có thể thực hiện với các phao chính xác kép.Cách hiệu quả nhất để chạy mô phỏng đa nền tảng, xác định trong Haskell là gì?

Theo như tôi có thể nói, đó dường như không có cách nào để ảnh hưởng đến định mệnh của nổi tính toán điểm từ bên trong một chương trình Haskell, tương tự như _controlfp_FPU_SETCW macro trong C. Vì vậy, tại thời điểm này tôi xem xét lựa chọn của tôi là

  1. Sử dụng Data.Ratio
  2. Sử dụng Data.Fixed
  3. Sử dụng Data.Fixed.Binary từ gói fixed-point
  4. Viết mô-đun để gọi _ controlfp (hoặc tương đương cho mỗi nền tảng) qua FFI.
  5. Có thể có điều gì đó khác?

Một vấn đề với thư viện số học điểm cố định là chúng không có, ví dụ: hàm lượng giác hoặc logarit được định nghĩa cho chúng (vì chúng không thực hiện loại lớp Floating) vì vậy tôi đoán tôi sẽ cần cung cấp bảng tra cứu cho tất cả các hàm trong dữ liệu hạt giống mô phỏng. Hay là có cách nào tốt hơn?

Cả hai thư viện điểm cố định cũng ẩn các nhà xây dựng newtype, vì vậy bất kỳ (de-) serialization sẽ cần phải được thực hiện thông qua toRational/fromRational theo như tôi có thể nói, và cảm thấy như nó sẽ thêm chi phí không cần thiết.

Bước tiếp theo của tôi là đánh giá các giải pháp điểm cố định khác nhau để xem hiệu suất thế giới thực, nhưng trong khi đó, tôi sẵn sàng đưa ra lời khuyên bạn có về chủ đề này.

+0

Nền tảng có thể đa dạng như thế nào?Trên mọi thứ hợp lý, bạn nên sử dụng 'Double', sử dụng' -msse2' trên nền tảng 32 bit (theo mặc định trên 64 bit). –

+0

Daniel Fischer: Tôi không cần phải hỗ trợ bất kỳ nền tảng bí truyền nào, nhưng khác nhau (hiện đại) hương vị của Windows, Linux và MacOSX trong cả 32-bit và 64-bit. Đọc [trang này] (http://gafferongames.com/networking-for-game-programmers/floating-point-determinism/) đã để lại cho tôi khái niệm chỉ dựa vào hướng dẫn sse2 có thể không đủ trong thế giới thực (tm)) và việc sử dụng số học điểm cố định có thể ít đau đớn hơn nhiều. – shang

Trả lời

7

Điều 11 của tiêu chuẩn IEEE 754-2008 mô tả những gì cần thiết cho các kết quả dấu phẩy động có thể lặp lại. Trong số những thứ khác, bạn cần các quy tắc đánh giá biểu hiện rõ ràng. Một số ngôn ngữ cho phép biểu thức dấu phẩy động được đánh giá với độ chính xác cao hơn hoặc cho phép một số thay đổi biểu thức (chẳng hạn như đánh giá a*b+c trong một lệnh duy nhất thay vì tách riêng và thêm hướng dẫn). Tôi không biết về ngữ nghĩa của Haskell. Nếu Haskell không ánh xạ chính xác các biểu thức đến các phép toán dấu chấm động xác định, thì nó không thể hỗ trợ các kết quả dấu phẩy động lặp lại.

Ngoài ra, vì bạn đề cập đến hàm lượng giác và logarit, hãy lưu ý rằng những điều này thay đổi từ triển khai sang triển khai. Tôi không biết về bất kỳ thư viện toán học nào cung cấp các cách triển khai được làm tròn chính xác của mọi hàm toán chuẩn. (CRLibm là một dự án để tạo một.) Vì vậy, mỗi thư viện toán học sử dụng các xấp xỉ riêng của chúng và kết quả của chúng thay đổi đôi chút. Có lẽ bạn có thể làm việc xung quanh điều này bằng cách bao gồm một thư viện toán học với mã mô phỏng của bạn, để nó được sử dụng thay cho mỗi thư viện mặc định của Haskell.

Các quy trình chuyển đổi giữa dấu phẩy động và số thập phân cũng là một nguồn khác biệt giữa các lần triển khai. Đây là một vấn đề ít hơn nó được sử dụng bởi vì các thuật toán để chuyển đổi một cách chính xác được biết đến. Tuy nhiên, nó là cái gì đó có thể cần phải được kiểm tra trong mỗi lần thực hiện.

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