2012-11-20 3 views
7

(임의의) 수식을 비트 시프트 연산으로 변환하기위한 표준 방법이 있습니까? 비트 시프트로, 최종 방정식에만 피연산자 < < 포함하므로 >>, + 및 - - 이로써수식을 비트 이동 연산으로 변환

는 I는 + 아닌지 어떤 것은 변환 뜻. 이는 수식을 프로세서 집약적으로 만드는 데 관심이 있습니다.

명백히이 결과 방정식은 근사값 일 뿐이며 더 많은 주문 (1 차, 2 차 e.t.c)으로 더 정확한 정확도를 제공합니다.

나는 이것에 대한 정보를 얻기 위해 웹을 샅샅이 조사했지만 특정 수식 (sin, cos, inv e.t.c)에 대한 것들을 제외하고는 어떤 것도 찾을 수 없습니다.

나는 다항식 또는 테일러의 확장 절차와 같은 것을 상상하고 비트 시프트 연산으로 변환했다.

답변

3

지침을 더 간단하게하기 때문에 지침이 더 간단하게 실행된다는 것을 의미하지는 않습니다. 어떤 식 으로든 더 빠르게 실행되거나 덜 집중적으로 실행될 것이라는 의미는 아닙니다. 작업의 일부를 줄이면 많은 것들을 줄일 수 있지만 동일한 작업을 수행하려면 더 많은 작업이 필요할 것입니다. 프로세서는 초당 매우 많은 연산만을 실행할 수 있으며, 먼저 그 프로세서를 실행하게됩니다.

일반적으로 낮은 수준에서 무언가를 최적화하려고하면 훨씬 더 복잡한 opcode를 사용하려고하므로 더 적은 수의 opcode가 필요합니다. 예를 들어, 많은 ADD 명령을 수행하여 곱셈을 수행 할 수 있습니다. 그러나 가장 사소한 예제가 아닌 다른 MUL 연산 코드보다 ADD가 더 많이 소요되며 실행하는 데 시간이 오래 걸립니다.

실제 질문으로 돌아 가기 효율성을 완전히 무시한 상태에서 지시 세트가 인 경우 아무 것도 계산할 수 없습니다.. 명령을 선택하는 방법을 신중하게한다면 실제로 a single instruction을 사용하여 모든 것을 계산할 수 있습니다. 나는 "이 임의의 알고리즘을이 명령어들만 사용해서 변환하라"는 일반적인 목적의 방법은 없다고 생각합니다. 이것은 일반적으로 컴파일러 작성자의 임무입니다.

+0

는'즉, 일반적으로 컴파일러 writer'의 일이다 ... 또는 분할에 대한 재미있는 –

2

일반적으로는 아닙니다.

대부분의 CPU에서 곱셈은 다른 산술 연산보다 현저히 느리지 않으므로 두 배의 일정한 곱셈을 제외한 비트 시프트 연산으로 곱셈을 변환하려고하는 목적은 거의 없습니다.

분할에 관한 한, 상수로 나누기를 역수로 곱하기로 변환하는 몇 가지 잘 알려진 방법이 있으며,이 방법은 상당히 생산적입니다. 방법에 대한 설명은 http://www.flounder.com/multiplicative_inverse.htm을 참조하십시오. 그러나 상수 값으로 나누기는 실제로 최적화 할 수 없습니다.

2를 거듭 제곱 (또는 2의 거듭 제곱으로 나눔)하는 것은 물론 비트 시프트로 쉽게 변환됩니다. 그러나 다른 지수는 쉽게 변환되지 않습니다.

대부분의 초월 함수는 비트 단위로 적절하게 표현 될 수 없습니다. 그것은 어쨌든 정수에서 대부분 정의되지 않는다는 것을 돕지 않습니다.

+0

:-) 유전 programming' 작업 '을위한 작업은,이 부분은 내가에서 실행 된 코드의 가장 시간이 많이 걸리는 부분이었다 임베디드 Cortex-M3. 반전 된 곱셈으로 바꾸는 것은 정말로 일을 가속화했습니다. – gbmhunter

1

비트 단위 연산을 통한 소프트웨어 곱셈은 최신 CPU의 하드웨어 곱셈을 능가하지는 않습니다.

일반적으로는 1) 피할 수 루프 경우 더 나은 성능을 얻을 수 비트 단위 조작에 추락; 및 2) 분지. 비트 해킹에 대한

A good online cookbook. 그렇지 않으면 A Hacker's delight있다.