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 ?