하드웨어 분할이 곱셈보다 훨씬 오래 걸리는 이유는 무엇입니까?


37

마이크로 컨트롤러에서 하드웨어 분할이 곱셈보다 더 오래 걸리는 이유는 무엇입니까? 예를 들어, dsPIC에서 디비전은 19 사이클이 걸리고 곱셈은 한 클럭 사이클 만 걸립니다.

Wikipedia의 Division algorithmMultiplication algorithm 을 포함한 자습서를 살펴 보았습니다. 여기 내 추론이 있습니다.

Wikipedia에서 복원 하는 느린 분할 방법과 같은 분할 알고리즘 은 재귀 알고리즘입니다. 즉, 단계의 (중간) 결과가 단계의 k입력으로 사용되므로 k+1이러한 알고리즘을 병렬화 할 수 없습니다. 따라서 n분할을 완료하는 데 적어도 사이클이 필요하지만 n배당의 비트 수는 적습니다 . 16 비트 배당의 경우 이는 최소 16주기와 같습니다.

곱셈 알고리즘은 재귀적일 필요가 없으므로 병렬화가 가능합니다. 그러나 곱셈 알고리즘에는 여러 가지가 있으며 마이크로 컨트롤러에서 사용할 수있는 실마리는 없습니다. 하드웨어 / 마이크로 컨트롤러에서 곱셈은 어떻게 작동합니까?

Dadda multiplier 알고리즘을 발견했습니다.이 알고리즘은 완료하는 데 단 하나의 클럭 사이클이 필요합니다. 그러나 내가 여기에 얻지 못하는 것은 Dadda의 알고리즘이 3 단계로 진행되는 반면 1 단계의 결과는 2 단계 등에서 사용된다는 것입니다. 이것에 따르면 완료하는 데 적어도 3 클럭 사이클이 필요합니다.


2
알고리즘은 실제로 클럭 사이클 수를 정의하지 않습니다. 특정 CPU에는 내부 구현에 관계없이 1주기 또는 20 주기로 작동하는 하드웨어 승수 / 분배기가있을 수 있습니다.
유진 Sh.

1
OP, 당신이 이야기하는 19 대 1 사이클에 대한 자세한 정보를 제공하는 링크를 제공 할 수 있습니까? DSP에 특정한 것.
Vladimir Cravero

1
답변 주셔서 감사합니다. 여기 내 마이크로 컨트롤러에 대한 데이터 시트가 있습니다 : ww1.microchip.com/downloads/en/DeviceDoc/70005127c.pdf . 292 페이지에서 시작하는 명령어 세트 개요를 참조하십시오. 모든 DIV 명령어는 18 회, 모든 MUL 명령어는 1 회만 소요됩니다. 그러나이 MCU에만 공통적 인 것은 아니며 다른 MCU에서도 이것을 보았습니다.
Marko Gulin

2
@Curd, 그들은 거의 동일합니다. 나를 위해 있습니다. 나는 그것이 당신이 상상할 수있는 것처럼 그것을 설명하지는 않는다고 생각합니다.
TonyM

1
다른 요소는 경제성과 사용 패턴입니다. 대부분의 사용법은 나누기보다 훨씬 자주 곱합니다. 상대적으로 자주 사용되지 않는 더 빠른 하드웨어 분할 기능에 넓은 면적의 실리콘을 사용하는 것은 경제성이 좋지 않습니다. 더 작고 저렴한 칩을 만들거나 추가 로직을보다 생산적인 방식으로 사용하는 것이 좋습니다. 미니 컴퓨터를 시작할 때 BTW는 나누기가 항상 지시가 아니 었습니다. 일부 컴퓨터에서는 제곱근과 같은 소프트웨어 라이브러리 호출이었습니다.
nigel222

답변:


34

디바이더는 일반적인 하드웨어에 훨씬 덜 우아하게 매핑됩니다. 래티스 ICE40 FPGA를 예로 들어 보자.

두 가지 경우를 비교해 봅시다 :이 8x8 비트에서 16 비트 승수 :

module multiply (clk, a, b, result);
   input clk;
   input [7:0]a;
   input [7:0]b;
   output [15:0]result;
   always @(posedge clk)
     result = a * b;
endmodule // multiply

8과 8 비트 피연산자를 8 비트 결과로 줄이는이 디바이더 :

module divide(clk, a, b, result);
   input clk;
   input [7:0] a;
   input [7:0] b;
   output [7:0] result;
   always @(posedge clk)
     result = a / b;
endmodule // divide

(예, 알아요, 시계가되지 않습니다 것을)

멀티 플라이어 를 ICE40 FPGA에 매핑 할 때 생성 된 회로도의 개요는 여기디바이더 에서 찾을 수 있습니다 .

Yosys의 종합 통계는 다음과 같습니다.

곱하다

  • 전선 수 : 155
  • 와이어 비트 수 : 214
  • 공중 전선 수 : 4
  • 퍼블릭 와이어 비트 수 : 33
  • 메모리 수 : 0
  • 메모리 비트 수 : 0
  • 프로세스 수 : 0
  • 셀 수 : 191
    • SB_CARRY 10
    • SB_DFF 16
    • SB_LUT4 165

분할

  • 전선 수 : 145
  • 와이어 비트 수 : 320
  • 공중 전선 수 : 4
  • 퍼블릭 와이어 비트 수 : 25
  • 메모리 수 : 0
  • 메모리 비트 수 : 0
  • 프로세스 수 : 0
  • 셀 수 : 219
    • SB_CARRY 85
    • SB_DFF 8
    • SB_LUT4 126

전폭 승수와 최대 분할 분배기에 대해 생성 된 verilog의 크기가 그다지 크지 않다는 점은 주목할 가치가 있습니다. 그러나 아래 그림을 보면 승수의 깊이가 15 인 반면 분배기가 50 정도 인 것처럼 보일 수 있습니다. 임계 경로 (즉, 작동 중에 발생할 수있는 가장 긴 경로)는 속도를 정의하는 것입니다!


어쨌든 시각적 인상을 얻기 위해 이것을 읽을 수는 없습니다. 복잡성의 차이를 발견 할 수 있다고 생각합니다. 이들은 단일 사이클 승수 / 분배기입니다!

곱하다

ICE40에 곱하기 (경고 : ~ 100Mpixel 이미지)

승수의 스케일 이미지

분할

( ICE40으로 나누기 ) (경고 : ~ 100 Mpixel 이미지)

디바이더의 스케일 이미지


4
아니요, 비 반복적으로 구현할 수 있습니다. 그러나 유효한 결과가 논리를 통해 "리플"될 때까지 시간이 꽤 걸립니다. 위의 구현은 반복적이지 않습니다.
Marcus Müller

9
디바이더의 벽 포스터를 원합니다.
Ian Howson

5
곱하기 요지 에 PDF가 있습니다 . 3378 × 3177mm이므로 침실 천장에 넣기 전에 중요한 다른 사람과상의하십시오.
Marcus Müller

2
100 메가 픽셀 이미지는 인상적이지만 만들려고하는 시점에 너무 지나치므로 휴대 전화 나 태블릿과 같은 메모리가 제한된 장치에서이 페이지를 보려고하는 사람에게는 큰 문제가됩니다. 이미지를 인라인으로 표시하려면 저해상도 미리보기를 생성하는 방법을 찾으십시오.
Dave Tweed

4
그래, 그 graphviz 차트는 끝났어, 요!
스펜서 윌리엄스

8

느린 분할은 본질적으로 반복적이므로 더 오래 걸리는 경향이 있습니다. 조회 테이블을 사용하는 간단한 알고리즘보다 느린 분할 알고리즘이 다소 빠릅니다. SRT 알고리즘은 사이클 당 2 비트를 생성합니다. 이러한 표의 오류는 악명 높은 Pentium FDIV 버그 (ca. 1994) 의 원인이었습니다 . 그런 다음 소위 고속 분할 알고리즘이 있습니다.

물론 원칙적으로 거대한 조회 테이블을 사용하여 두 숫자의 곱이나 몫을 계산하여 단일 사이클로 결과를 얻을 수는 있지만 숫자 당 비트 수가 증가함에 따라 빠르게 비실용적 인 경향이 있습니다.


그러나 결론은 곱셈 알고리즘과 달리 나눗셈 알고리즘을 병렬화 할 수 없기 때문에 속도가 너무 느린 이유는 무엇입니까?
Marko Gulin

2
@MarkoGulin "cannot"은 매우 강력한 주장입니다. 확실히 간단하지 않습니다.
Spehro Pefhany

2
"분할 알고리즘을 병렬화 할 수 없음"에서 "분할을 병렬화하는 방법이 병렬화 된 곱셈보다 분할을 구현하는 하드웨어에 더 많은 부담을주는 방식"으로 약화시킬 수 있다고 생각합니다. Sphero는 O (2 ^ n) 게이트를 사용하여 n- 비트 수를 곱하는 단일 사이클 분할을 수행하는 방법에 대한 예제를 제공하지만 실용적이지는 않습니다.
Cort Ammon

1
긴 나눗셈은 약수를 곱하면 1000 ... xxxx 형식의 결과를 산출하는 대략적인 역수를 계산하여 원하는 정도까지 병렬 처리를 이용할 수 있습니다. 각 단계마다 결과의 N 비트를 계산합니다.
supercat

8

우리는 클럭 사이클 당 여러 개의 로직 레이어를 가질 수 있지만, 얼마나 많은 로직 레이어가 얼마나 복잡한 레이어를 가질 수 있는지는 클럭 속도와 반도체 프로세스에 달려 있습니다.

그러나 많은 다른 곱셈 알고리즘이 있으며 마이크로 컨트롤러에서 사용할 수있는 단서가 없습니다.

컴퓨터에서 가장 많이 번식하는 곱셈은 이진법의 곱셈을 사용합니다. 이항 긴 곱셈에는

  • 다양한 양으로 피연산자 이동
  • 두 번째 피연산자를 기준으로 시프트 된 숫자 마스킹
  • 마스킹 결과를 함께 추가합니다.

하드웨어에서 이것을 구현하는 것을 보자.

  • 쉬프팅은 우리가 물건을 어떻게 연결 하느냐의 문제이므로 무료입니다.
  • 마스킹에는 AND 게이트가 필요합니다. 그것은 한 계층의 논리를 의미하므로 관점에서 볼 때 저렴합니다.
  • 캐리 체인이 필요하기 때문에 추가 비용이 상대적으로 비쌉니다. 다행히도 사용할 수있는 트릭이 있습니다. 하나를 생성하기 위해 두 개의 숫자를 더하는 것이 아니라 대부분의 추가 단계에서 두 개의 숫자를 더하기 위해 세 개의 숫자를 더할 수 있습니다.

따라서 16 비트 결과를 가진 8x8 승수에 필요한 로직 스테이지 수를 야구장으로 지정하십시오. 간단하게하기 위해, 모든 중간 결과가 모든 위치에 비트를 갖는 것은 아니라는 사실에 대해 우리가 시도하고 최적화하지 않는다고 가정하자.

완전 가산기가 2 개의 "게이트 스테이지"로 구현되었다고 가정하자.

  • 8 개의 중간 결과를 생성하기위한 마스킹의 경우 1입니다.
  • 2 개의 중간 결과를 6으로 줄이기 위해 3 개의 숫자 그룹을 추가하려면 2
  • 6 개의 중간 결과를 4로 줄이기 위해 3 개의 숫자 그룹을 추가하려면 2
  • 2를 3 개의 숫자 그룹으로 추가하여 4 개의 중간 결과를 3으로 줄입니다.
  • 2 개의 중간 결과를 2로 줄이기 위해 3 개의 숫자 그룹을 추가하려면 2
  • 마지막 두 결과를 더하려면 32를 입력하십시오.

약 46 개의 로직 스테이지가 있습니다. 대부분은 마지막 두 개의 중간 결과를 합산하는 데 소비됩니다.

최종 단계에 캐리 룩어 헤드 가산기를 사용하여 모든 중간 결과에 모든 비트가 존재하지 않는다는 사실 (기본적으로 dada multiplier가 수행하는 것)을 이용하여이를 개선 할 수 있습니다. 2를 생성하기 위해 3 대신 3을 생성하기 위해 7 개의 숫자를 더함 (더 많은 게이트와 넓은 게이트의 가격으로 스테이지 수를 줄임)

그러나 모든 작은 세부 사항이지만 중요한 점은 두 개의 n 비트 수를 곱하고 2n 비트 결과를 생성하는 데 필요한 스테이지 수가 n에 대략 비례한다는 것입니다.


반면에 우리가 나누기 알고리즘을 살펴보면 모두 반복 프로세스가있는 것을 알 수 있습니다.

  1. 한 번의 반복에서 수행되는 작업은 이전 반복의 결과에 크게 좌우됩니다.
  2. 반복을 구현하는 데 필요한 논리 단계의 수는 대략 n에 비례합니다 (빼기와 비교는 덧셈과 복잡성이 매우 유사합니다)
  3. 반복 횟수 또한 대략 n에 비례합니다.

따라서 나눗셈을 구현하는 데 필요한 논리 단계의 수는 대략 n 제곱에 비례합니다.


답변 주셔서 감사합니다. 필자는 Wid에서 Dadda의 알고리즘이 하드웨어에서이 알고리즘을 구현하는 데 필요한 게이트 수에 대해 매우 효율적이라는 것을 읽었습니다. 그럼에도 불구하고, 대부분의 하드웨어는 "이진 긴 곱셈"을 사용합니까?
Marko Gulin

1
나는 dada의 알고리즘이 바이너리 긴 곱셈의 최적화 된 버전 인 것처럼 보입니다.
피터 그린

1 / x 나누기를 위해 8주기를 태 웁니다. 그런 다음 고정 사이클 비용 16 사이클에 대해 8 사이클 곱셈에 대해 사용합니다.
b degnan

이것은 곱셈이 결국 덧셈보다 그리 나쁘지 않다는 것을 잘 보여줍니다.
Hagen von Eitzen

1
반복에는 O (NlgN) 하드웨어를 사용하는 O (lgN) 단계 또는 O (N) 하드웨어를 사용하는 O (sqrt (N)) 단계에서 수행 할 수있는 빼기가 필요합니다. 그러나 중요한 점은 곱셈에 O (lgN) 단계가 필요하고 나눗셈에 O (NlgN) 단계가 필요하다는 것입니다. 단계 당 더 많은 작업을 수행 할 수 있도록 대략적인 역수를 취하지 않는 한 O (N * N)이 아니라 O (N)의 인수로 곱하는 것보다 큽니다.
supercat

4

분할 알고리즘 (사실 어떤 알고리즘이든)은 한 클록 주기로 이루어질 수 있습니다. 여분의 트랜지스터에 대한 비용을 지불하고 허용되는 클록 속도를 낮추려면.

기존 다중 사이클 분할 알고리즘의 한 클록 사이클을 구현하는 게이트 세트가 있다고 가정하십시오. 알고리즘을 단일 주기로 만들려면 한 단계의 출력이 다음 단계를 공급하는 여러 단계의 하드웨어 (다중주기 알고리즘의 한 단계에서 사용 된 것과 유사)를 사용하십시오.

물론 그렇게하지 않는 이유는 많은 트랜지스터를 사용하기 때문입니다. 예를 들어 16 비트 분할의 경우 거의 16X 더 많은 트랜지스터를 사용할 수 있습니다. 또한 더 많은 단계의 게이트를 가지면 전파 지연 단계가 더 많기 때문에 최대 허용 클록 주파수가 낮아집니다.


4

실제 나눗셈 알고리즘은 모두 몫에 수렴되는 숫자 모음을 기반으로합니다.

  • 비 복원 또는 SRT와 같은 추가 방법은 몫에 2 ^ N을 추가하거나 제거하여 작동하며, 이에 따라 부분 나머지에 2 ^ N * 제수를 0으로 수렴 할 때까지 추가하거나 제거합니다.

  • Newton-Raphson 또는 Goldshmidth와 같은 곱셈 방법이 있는데, 이는 곱셈의 역수로 나눗셈을 계산하는 근본 발견 방법입니다.

추가 방법은 사이클 당 하나 또는 몇 비트를 제공합니다. 곱하기 방법은 각주기의 비트 수를 두 배로 늘리지 만 종종 상수 테이블로 얻은 초기 근사값이 필요합니다.

"느린"및 "빠른"명칭은 실제 속도가 비트 수, 함수에 할당 된 하드웨어의 양에 따라 달라지기 때문에 오해의 소지가 있습니다 (빠른 승수는 매우 큼).

직접 계산하는 병렬 방법이 없기 때문에 나눗셈은 곱셈보다 느립니다. 반복이 있거나 하드웨어를 반복하여 캐스케이드 (또는 파이프 라인) 블록으로 반복을 구현합니다.


0

마이크로 컨트롤러에서 하드웨어 분할이 곱셈보다 더 오래 걸리는 이유는 무엇입니까?

이것은 전자 질문이 아닙니다. 기껏해야 컴퓨터 질문이며 스택 오버플로로 해결하는 것이 좋습니다.

예를 들어 다음을 참조하십시오. 곱셈이 부동 나누기보다 빠릅니까?

실제로, 그것은 실생활의 질문입니다 : 왜 나누기가 곱셈보다 훨씬 오래 걸리나요?

종이에서 어느 쪽을 계산 하시겠습니까?

51 * 82

또는

4182 / 51

나누기가 더 어렵 기 때문에 나눗셈이 곱셈보다 오래 걸립니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.