고정 소수점 대 부동 소수점 계산의 상대적 장점?


9

배정도 부동 소수점 숫자를 사용하여 빠른 x86 컴퓨터에서 작동하는 디지털 신호 처리 시스템이 있습니다 . 부동 소수점 표현의 거대한 동적 범위를 실제로 사용하지 않는 것이 나에게 발생했습니다. 모든 수량은 ± 32768 범위에 쉽게 맞습니다.

내 질문 : 고정 소수점 계산으로 전환하면 수치 정확도 (높은 우선 순위) 또는 계산 시간 (낮은 우선 순위)에 이점이 있습니까?

물론 정답은 고정 소수점 계산에 사용할 수있는 비트 수에 따라 다릅니다. 일반적인 고정 소수점 시스템은 몇 비트의 정밀도를 사용합니까? x86-64 에서 64 비트 ( 16 비트 정수 부분, 48 비트 소수 부분 )로 고정 소수점 계산을 효율적으로 수행 할 수 있습니까?

CPU 전력이 제한적인 상황에서만 고정 소수점 계산이 사용된다고 항상 생각했습니다. CPU 전원이 문제가되지 않을 때는 고정 소수점 계산을 사용하는 것이 합리적입니까?


배정 밀도 부동 소수점 값이 제공하는 ~ 15 이상의 유효 숫자가 실제로 필요합니까? 광범위한 일반화는 좋지 않지만 모든 고정 소수점 DSP 시스템의 집합을 살펴보면 16 비트 정수가 가장 일반적인 형식 일 가능성이 높습니다.
Jason R

답변:


7

정수의 수치 정확도는 정수 분해능이 더 나은 경우 부동 소수점의 수치 정확도보다 우수합니다. 복소수에는 52 소수 비트가 있으므로 배정 밀도 부동 소수점은 ( ) 보다 훨씬 큰 약 에서 정수보다 해상도가 떨어집니다 . 따라서 정수로 가면 수치 정확도가 나아지지 않습니다.252215

두 번째 문제는 속도입니다. 대답은 하드웨어에 따라 다릅니다. 여러 고정 소수점 곱셈 / 누적 코어가있는 디지털 신호 프로세서에서 프로그램을 실행하는 경우 고정 소수점에서 훨씬 빠릅니다. 반면에 x86 칩의 경우 고정 지점에서 실제로 느려질 수 있습니다 . 나는 당신이 한 번 말한 것을 정확하게했고 내 실행 시간이 증가하는 것을 보았습니다.

인터넷에서 몇 가지 검색을 한 후에 나는 이것이 일반적이라는 것을 알았습니다. 고정 소수점 하드웨어는 포인터 산술과 같은 일반 고정 소수점 동작과 공유되는 반면 고정 소수점으로 전환 할 때 아무것도하지 않는 전용 부동 소수점 프로세서가 있기 때문입니다.

처리 속도를 높이려면 배정도 부동 소수점에서 단 정밀도 부동 소수점으로 변경하는 것이 좋습니다. 속도가 크게 향상됩니다. 물론 그것은 당신의 수치 정확도를 떨어 뜨릴 것입니다.


나는 내가 내 글을 쓸 때이 답변이 말하는 것을 의미했습니다. 이게 더 낫다 내가 실수하지 않으면 일부 컴퓨터 (64 비트?)에서 기본 하드웨어 부동 소수점 유형이 두 배이므로 단일 정밀도 (4 바이트) 부동 소수점을 사용하면 실제로 느려질 수 있습니다. 어쨌든 이것은 고려해야 할 사항입니다.
heltonbiker

단일 정밀도 수레 23 비트 mantissae이, 복식은 52 비트를 가지고있다.
Paul R

배정도 부동 소수점의 대안으로 16 비트 정수 + 48 비트 분수를 제안합니다. 32768을 언급하여 내 값이이 범위에 쉽게 맞을 것임을 나타냅니다. 이 값들에 대한 제한을 감안할 때, Q16.48은 배정도 부동 소수점보다 더 큰 수치 정확도를 제공한다고 생각합니다.
nibot

1
@nibot 좋아. 복식은 -16에서 +16까지의 정밀도가 좋으며 분수 정수는 최대 -32769 및 +32768의 정밀도를 갖습니다. 물론, 그 이상으로는 아무것도 표현할 수 없었습니다. 그들은 또한 복식보다 느릴 것입니다. 나에게 제한된 범위와 느린 속도는 거래 차단기이지만 YMMV입니다.
Jim Clay

6

고정 소수점의 장점은 대부분 전력 측면에서 볼 수 있습니다 (예 : 프로세서 하드웨어를 선택하거나 프로세서가 사용하지 않는 기능 장치를 종료하는 경우). 고정 소수점 단위는 부동 소수점보다 주어진 기술 및 작동 문제 속도에 대해 일반적으로 더 작습니다 (트랜지스터가 적고 와이어가 짧으며 MAC 당 극복 할 수있는 정전 용량이 적음).

그러나 방대한 양의 일반적인 현대 프로세서 (서버, PC 및 모바일)는 정수 곱셈기보다 더 빠르고 빠른 FPU (특히 단정도 FP 장치)를 가지며 대부분의 시스템 전원은 FPU를 사용하지 않으므로 고정을 사용합니다. -point는 이러한 제품에서 일반적인 DSP 계산에 대한 이점이 거의 없거나 전혀 없으며 순수한 성능면에서 단점이 될 수 있습니다. 현재 기술을 사용하면 고정 소수점에 대한 모든 이점은 대부분 버튼 크기의 장치와 같은 소형 임베디드 제품에서 발생합니다.

그러나 메모리 및 프로세서 캐시 풋 프린트도 고려하십시오. 데이터 캐시에 큰 계산을 완벽하게 맞추기 위해 더 작은 데이터 유형 (짧은 int 및 float)을 영리하게 사용하면 순수한 FPU 대역폭 이점을 상쇄 할 수 있습니다.


2
성능과 관련하여 캐시 문제의 중요성에 대해 언급하면 ​​+1입니다. 최신 x86 프로세서에서 캐시를 염두에두고 알고리즘을 설계 하면 성능에 영향을 줄 수 있습니다 .
Jason R

5

단 정밀도 부동 소수점을 두 배로하는 것이 좋습니다. 이렇게하면 메모리 대역폭, 캐시 공간 및 스토리지 요구 사항이 절반으로 줄어들고 일부 수학 연산이 더 빨라집니다. 또한 추가 최적화가 필요한 경우 4 방향 SIMD의 가능성을 열어줍니다.

고정 소수점은 FPU가없는 경우에만 실제로 가치가 있습니다. 대부분의 최신 x86 CPU에는 2 개의 FPU가 있으므로 고정 소수점을 사용하면 얻을 수있는 것이 없으며 고정 소수점의 경우 성능이 크게 저하 될 수 있습니다. (또한 고정 소수점은 곱셈과 같은 연산을 위해 부동 소수점에 비해 추가 명령이 필요합니다.)


나는에 관심이 있어요 증가 를 감소하지, 수치의 정확성을.
nibot

고정 소수점이 52 비트의 정밀도와 이미 큰 다이나믹 레인지를 가진 double에 비해 수치 정확도를 향상시키는 것을 어떻게 보십니까?
Paul R

글쎄, 52 비트가 넘는 고정 소수점 형식을 사용할 수 있습니다.
nibot

고정 소수점 표현의 정수 부분에는 적어도 16 비트가 필요하기 때문에 64 비트 이상이 걸릴 수 있으므로 CPU에 기본 정수 명령이없는 형식을 찾고있을 것입니다. 어떤 경우에는 기존의 큰 정수 라이브러리 또는 이와 유사한 것을 사용할 수도 있습니다. 그래도 대답해야 할 가장 중요한 질문은 얼마나 정밀 해야 합니까?
Paul R

3

여기에 제공된 매우 좋은 답변 외에도 몇 가지 추가 할 가치가 있습니다.

  • 처리하는 데이터의 동적 범위에 대해 매우 기본적인 요구 사항이 있어도 수행되는 일부 작업에 대해 여전히 우수한 정밀도가 필요한 상황이 있습니다. 예를 들어 IIR 필터를 적용하려는 경우 상대적으로 작은 계수가 필요합니다. 잘라 내면 불안정 할 수 있습니다. 시스템에 피드백이 제공되는 즉시 고정 소수점을 사용할 때 양자화 / 절단 문제가 다시 발생할 가능성이 높습니다. 필터 토폴로지 및 절단 / 분수 저장 체계와 같은 사항에 훨씬 더주의해야합니다.
  • 많은 DSP / DSC 아키텍처와 달리 x86에는 포화 정수 연산이 없습니다 (물론 표준 스칼라 코드가 아니라 SSE에 있습니다). 이는 오버플로의 경우 값 변경 표시 및 "래핑"과 같은 나쁜 일이 발생할 수 있음을 의미합니다. 오버플로 및 동적 범위에주의하거나 피연산자 범위에 테스트를 뿌려야 합니다.모든 코드에서. 성능이 심각하게 저하 될 수 있습니다. 반면에, 동적 범위가 클수록 더 많은 "헤드 룸"을 제공하고 오버플로로 인해 치명적인 오류가 발생하지 않기 때문에 부동 소수점은 이러한 문제에 대해보다 탄력적입니다. 데스크탑 컴퓨터에서 실행되는 대부분의 오디오 신호 처리 코드는 -1.0 .. 1.0 범위, 단정도 또는 배정도를 사용합니다. 이것은 수백 dB 이상의 헤드 룸을 제공합니다. 두 가지 방법으로 오디오 신호 처리 코드를 작성했으며 부동 소수점을 사용할 때 신호를 명시 적으로 클리핑 / 포화해야하는 경우가 거의 없습니다. 일반적으로 신호 처리 체인의 끝이나 피드백이 발생하는 위치에 있습니다.

1

고려해야 할 사항 :

  • 대부분의 최신 프로세서는 수년 동안 부동 소수점 숫자 처리를 최적화 해 왔으며 GPU에서도 이미 매우 성공적으로 사용되고 있습니다.
  • 고정 소수점 계산은 데이터를 손상 시키며 산술 연산이 제대로 조정되지 않은 경우 심각한 문제를 일으킬 수 있습니다 (따라서 고정 소수점 숫자가 부동 소수점 1로 대체 됨).
  • 데이터를 보존하기 위해 부호있는 반바지를 사용하더라도 (데이터 로거가 16 비트 정밀도를 사용함) 계산을 부동 소수점으로 수행 한 다음 다시 정수로 변환해야합니다. 그렇지 않으면 양자화 및 앨리어싱과 같은 아티팩트가있을 수 있습니다.

마지막으로, 실제 데이터는 소중하고 컴퓨터의 맹목적인 숫자 처리는 겸손한 정신적 인 일이라고 생각합니다. 컴퓨터는 데이터와 사용자를 위해 많은 노력을 기울여야하며 쇼의 실제 별처럼 취급되지 않아야합니다.


나는 16 비트 반바지를 사용하여 수량을 포함한다는 것이 아니라 16 비트 정수 부분과 48 비트 분수 부분이있는 64 비트 고정 소수점 형식과 같은 것을 의미한다는 의미는 아닙니다. 어쨌든 대부분의 지수 비트를 부동 소수점 형식으로 사용하지 않는 경우 대신 비트를 사용하여 추가 유효 숫자를 제공하면 수치 정확도가 향상됩니까?
nibot

16 비트 정수 + 48 비트 분수를 원래 질문에 추가해야합니다. 마치215혼란을 일으키고 있습니다.
Christopher Felton

한 가지 더 : DSP.SE 대신 StackOverflow가 한 형식의 장단점에 대한 더 깊은 이유를 얻는 이상적인 장소가 될 것 같습니다.
heltonbiker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.