2014-12-30 12 views
5

Tôi có trình tạo số ngẫu nhiên xuất ra giá trị từ (0, 1], nhưng tôi cần cung cấp đầu ra cho hàm trả về vô cực ở 0 hoặc 1. Làm cách nào tôi có thể sau khi xử lý số được tạo thành trong (0, 1) mà không có bất kỳ chi nhánh nào, vì mục đích này nhằm thực thi trên GPU?Thay đổi (0, 1] thành (0, 1) mà không cần phân nhánh

Tôi giả sử một cách là thêm một hằng số nhỏ và sau đó lấy giá trị mod 1. từ (ɛ, 1 + ɛ], được chuyển thành [ɛ, 1). Có cách nào tốt hơn không? là gì?

+0

Ngôn ngữ này được triển khai bằng ngôn ngữ nào? – OMGtechy

+0

Bạn đang sử dụng ngôn ngữ nào? Sao chép và sửa đổi (hoặc ít nhất là đọc và hiểu) máy phát số giả ngẫu nhiên hiện tại của bạn có lẽ là cách tiếp cận tốt nhất của bạn. – Degustaf

+0

Để sử dụng cụ thể của tôi, tôi quan tâm đến một cái gì đó có thể được sử dụng với Tăng tốc trong Haskell. Trình tạo số ngẫu nhiên là từ Curand. – yong

Trả lời

2

Cập nhật 1

Trong Haskell, bạn có thể tìm thấy ɛ bằng cách sử dụng floatRange. Phần C++ bên dưới được áp dụng khác.


Lưu ý: Câu trả lời dưới đây được viết trước khi OP bày tỏ câu trả lời nên cho Haskell

Bạn không nêu rõ ngôn ngữ thực hiện trong câu hỏi, vì vậy tôi sẽ giả sử C++ đây.

Hãy xem std::nextafter.

Điều này sẽ cho phép bạn nhận giá trị có thể tiếp theo mà bạn có thể thêm vào giới hạn trên, điều này sẽ dẫn đến mã của bạn hoạt động như thể nó đã được bao gồm.

Đối với các phân nhánh, bạn có thể quá tải chức năng để tránh các chi nhánh. Tuy nhiên, điều này dẫn đến sao chép mã.

Tôi muốn khuyên bạn nên cho phép nhánh và cho phép trình biên dịch tối ưu hóa vi mô trừ khi bạn thực sự cần hiệu suất và có thể cung cấp triển khai chuyên biệt hơn so với chuẩn (see Pascal Cuoq's comment).

+0

Lần cuối cùng tôi xem xét việc thực thi 'nextafter' trên x86-64, nó có 3 nhánh có điều kiện (có thể đảm bảo rằng các cờ IEEE 754 khác nhau nhận được giá trị chính xác), vì vậy bất kỳ giải pháp nào sử dụng' nextafter' chắc chắn là không 't' không có nhánh ', mặc dù người ta có thể tạo một phiên bản giới hạn không có nhánh của riêng mình. –

+0

@PascalCuoq Trong khi điều này cũng có thể đúng, bằng cách sử dụng một hàm thư viện chuẩn, bạn sẽ có được những người triển khai thư viện giỏi nhất có thể. Nếu bạn có thể đến với tốt hơn, và thư viện là nguồn mở, tôi khuyên bạn nên thực hiện một yêu cầu kéo với những cải tiến của bạn. – OMGtechy

+2

Việc triển khai tôi đã đề cập đến: https://github.com/aosm/Libm/blob/master/Source/Intel/nextafter.s Phiên bản đó là mã nguồn mở, nhưng phiên bản mới nhất thì không. Dù sao, đối với 'nextafter' như đối với nhiều hàm dấu phẩy động, có những cải tiến to lớn chỉ có thể trong ngữ cảnh (ở đây: đối số là từ 0 đến 1) và không thích hợp cho các hàm thư viện phải hoạt động trong tất cả các trường hợp. Ngoài ra các trình biên dịch hiện đại hoàn toàn không thể suy ra ý định và chuyên chức năng chuẩn cho bạn. –

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