[optymalizacja] 128 bit integer

0

Witajcie.

Napisalem prosty program to sprawdzenia opcji optymalizacji kompilatora. -O...
w dokumentacji gcc czytamy:

-fsplit-wide-types
    When using a type that occupies multiple registers, such as long long on a 32-bit system, split the registers apart and allocate them independently. This normally generates better code for those types, but may make debugging more difficult.

    Enabled at levels -O, -O2, -O3, -Os. 

zatem prosty programik:

#include <stdio.h>
#include <stdint.h>
#include <time.h>

int main(int argc,char* argv[]) {
  typedef unsigned int uint128 __attribute__((__mode__(TI)));
  time_t t1,t2;
  uint64_t x = 0xABCDEF01234568;
  uint64_t y = ~x;
//  long x2 = 2147483647;
//  long y2 = 2147483647;
  
  
  t1 = time(NULL);

  uint128 result = ((uint128) x * y); 
  t2 = time(NULL);
  printf("%g\n",t2-t1);
  
 /*
  t1 = time(NULL);
  long long res = x2*y2;
  t2 = time(NULL);
  printf("%g\n",t2-t1);
  */
  return 0;
}

na 64 bitowym pc powinien ujawinic zastosowanie tej opcji.
Jednak jest pewien problem.Bez zastosowania optymalizacji otrzymuje delte czasu rzedu e-324. Włączając optymalizacje czas jest rzedu e-310. W teorii powinno byc lepiej a nie jest.
Podglądniecie przez gdb disassemble main dla wersji niezoptymalizowanej pokazuje wielolinijkowy kod ładnie dzielący liczbe na młodsze 64 bity i starsze oraz umieszczający go odpowiednio. W wersji zoptymalizowanej kod asemblera jest 4 razy krotszy i zawiera same bzdury...miedzy pomiarem t1 a t2 jest m/w to :

0x0000000000400543 <main+3>:    call   0x400438 <time@plt>
0x0000000000400548 <main+8>:    xor    edi,edi
0x000000000040054a <main+10>:   mov    rbx,rax
0x000000000040054d <main+13>:   call   0x400438 <time@plt>

nie bardzo to rozumiem. Moge prosic o rozjasnienie wątpliwości ?

0

w pewnym sensie problem rozwiazany i optymalizacja naprawde nastepuje tylko zeby ja zauwazyc nalezy zmierzyc czas przez polecenie time.
Zatem mam nowe pytanie. Dlaczego funkcja biblioteczna nie zwraca odpowiednich delt ?
Nie sądze zebysmy zeszli z czasem ponizej rozdzielczosci

0
sumtny informatyk napisał(a)

Napisalem prosty program to sprawdzenia opcji optymalizacji kompilatora. -O...
[...]

[...]
t1 = time(NULL);

uint128 result = ((uint128) x * y);
t2 = time(NULL);
printf("%g\n",t2-t1);
[...]


Lol, perełka normalnie.
0
sumtny informatyk napisał(a)

W wersji zoptymalizowanej kod asemblera jest 4 razy krotszy i zawiera same bzdury

Jakie bzdury? Został przebudowany, zbędny kod i zmienne (te, które nie mają efektów ubocznych) zostały wyeliminowane. Tak się optymalizuje kod, kochany.

BTW - funkcja time zwraca czas w sekundach, mam policzyć szansę, że wynik pomiaru będzie niezerowy biorąc pod uwagę wydajność nowoczesnych procesorów? Przecież ta (eliminowana zresztą) konstrukcja kosztuje ledwo kilka cykli procesora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1