나누기가 다른 산술 연산보다 훨씬 더 복잡한 이유는 무엇입니까?


39

최근에 칩이없는 칩에서 정수 나누기 연산이 필요한 경우가 발생했습니다 (ARM Cortex-A8). 그 이유를 연구하려고 노력하는 동안, 나는 일반적으로 거의 모든 정수 (또는 고정 소수점) 아키텍처에서 더하기, 빼기 또는 곱하기보다 더 많은주기가 일반 부서에서 필요하다는 것을 알았습니다. 왜 이런 경우입니까? 다른 모든 것과 마찬가지로 2 계층 AND-OR 논리로 표현할 수 없습니까?

답변:


34

나눗셈은 유클리드 측정을 사용하여 몫의 결과를 나머지로 이동해야하는 반복 알고리즘입니다 ( 2 참조) . 반면, 곱셈은 (고정 된) 일련의 비트 조작 트릭으로 줄어들 수 있습니다.


2
예전에는 곱셈과 나눗셈이 모두 느리게 작동했습니다. 오늘날 곱셈은 약간 빠르지 만 (더하기 / 빼기보다 약간 느리지 만) 나눗셈은 여전히 ​​다른 것보다 느립니다. 나는 Newton-Raphson이 여전히 대부분 내부에서 숫자를 왕복하는 데 사용한다고 생각합니다.
JM

12
(주제 : "역 연산은 일반적으로 어렵습니다. 통합과 차별화를 비교해보십시오."-수행중인 작업이 기호인지 숫자인지에 따라 다릅니다. 차별화는 상징적으로 쉽지만 수치 적으로 어렵습니다. 통합은 기호 적으로 어렵지만 숫자로 나타납니다. 쉬운).
JM

1
좋아, 나는 쿠바 인이 다른 벌레의 캔이라고 말하면서 경찰에 갈 것이다. 그러나 적어도 1 차원의 경우, 직교는 미분보다 쉽다.
JM

1
어쨌든 항상 역은 쌍으로 나옵니다. 왜 하나를 "조작"이라고하고 다른 하나를 "역"이라고 부릅니까?
David Ketcheson

2
반복도 역수도 어렵지 않습니다. 나눗셈의 강도는 유클리드 측정을 사용하여 결과를 몫에서 나머지로 옮겨야한다는 사실에서 비롯됩니다. 나누기 알고리즘 정리를 참조하십시오 .

20

aterrel이 제안한 것처럼 모든 현재 CPU가 반복적 접근 방식을 사용하는 것처럼 보이지만 비 반복적 접근 방식에 대한 일부 작업이 수행되었습니다. 가변 정밀도 부동 소수점 나누기와 제곱근은 룩업 테이블과 테일러 시리즈 확장을 사용하여 FPGA 에서 부동 소수점 나누기와 제곱근의 반복적이지 않은 구현에 대해 이야기 합니다.

동일한 기술을 사용하여 이러한 작업을 단일주기 (지연 시간이 아닌 경우 처리량)로 줄일 수 있다고 생각할 수 있지만 거대한 조회 테이블 이 필요할 수 있으므로 실리콘 부동산의 넓은 영역이 필요합니다. .

왜 실현 가능하지 않습니까?

CPU를 설계 할 때 많은 절충점이 있습니다. 기능성, 복잡성 (트랜지스터 수), 속도 및 전력 소비는 모두 서로 관련되어 있으며 디자인 중에 이루어진 결정은 성능에 큰 영향을 줄 수 있습니다.

현대의 프로세서는 아마도 단일 사이클 에서 부동 소수점 분할을 수행하기에 충분한 트랜지스터를 실리콘에 전용으로 제공하는 기본 부동 소수점 유닛을 가질 있지만, 이러한 트랜지스터를 효율적으로 사용하기는 어려울 것입니다.

부동 소수점은 10 년 전에이 반복을 반복에서 비 반복으로 전환했습니다. 요즘에는 단일 프로세서 곱하기 및 곱하기 누산이 모바일 프로세서에서도 일반적입니다.

트랜지스터 예산을 효율적으로 사용하기 전에 분할과 같은 곱셈이 종종 반복적 인 방법으로 수행되었습니다. 당시 전용 DSP 프로세서는 대부분의 실리콘을 단일 고속 멀티플라이 누적 (MAC) 장치에 전용 할 수 있었습니다. Core2duo CPU는 부동 소수점 곱셈 대기 시간이 3이고 (값은 파이프 라인에서 나온 후 3 사이클이 됨) 한 번에 3 개의 곱셈이 가능하여 단일 사이클 처리량이 발생하는 반면 SSE2 장치는 한 번의 사이클로 여러 FP 배수를 펌프 아웃합니다.

현대의 CPU에는 거대한 실리콘 영역을 단일 사이클 분할 장치로 전용하는 대신 여러 장치가 있으며 각 장치는 병렬로 작업을 수행 할 수 있지만 특정 상황에 맞게 최적화됩니다. 실제로 SSE 와 같은 SIMD 명령어 나 Sandy Bridge 이상의 CPU 통합 그래픽 을 고려하면 CPU에 이러한 부동 소수점 나누기 단위 가 많이 있을 수 있습니다 .

일반적인 부동 소수점 나누기가 현대 CPU에 더 중요하다면, 단일 사이클을 만들기에 충분한 실리콘 면적을 할당하는 것이 합리적 일 수 있지만, 대부분의 칩 제조업체는 다른 것들을 위해 게이트를 사용하여 해당 실리콘을 더 잘 활용할 수 있다고 결정했습니다. . 따라서 하나의 작업은 느리지 만 전반적인 (일반적인 사용 시나리오의 경우) CPU는 더 빠르거나 적은 전력을 소비합니다.


내 지식으로는, 부동 소수점에 대한 단일 사이클 분할 대기 시간을 가진 칩은 없습니다. 예를 들어, Intel, AMD 및 VIA CPU에 대한 Agner Fog의 명령어 표에는 DIVPS (SSE 압축 부동 소수점 나누기)가 10-14 주기로 나열되어 있습니다. 단일 사이클 나누기 명령어가있는 하드웨어를 찾을 수 없지만 기꺼이 잘못 될 것입니다. 내가 말할 수있는 한 일반적이지 않습니다.
Bill Barth

@Bill-감사합니다. 필자는 DSP 칩에서 단일 사이클 분할 작업을 본 적이 있다고 확신하므로 단일 사이클 곱셈과 마찬가지로 데스크탑으로 향한다고 가정했지만 지금은 참조를 찾을 수 없습니다. 나는 대답을 업데이트하고 나중에 반복 할 수있는 비 반복적 인 방법에 대한 관련 정보를 추가했습니다. 트랜스 포터를 사용할 때보 다 분 할당 효율이 더 이상 효율적이지 않다는 것이 놀랍습니다.
Mark Booth

1
DSP가 정확한 범위를 제한함으로써 DSP가 그렇게 생각합니다. 이것은 제곱근에 대한 조회 + 보간에 사용 된 것과 동일한 전략입니다.
Matt Knepley

1
그러나 그러한 부서 의 대기 시간 이 무엇인지 잘 모르겠습니다 . 4GHz에서, N 사이클 내에서 룩업 테이블로 왕복하는 것은 상기 테이블의 잠재적 인 크기를 심각하게 제한한다 (예를 들어, L1 캐시는 각각 32K에서 정체되어있다). 3D로 가면 이것을 늘리는 데 도움이 될 것입니다 (하지만 냉각에 어려움이 있습니다). 최신 4GHz / 5GHz CPU의 대기 시간에 도달 할 수있는 아이디어가 있습니까?
Matthieu M.

1
divps / divpd 대 mulps / mullpd 대기 시간 및 처리량 숫자는 부동 소수점 나누기 대 부동 소수점 곱하기를 참조하십시오 . Agner Fog의 명령어 테이블에서 데이터를 가져 와서 단일 및 이중 및 다른 SIMD 벡터 너비에 대해 div 및 mul 처리량 및 대기 시간의 계층 구조에서 요약 형식으로 지정했습니다. (인텔 칩은 일반적으로 다른 벡터의 ALU의 절반 폭의 SIMD 분할 수 있습니다.)
피터 코르
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.