Giá trị tương đối của điểm cố định so với tính toán điểm nổi?


9

Tôi có một hệ thống xử lý tín hiệu số hoạt động trên một máy x86 nhanh sử dụng các số dấu phẩy động chính xác kép . Tôi nhận ra rằng tôi không thực sự sử dụng phạm vi động lớn của biểu diễn dấu phẩy động - tất cả các đại lượng dễ dàng nằm trong phạm vi ± 32768.

Câu hỏi của tôi: có thể là việc chuyển sang tính toán điểm cố định sẽ mang lại lợi ích về độ chính xác bằng số (mức ưu tiên cao) hoặc thời gian tính toán (mức độ ưu tiên thấp)?

Tất nhiên, câu trả lời phụ thuộc vào số lượng bit có sẵn để tính toán điểm cố định. Có bao nhiêu bit chính xác để sử dụng các hệ thống điểm cố định điển hình? Có thể thực hiện hiệu quả các phép tính điểm cố định, với 64 bit ( phần nguyên 16 bit, phần phân số 48 bit ) trên x86-64 không?

Tôi đã luôn nghĩ rằng các phép tính điểm cố định chỉ được sử dụng trong các tình huống mà sức mạnh của CPU bị hạn chế - có nên sử dụng các phép tính điểm cố định khi năng lượng CPU không đáng lo ngại không?


Bạn có thực sự cần nhiều hơn ~ 15 con số có ý nghĩa mà giá trị dấu phẩy động chính xác kép mang lại cho bạn không? Mặc dù khái quát hóa rộng là xấu, tôi sẽ nói rằng nếu bạn nhìn vào tổng hợp của tất cả các hệ thống DSP điểm cố định, số nguyên 16 bit có thể là định dạng phổ biến nhất.
Jason R

Câu trả lời:


7

Độ chính xác bằng số của số nguyên sẽ chỉ tốt hơn độ chính xác bằng số của số float nếu độ phân giải số nguyên tốt hơn. Nhân đôi có 52 bit phân đoạn, do đó, phao có độ chính xác kép có độ phân giải kém hơn số nguyên ở khoảng , lớn hơn nhiều so với 32768 ( 2 15 ). Vì vậy, không, độ chính xác bằng số sẽ không tốt hơn nếu bạn chuyển sang số nguyên.252215

Vấn đề thứ hai là tốc độ. Câu trả lời là: nó phụ thuộc vào phần cứng. Nếu bạn đang chạy chương trình của mình trên bộ xử lý tín hiệu kỹ thuật số có nhiều điểm nhân / tích lũy điểm cố định thì có, nó sẽ nhanh hơn nhiều ở điểm cố định. Mặt khác, trên chip x86, nó thực sự có thể sẽ chậm hơn ở điểm cố định. Tôi đã làm chính xác những gì bạn đang nói về một lần và thấy thời gian thực hiện của tôi tăng lên.

Sau khi thực hiện một số tìm kiếm trên internet tôi phát hiện ra rằng đó là phổ biến. Lý do là bởi vì nó có bộ xử lý dấu phẩy động chuyên dụng không hoạt động khi bạn chuyển sang điểm cố định, trong khi phần cứng điểm cố định được chia sẻ với hành động điểm cố định thông thường, chẳng hạn như số học con trỏ.

Nếu bạn muốn tăng tốc độ xử lý, cách thực hiện là thay đổi từ phao có độ chính xác kép sang phao có độ chính xác đơn. Điều đó sẽ tạo ra một sự gia tăng đáng kể về tốc độ. Điều đó, tất nhiên, sẽ làm giảm độ chính xác số của bạn mặc dù.


Tôi có nghĩa là những gì câu trả lời này nói khi tôi viết của tôi. Cái này thì tốt hơn. Ngoài ra, nếu tôi không nhầm, tôi đã đọc ở đâu đó rằng trên một số máy tính (có thể là 64 bit?), Loại dấu phẩy động phần cứng nguyên gốc là gấp đôi, do đó, sử dụng các số float chính xác (bốn byte) có thể chậm hơn. Dù sao đây cũng là một cái gì đó để xem xét.
heltonbiker

Phao chính xác đơn có mantissae 23 bit, đôi có 52 bit.
Paul R

Tôi đang đề xuất phân số nguyên 16 bit + 48 bit thay thế cho dấu phẩy động chính xác kép. Tôi đã đề cập 32768 để chỉ ra rằng các giá trị của tôi sẽ dễ dàng phù hợp với phạm vi này. Với các hạn chế đối với các giá trị này, tôi nghĩ rằng Q16.48 sẽ cung cấp độ chính xác số lớn hơn so với điểm nổi chính xác kép.
nibot

1
@nibot Được rồi. Các nhân đôi sẽ có độ chính xác tốt hơn từ -16 đến +16 và các số nguyên phân số sẽ có độ chính xác tốt hơn ở nơi khác lên đến -32769 và +32768. Tất nhiên, họ không thể đại diện cho bất cứ điều gì ngoài điều đó. Họ cũng sẽ chậm hơn gấp đôi. Đối với tôi, phạm vi hạn chế và tốc độ chậm sẽ là bộ ngắt thỏa thuận, nhưng YMMV.
Jim Clay

6

Ưu điểm của điểm cố định chủ yếu là về sức mạnh (chẳng hạn như khi bạn có lựa chọn phần cứng bộ xử lý hoặc bộ xử lý tốt trong việc tắt các đơn vị chức năng không sử dụng). Đó là bởi vì các đơn vị điểm cố định thường nhỏ hơn (ít bóng bán dẫn hơn, dây ngắn hơn, điện dung ít hơn để khắc phục trên mỗi MAC) cho một tỷ lệ phát hành công nghệ và hoạt động nhất định, so với điểm nổi.

Tuy nhiên, một số lượng lớn các bộ xử lý hiện đại phổ biến (máy chủ, PC và thậm chí cả thiết bị di động), có nhiều FPU (đặc biệt là các đơn vị FP chính xác đơn) so với số nhân và hầu hết năng lượng hệ thống không sử dụng FPU, do đó sử dụng cố định -point sẽ có ít hoặc không có lợi thế cho tính toán DSP điển hình trên các sản phẩm này và có thể là một bất lợi về hiệu suất thuần túy. Sử dụng công nghệ hiện tại, bất kỳ lợi thế nào đối với điểm cố định sẽ chủ yếu tích lũy chủ yếu trong các sản phẩm nhúng nhỏ, chẳng hạn như các thiết bị có kích thước nút.

Tuy nhiên cũng xem xét bộ nhớ cache và bộ nhớ cache bộ xử lý. Việc sử dụng thông minh các loại dữ liệu nhỏ hơn (int ngắn và float) để phù hợp với một tính toán lớn hoàn toàn trong bộ đệm dữ liệu có thể bù đắp cho bất kỳ lợi thế băng thông FPU thuần túy nào.


2
+1 để đề cập đến tầm quan trọng của các vấn đề về bộ đệm đối với hiệu suất. Trên các bộ xử lý x86 hiện đại, việc thiết kế thuật toán của bạn với bộ nhớ cache có thể có ảnh hưởng rất lớn đến hiệu suất.
Jason R

5

Thích các độ chính xác đơn tăng gấp đôi - điều này sẽ giảm một nửa băng thông bộ nhớ, dấu chân bộ nhớ cache và các yêu cầu lưu trữ và làm cho một số thao tác toán học nhanh hơn. Nó cũng mở ra khả năng SIMD 4 chiều nếu cần tối ưu hóa thêm.

Điểm cố định chỉ thực sự đáng giá khi bạn không có FPU - hầu hết các CPU x86 hiện đại đều có hai FPU nên không có gì đạt được từ việc sử dụng điểm cố định và hiệu suất thậm chí có thể kém hơn đáng kể với điểm cố định. (Cũng lưu ý rằng điểm cố định yêu cầu các hướng dẫn bổ sung so với điểm nổi cho các hoạt động như nhân.)


Tôi quan tâm đến việc tăng độ chính xác của số, không làm giảm nó.
nibot

Làm thế nào để bạn thấy điểm cố định cải thiện độ chính xác bằng số so với gấp đôi, có độ chính xác 52 bit và phạm vi động rất lớn?
Paul R

Chà, tôi có thể sử dụng định dạng điểm cố định với hơn 52 bit.
nibot

Vì rõ ràng bạn cần ít nhất 16 bit cho phần nguyên của biểu diễn điểm cố định, điều này sẽ đưa bạn vượt quá 64 bit, do đó có lẽ bạn đang xem một định dạng mà CPU của bạn thậm chí không có bất kỳ hướng dẫn số nguyên gốc nào. Trong trường hợp đó, bạn có thể chỉ cần sử dụng một thư viện số nguyên lớn hiện có hoặc tương tự. Câu hỏi quan trọng nhất để trả lời là: bạn thực sự cần bao nhiêu độ chính xác ?
Paul R

3

Ngoài những câu trả lời rất hay được cung cấp ở đây, một vài điều đáng để thêm vào:

  • Có những tình huống ngay cả khi bạn có các yêu cầu rất cơ bản về phạm vi động của dữ liệu bạn xử lý, bạn vẫn sẽ cần độ chính xác rất tốt cho một số thao tác được thực hiện trên đó - ví dụ: bạn sẽ muốn áp dụng bộ lọc IIR. đòi hỏi hệ số tương đối nhỏ; và cắt ngắn chúng sẽ gây ra sự bất ổn. Ngay khi hệ thống của bạn có phản hồi, sẽ có nhiều vấn đề về lượng tử hóa / cắt xén sẽ cắn bạn khi sử dụng điểm cố định - bạn phải cẩn thận hơn nhiều về những thứ như cấu trúc liên kết bộ lọc và cắt xén / tiết kiệm phân số.
  • Không giống như nhiều kiến ​​trúc DSP / DSC, x86 không có các hoạt động số nguyên bão hòa (tốt, nó có trong SSE, không phải trên mã vô hướng tiêu chuẩn). Điều này có nghĩa là trong trường hợp tràn, những điều xấu có thể xảy ra - giá trị thay đổi dấu hiệu và "bao bọc". Bạn phải hết sức thận trọng với tràn và phạm vi động, hoặc rắc thử nghiệm trên phạm vi toán hạngtất cả trên mã của bạn. Điều này có thể làm tổn thương nghiêm trọng hiệu suất. Khi so sánh, điểm nổi có khả năng phục hồi tốt hơn đối với các vấn đề này, bởi vì phạm vi động lớn mang lại cho bạn nhiều "khoảng trống" hơn và tràn ra sẽ không dẫn đến những thất bại thảm hại. Hầu hết mã xử lý tín hiệu âm thanh chạy trên máy tính để bàn đang sử dụng phạm vi -1.0 .. 1.0, độ chính xác đơn hoặc kép; do đó, điều này mang lại hơn hàng trăm dB của khoảng không. Tôi đã viết mã xử lý tín hiệu âm thanh bằng cả hai cách tiếp cận và khi sử dụng dấu phẩy động, chỉ có một vài chỗ khi tôi phải kẹp / bão hòa tín hiệu một cách rõ ràng - thường chỉ ở cuối chuỗi xử lý tín hiệu hoặc ở những nơi xảy ra phản hồi.

1

Một số điểm cần xem xét:

  • Hầu hết các bộ xử lý hiện đại đã tối ưu hóa việc xử lý số dấu phẩy động trong nhiều năm và thậm chí GPU cũng đang được sử dụng cho điều đó, rất thành công;
  • Tính toán điểm cố định làm tổn thương dữ liệu của bạn và có thể gây ra sự cố nghiêm trọng khi các phép toán số học không được điều hòa tốt (đó là lý do tại sao các số điểm cố định được thay thế bằng các dấu phẩy động);
  • Ngay cả khi bạn sử dụng quần short đã ký để CONTAIN dữ liệu của bạn (rất nhiều bộ dữ liệu sử dụng độ chính xác 16 bit), TÍNH TOÁN nên được thực hiện ở điểm nổi sau đó chuyển đổi trở lại thành số nguyên, nếu không có thể có các tạo tác như lượng tử hóa và răng cưa.

Là một từ cuối cùng, tôi nghĩ rằng dữ liệu trong thế giới thực của chúng ta là quý giá và việc bấm số mù của máy tính là một công việc mang tính khiêm tốn. Máy tính phải được đặt để thực hiện công việc nặng nhọc cho dữ liệu của bạn và cho bạn, và không được đối xử như thể đó là ngôi sao thực sự trong chương trình.


Tôi không có ý ám chỉ rằng tôi sẽ sử dụng quần short 16 bit để chứa số lượng của mình, nhưng đúng hơn là định dạng điểm cố định 64 bit với phần nguyên 16 bit và phần phân đoạn 48 bit. Động lực là, nếu tôi không sử dụng hầu hết các bit số mũ ở định dạng dấu phẩy động, liệu độ chính xác số của tôi có cải thiện nếu thay vào đó tôi sử dụng các bit đó để cung cấp thêm các chữ số có nghĩa?
nibot

215

Một điều nữa: Dường như với tôi rằng StackOverflow (thay vì DSP.SE, ở đây) sẽ là nơi lý tưởng để có được những lý do sâu sắc hơn về ưu và nhược điểm của định dạng này so với định dạng khác.
heltonbiker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.