32비트 cpu에서 8비트 곱셈, 나눗셈 한번에 하는 방법
카테고리 없음 / 2018. 5. 10. 21:40
c언어에서 숫자의 2의 배수의 곱셈, 나눗셈은 쉬프트(shift)연산으로 처리할 수 있다.
곱셈은 <<
나눗셈은 >>
예) a/2는 a>>1과 같다.
a*2는 a<<1과 같다.
(2의 배수가 아닌 경우에는?)
숫자를 좌,우로 밀면된다.
10진수에서는 좌우로 밀면, *10, /10이 된다.
2진수에서는 좌우로 밀면, *2, /2가 된다.
32비트 레지스터를 가지는 cpu에서는 8비트 숫자 4개를 한번에 계산 가능하다.
단, 각 바이트의 숫자가 밀려서 넘치지 않아야 한다.
덧셈 뺄셈도 가능할까?
12
+34
-------
46
가능하다.
단, 올림, 내림이 없어야한다.
SIMD명령을 지원하는 CPU에서는, 이런 계산이 가능하다.
그러나 이런방식으로 계산할 경우, 해당 값은 연속적으로 배치되어 있어야 한다.
계산할 값을 순서대로 준비하는 과정에서 클럭낭비가 발생하여, 최대 이득은 2배, 4배가 되기는 어렵다.
값을 잘 배열하여, 한번에 계산이 가능하다면, 최고 2배,4배에 근접한 성능향상을 얻을 수 있다.
예) 4채널, 8비트값을 연속적으로 처리해야하는 경우
데이터=1234,1234,1234,...
연산할값=1234
8비트 연산이 필요한곳은 RGBA 화면픽셀 처리가 대표적이다.
8비트연산은 그 이외에는 거의 쓸모가 없다.
최소한 10비트 이상의 해상도가 필요하기 때문이다.
16비트 연산일때, 한번에 2개씩 처리하려면, 최대/최소값 이내여야 한다.
또한 음수가 필요한 경우 부호설정이 어렵다.
이경우에는 덧셈/뺄셈을 한번 더해서, 부호를 맞출 수 있다.
최대,최소값을 넘지 않으려면, 좌,우로 여분의 비트가 필요하다.
예) 10비트 연산은 좌로3비트, 우로 3비트 공차를 두는것이 가능하다.
그러나, 결과값을 올바르게 얻으려면, 쉬프트연산과 비트AND이 필요하여, 사실상 큰 의미가 없을 수 있다.
또한가지 문저점은 대부분의 숫자연산이 고정소수점형식의 실수연산이라서, 대부분 32비트값을 사용한다.
32비트 고정소수점연산도 32비트 float실수 연산에 비해, 값의 범위가 좁아서, 원하지않는 결과값이 나오지 않도록 신경써야한다.
16비트 고정소수점 연산도 사용하기는 하나, float실수형으로는 거의 쓸모가 없는 정도이다.
이 방법은 64비트 이상의 CPU에서 매우 효율적이다.
16비트 연산을 2~3개를 한번에 수행할 수 있게 된다.
32비트CPU에서는 SIMMD명령이 없다면, 거의 효과가 없을 수 있다.
곱셈은 <<
나눗셈은 >>
예) a/2는 a>>1과 같다.
a*2는 a<<1과 같다.
(2의 배수가 아닌 경우에는?)
숫자를 좌,우로 밀면된다.
10진수에서는 좌우로 밀면, *10, /10이 된다.
2진수에서는 좌우로 밀면, *2, /2가 된다.
32비트 레지스터를 가지는 cpu에서는 8비트 숫자 4개를 한번에 계산 가능하다.
단, 각 바이트의 숫자가 밀려서 넘치지 않아야 한다.
덧셈 뺄셈도 가능할까?
12
+34
-------
46
가능하다.
단, 올림, 내림이 없어야한다.
SIMD명령을 지원하는 CPU에서는, 이런 계산이 가능하다.
그러나 이런방식으로 계산할 경우, 해당 값은 연속적으로 배치되어 있어야 한다.
계산할 값을 순서대로 준비하는 과정에서 클럭낭비가 발생하여, 최대 이득은 2배, 4배가 되기는 어렵다.
값을 잘 배열하여, 한번에 계산이 가능하다면, 최고 2배,4배에 근접한 성능향상을 얻을 수 있다.
예) 4채널, 8비트값을 연속적으로 처리해야하는 경우
데이터=1234,1234,1234,...
연산할값=1234
8비트 연산이 필요한곳은 RGBA 화면픽셀 처리가 대표적이다.
8비트연산은 그 이외에는 거의 쓸모가 없다.
최소한 10비트 이상의 해상도가 필요하기 때문이다.
16비트 연산일때, 한번에 2개씩 처리하려면, 최대/최소값 이내여야 한다.
또한 음수가 필요한 경우 부호설정이 어렵다.
이경우에는 덧셈/뺄셈을 한번 더해서, 부호를 맞출 수 있다.
최대,최소값을 넘지 않으려면, 좌,우로 여분의 비트가 필요하다.
예) 10비트 연산은 좌로3비트, 우로 3비트 공차를 두는것이 가능하다.
그러나, 결과값을 올바르게 얻으려면, 쉬프트연산과 비트AND이 필요하여, 사실상 큰 의미가 없을 수 있다.
또한가지 문저점은 대부분의 숫자연산이 고정소수점형식의 실수연산이라서, 대부분 32비트값을 사용한다.
32비트 고정소수점연산도 32비트 float실수 연산에 비해, 값의 범위가 좁아서, 원하지않는 결과값이 나오지 않도록 신경써야한다.
16비트 고정소수점 연산도 사용하기는 하나, float실수형으로는 거의 쓸모가 없는 정도이다.
이 방법은 64비트 이상의 CPU에서 매우 효율적이다.
16비트 연산을 2~3개를 한번에 수행할 수 있게 된다.
32비트CPU에서는 SIMMD명령이 없다면, 거의 효과가 없을 수 있다.