programing

곱셈이 플로트 분할보다 빠릅니까?

goodcopy 2022. 8. 1. 21:51
반응형

곱셈이 플로트 분할보다 빠릅니까?

C/C++ 에서는, 다음의 코드를 설정할 수 있습니다.

double a, b, c;
...
c = (a + b) / 2;

이것은, 다음과 같은 작업을 실시합니다.

c = (a + b) * 0.5;

어떤 것을 사용하는 것이 좋을지 고민하고 있습니다.어떤 작업이 다른 작업보다 근본적으로 빠릅니까?

곱셈은 나눗셈보다 빠르다.대학에서 나는 나눗셈이 곱셈의 6배를 차지한다고 배웠다.실제 타이밍은 아키텍처에 따라 다르지만 일반적으로 곱셈은 나눗셈만큼 느리거나 느려지는 일은 없습니다.반올림 오류가 허용되는 경우 항상 곱셈을 사용하도록 코드를 최적화하십시오.

따라서 이 예에서는 일반적으로 속도가 느려집니다.

for (int i=0; i<arraySize; i++) {
    a[i] = b[i] / x;
}

...이것보다...

y=1/x;
for (int i=0; i<arraySize; i++) {
    a[i] = b[i] * y;
}

물론 반올림 오차의 경우 두 번째 방법에서는 정밀도가 약간 떨어집니다만, 반복적으로 계산하지 않는 한,x=1/x;큰 문제는 없을 것 같아요

편집:

참고로.구글에서 검색하여 작업 타이밍의 제3자 비교를 알아냈습니다.

http://gmplib.org/~tege/x86-disc.pdf

MUL과 DIV의 숫자를 보세요.이는 프로세서에 따라 5~10배의 차이를 나타냅니다.

이 경우 컴파일러가 divide를 곱셈으로 변환할 가능성이 높으며, 이것이 "빠른" 것으로 판단될 경우입니다.부동 소수점에서 2로 나누는 것도 다른 부동 소수점 분할보다 빠를 수 있습니다.컴파일러가 변환하지 않으면 프로세서 자체에 따라 다르지만 멀티플을 사용하는 것이 더 빠를 수 있습니다.

분할 대신 수동으로 곱셈을 사용하면 컴파일러가 "안전"하다고 판단할 수 없는 경우(예를 들어 0.1은 부동소수점 숫자에 0.1로 정확히 저장할 수 없고 0.10000000149011612가 됩니다).AMD 프로세서에 관한 그림은 아래를 참조해 주십시오.이 수치는 클래스의 대표입니다.

컴파일러가 이 기능을 제대로 수행하는지 여부를 판단하기 위해 실험용 코드를 작성해 보는 것은 어떨까요?컴파일러가 상수 값만 계산하고 루프토'의 모든 계산을 폐기하지 않도록 작성해야 합니다.

편집:

AMD의프로세서 에는 AMD의 15h 프로세서용 .fdiv ★★★★★★★★★★★★★★★★★」fmul 버전은 DIVPS, ) 27) 의 곱셈의6.SSE 버전은 DIVPS, DIVPD DIVSS 및 DIVSD(divide)의 경우 24(싱글) 또는 27(더블) 사이클, 모든 형태의 곱셈의 경우 6 사이클로 약간 비슷합니다.

기억상으로는 인텔의 수치는 그다지 다르지 않습니다.

부동소수점 곱셈은 일반적으로 부동소수점 나눗셈보다 더 적은 사이클이 소요됩니다.그러나 리터럴 오퍼랜드에서는 옵티마이저는 이러한 미세 최적화를 잘 알고 있습니다.

언급URL : https://stackoverflow.com/questions/17883240/is-multiplication-faster-than-float-division

반응형