2012-03-14 38 views
7

Tôi đang đọc qua mã cho các thói quen tối ưu hóa (Nelder Mead, SQP ...). Ngôn ngữ là C++, Python. Tôi quan sát thấy rằng thường chuyển đổi từ đôi sang phao được thực hiện, hoặc các phương pháp được nhân đôi với resp kép. đối số nổi. Tại sao nó có lợi nhuận trong mã thói quen tối ưu hóa, và nó có ý nghĩa không? Trong mã của riêng tôi trong C++, tôi có nên cẩn thận đối với các kiểu double và float hay không và tại sao?Hoạt động tối ưu hóa đôi hoặc nổi -

Trân trọng.

+0

Nếu bạn viết mã của riêng bạn bằng C++ tại sao bạn chưa gắn thẻ câu hỏi phù hợp? Tôi có thiếu thứ gì đó tinh tế không? –

+0

@HighPerformanceMark Tôi đang đi qua mã trong python (đặc biệt là nguồn scipy) và c + +, và writting thói quen của riêng tôi kết hợp một số phương pháp. Tôi cũng nên gắn thẻ C++. – octoback

+1

Ngoài những điều được đề cập, để phân chia và căn bậc hai, sự khác biệt về hiệu suất giữa float và double là khá lớn. Tuy nhiên, những hoạt động đó nên tránh trong mã hiệu suất. – harold

Trả lời

6

Thường thì lựa chọn giữa doublefloat được thực hiện nhiều hơn về nhu cầu không gian so với tốc độ. Bộ xử lý hiện đại có khả năng hoạt động trên double khá nhanh.

Giá trị nổi có thể nhanh hơn gấp đôi khi sử dụng hướng dẫn SIMD (chẳng hạn như SSE) có thể hoạt động trên nhiều giá trị cùng một lúc. Ngoài ra, nếu các hoạt động nhanh hơn đường ống bộ nhớ, các yêu cầu bộ nhớ nhỏ hơn của float sẽ tăng tốc độ tổng thể.

+1

Độ chính xác cũng là một mối quan tâm quan trọng. Việc thay đổi độ chính xác trong các kiểu dữ liệu có thể làm ảnh hưởng đến độ chính xác của kết quả trong một số trường hợp. –

2

lần khác mà tôi đã đi qua sự cần thiết phải xem xét các lựa chọn giữa đôi và nổi loại về tối ưu hóa bao gồm:

  • Networking. Việc gửi dữ liệu chính xác kép qua kết nối ổ cắm rõ ràng sẽ cần nhiều thời gian hơn gửi một nửa số lượng dữ liệu .
  • Bộ xử lý được nhúng và di động chỉ có thể xử lý các phép tính đơn chính xác tốc độ cao tốc độ hiệu quả một cách hiệu quả trên bộ xử lý.

Như đã đề cập trong câu trả lời khác, bộ xử lý máy tính để bàn hiện đại có thể xử lý độ chính xác gấp đôi Xử lý khá nhanh. Tuy nhiên, bạn phải tự hỏi mình nếu yêu cầu thực hiện chính xác hai lần đôi. Tôi làm việc với âm thanh, và thời gian duy nhất mà tôi có thể nghĩ đến nơi tôi cần xử lý dữ liệu chính xác gấp đôi sẽ là khi sử dụng bộ lọc bậc cao trong đó lỗi số có thể tích lũy. Hầu hết thời gian này có thể tránh được bằng cách chú ý kỹ hơn đến thiết kế thuật toán. Có, tất nhiên, , các ứng dụng khoa học hoặc kỹ thuật khác khi cần có dữ liệu chính xác là số chính xác để thể hiện chính xác phạm vi động lớn .

Mặc dù vậy, câu hỏi về nỗ lực chi tiêu để xem xét loại dữ liệu để sử dụng thực sự phụ thuộc vào nền tảng mục tiêu của bạn. Nếu nền tảng có thể khủng hoảng thông qua tăng gấp đôi với chi phí không đáng kể và bạn có bộ nhớ để rảnh rỗi sau đó không có cần phải quan tâm chính mình. Cấu hình các phần nhỏ của mã kiểm tra để tìm hiểu.

2

Trong các thuật toán tối ưu hóa nhất định, lựa chọn giữa doublefloatkhông thực hiện nhiều yêu cầu về không gian hơn tốc độ. Ví dụ: với các phương pháp hình phạt hoặc rào cản được sử dụng cho phương pháp điểm nội tuyến trong tối ưu hóa phi tuyến, float không đủ chính xác so với double và sử dụng float giây trong thuật toán sẽ mang lại rác thải. Vì lý do này, hình phạt và phương pháp rào cản đã không được sử dụng trong những năm 1960, nhưng được tái khám phá sau này với sự ra đời của loại dữ liệu chính xác kép. (Để biết thêm về các phương pháp này, hãy tham khảo Lập trình phi tuyến: Kỹ thuật giảm thiểu không bị giới hạn tuần tự (Kinh điển trong Toán học ứng dụng) bởi Fiacco và McCormick.)

Một xem xét khác là điều kiện của các hệ thống tuyến tính cơ bản được giải quyết trong nhiều thuật toán tối ưu hóa. Nếu các hệ thống tuyến tính mà bạn đang giải quyết trong một cái gì đó giống như một phép lặp Newton là đủ điều kiện, bạn sẽ không thể có được một giải pháp chính xác cho các hệ thống đó.

Chỉ khi mất chính xác sẽ không gây nguy hiểm cho số học của bạn, bạn nên cân nhắc thay thế double s bằng float s; ngay cả khi các ràng buộc về không gian buộc bạn phải làm như vậy, bạn nên đảm bảo rằng độ chính xác của các kết quả bằng số của bạn không bị xâm phạm. Khi đủ chính xác được đảm bảo cho các vấn đề bạn đang làm việc, bạn có thể lo lắng về không gian và tối ưu hóa hiệu suất. Bạn có thể sử dụng CUTEr test set để xác thực các quy trình tối ưu hóa của mình.