고정소수점 연산 속도

auditory의 이미지

float f1, f2;
int i1, i2;
#define MUL(a,b)  (int)(((_int64)(a)*(_int64)(b))>>32)

에서 f1*f2가 빠른가요, 아니면 MUL(i1,i2)가 빠른가요?
보통 PC환경에서요..

저는 f1*f2가 빠르다고 생각하고, 차이도 꽤 날거라고 보는데요..

또는 특정환경에서는 MUL(i1,i2)가 빨리처리되는 경우가 있나요? (dsp등)

prio의 이미지

"보통 PC 환경"이 워낙 다양하긴 하지만.. ^^;
요즘 많이 쓰는 intel core2 의 경우,

32-bit imul: 3 cycles,
64-bit imul: 5 cycles,
32, 64-bit fmul: 4 cycles

의 latency를 가지는 것으로 기억합니다. (레퍼런스는 찾기가 귀찮아서;;; )

요즘처럼 트랜지스터가 남아도는 시대에는
PC용 코어에서 부동 소수점 연산을 빠르게 구현하는 것은 큰 문제는 아닙니다만,
DSP의 경우는 부동 소수점 연산 장치가 달리지 않은 코어가 더 많은 것으로 압니다.
경우에 따라 쓸 일이 거의 없을테니까요.

auditory의 이미지

혹시 reference를 정확히 알 수 있을까요??

http://www.intel.com/Assets/PDF/manual/248966.pdf
문서의 C.3에 있는 어떤 instruction인지 알기가 어렵네요..

a, b가 32bit integer일때,
그리고 FMUL에서의 곱셈, ((int64)(a)*(int64)(b)) 는
32bit imul인가요?, 64bit imul인가요?

auditory의 이미지

답글이 없어 위로 끌어올립니다.
질문이 이상한가요?

두번째 32bit vs 64bit 은 저는 당연히! 64bit mul이라고 생각하는데,
32bit mul라는 주장이 있어서 제 상식에 문제가 있는건가 자문 구합니다..

drinkme의 이미지

요즘 펜티엄 이상급의 CPU들은
FPU를 가지고 있기 때문에, 부동소숫점 연산이 그닥 느리지 않습니다.
위의 질문에서 간과한 것은,
정수곱셈이 실제로 몇 cycle 빠르다 할 지언정,
실수곱셈을 그대로 하는 것보다 느린 이유는,
casting에 있지 않나 합니다.

그리고, 아랫부분에 말씀하신 것은
64bit 곱셈으로 될 것입니다.
casting 하셨잖아요.

prio의 이미지

답글이 달린 줄 모르고 있었네요. ^^;

문서 중 언급하신 부분의 표들 중
요즘 주로 사용하는 core 시리즈는 06_xx 를 보시면 될 겁니다.
문서에는 32-bit imul이 3 cycles, fmul이 5 cycles로 되어 있네요.
64-bit imul에 대해서는 못찾았구요. 아마 5 cycles 정도 일 겁니다.

애초에 궁금하신 것이,
비슷한 연산량에 대해 고정소수점 버전이 2배 정도 느린데,
그것이 납득할 만 한 것인지, 버그가 있는 것인지 하는 것이라면..

버그가 없어도 성능이 느린 것은 충분히 납득할 수 있겠으나,
두 배 정도나 차이나는 것은 그 원인이 하도 다양해서
코드를 보기 전에는 설명이 불가능 할 것 같고
그렇다고 실제 버그가 없는지도 알 수 없는 일이라는
뻔한 얘기 밖에는 못하겠네요.

유효숫자로 인한 오차가 중요한 계산이 아니라면,
그냥 속 편하게 부동소수점을 사용하시는 것이 좋다고 생각합니다.
intel cpu에서는 꽤 오래 전 부터 imul을 fp unit에서 계산해왔거든요.

Necromancer의 이미지

인텔 CPU 매뉴얼에는 명령어당 걸리는 클럭수가 표기되지 않고 있는데(복잡한 파이프라인 단계와 OOO의 영향 때문에 정확한 클럭을 적기가 애매하죠), 어떻게 알고 계신지 모르겠네요.

위 코드가 실제 CPU에서 어떻게 처리되는지 얘기하자면

첫번째꺼는 부동소수점 명령어 한방에 끝나지만,
두번째는 두 변수를 먼저 정수변환한 뒤 정수곱셈을 수행해야 합니다. 결과치를 부동소수점으로 요구한다면 이 정수를 다시 부동소수로 바꿔줘야 하고요.

기계의 특성에 따다 다를겁니다. 부동소수점을 emulation하는식으로 돌아간다면 첫번째가 느리겠지만, FPU 있다면 거의 대부분 두번째안이 느리다고 할 수 있습니다.

** 정수는 덧셈, 뺄셈이 쉽지만 부동소수점은 곱셈, 나눗셈이 더 쉽습니다. 부동소수점 덧셈과 뺄셈은 자리수 맞춰야하기 때문에 복잡하죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

auditory의 이미지

부동소수점 <-> 고정소수점 간 변환 코스트는 없습니다.
별도로 존재하는 2개의 프로그램입니다.

fpu가 있는 기계에서 느릴수있다고 할때 어느 정도까지 느린가가 궁금합니다.
비슷한 연산량에 대해서 현재 고정소수점 버전이 약2배정도 느린데.. (덧셈/곱셈 연산량이 굉장히 많습니다.)
이게 납득이 가능 상황인지, 다른 버그등의 팩터가 있는것인지가 궁금합니다.

latency나 throughput은 매뉴얼에 있긴 하더군요.
그런데 최적화관련하여 변수가 많아 그걸로 따지기는 어려울거 같기도하고요.

grassman의 이미지

꼭 64비트로 형변환을 해야할 이유가 없다면 32비트로 처리하는게 빠를겁니다.

그리고 Core 2 쪽은 IMUL에 대해 활성화 되는 유닛이 FP_MUL이더군요.
내부 계산 속도가 부동 소수점 쪽이 빠른 건지도 모르겠습니다.

drinkme의 이미지

FPU에서 부동소수점 연산을 하나,
intel x86 명령으로 정수연산으로 하나 비슷하다 치더라도,
실제 code로 돌려보면
정수연산이 빠르게 나올겁니다.
FPU로 연산하려면, cpu 레지스터에 있는 값을 FPU stack으로 전달해야 하는데,
이 처리량도 감안해야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.