Mudanças entre as edições de "Ponto Flutuante"

De WikiLICC
Ir para: navegação, pesquisa
m
m
Linha 9: Linha 9:
 
! Fortran
 
! Fortran
 
! tempo
 
! tempo
 +
! Assembler
 
|-
 
|-
 
| <code>a = 1.23D0 </code>
 
| <code>a = 1.23D0 </code>
Linha 15: Linha 16:
 
| <code>a = b</code>
 
| <code>a = b</code>
 
|  15 &mu;s
 
|  15 &mu;s
 +
|  fld  ptr[b];  fstp  ptr[a]
 +
|  fld  ptr[1.23d0]; fstp ptr,[a]
 
|-
 
|-
 
| <code>a = a+b</code>
 
| <code>a = a+b</code>
 
|  98 &mu;s
 
|  98 &mu;s
 +
|  fld  ptr[a];  fld  ptr[b];  faddp st(1),st;  fstp  ptr[a]
 
|-
 
|-
 
| <code>a = b+c</code>
 
| <code>a = b+c</code>
 
|  20 &mu;s
 
|  20 &mu;s
 +
|  fld  ptr[b];  fld  ptr[c];  faddp st(1),st;  fstp  ptr[a]
 
|-
 
|-
 
| <code>a = b-c</code>
 
| <code>a = b-c</code>
 
|  20 &mu;s
 
|  20 &mu;s
 +
|  fld  ptr[b];  fld  ptr[c];  fsubp st(1),st;  fstp  ptr[a]
 
|-
 
|-
 
| <code>a = b*c</code>
 
| <code>a = b*c</code>
 
|  20 &mu;s
 
|  20 &mu;s
 +
|  fld  ptr[b];  fld  ptr[c];  fmulp st(1),st;  fstp  ptr[a]
 
|-
 
|-
 
| <code>a = b/c</code>
 
| <code>a = b/c</code>
 
|  20 &mu;s
 
|  20 &mu;s
|-
+
| fld  ptr[b];  fld  ptr[c];  fdivp st(1),st; fstp  ptr[a]
| <code>a = sqrt(1.23D0)</code>
 
| 20 &mu;s
 
 
|-
 
|-
 
| <code>a = sqrt(b)</code>
 
| <code>a = sqrt(b)</code>
 
| 121 &mu;s
 
| 121 &mu;s
 +
| push  edi;    fld  ptr[b];  call  _sqrtf;    pop  ecx; fstp ptr[a] (26 instrucoes)
 
|-
 
|-
 
| <code>if(b==0.d0)then</code>
 
| <code>if(b==0.d0)then</code>
 
|  15 &mu;s
 
|  15 &mu;s
 
|-
 
|-
| <code>do i=1,10</code>
+
| <code>end do</code>
 
|  16 &mu;s
 
|  16 &mu;s
 +
|  inc  ptr[i];  mov  eax,ptr[i];  cmp  eax,[1];  jle  INICIO_LOOP
 
|}
 
|}

Edição das 22h07min de 20 de agosto de 2009

Qual o tempo necessário para realizar uma operação em ponto flutuante?

No compilador Intel Fortran 11, Windows XP SP 3, Pentium 4 HT 3.00GHz obtive o seguinte resultado (5 testes, desprezando o pior e melhor resultado, e média dos 3 restantes).

real   :: a,b,c


Fortran tempo Assembler
a = 1.23D0 15 μs
a = b 15 μs fld ptr[b]; fstp ptr[a] fld ptr[1.23d0]; fstp ptr,[a]
a = a+b 98 μs fld ptr[a]; fld ptr[b]; faddp st(1),st; fstp ptr[a]
a = b+c 20 μs fld ptr[b]; fld ptr[c]; faddp st(1),st; fstp ptr[a]
a = b-c 20 μs fld ptr[b]; fld ptr[c]; fsubp st(1),st; fstp ptr[a]
a = b*c 20 μs fld ptr[b]; fld ptr[c]; fmulp st(1),st; fstp ptr[a]
a = b/c 20 μs fld ptr[b]; fld ptr[c]; fdivp st(1),st; fstp ptr[a]
a = sqrt(b) 121 μs push edi; fld ptr[b]; call _sqrtf; pop ecx; fstp ptr[a] (26 instrucoes)
if(b==0.d0)then 15 μs
end do 16 μs inc ptr[i]; mov eax,ptr[i]; cmp eax,[1]; jle INICIO_LOOP