Autore Topic: New JIT Compiler  (Letto 3784 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: New JIT Compiler
« Risposta #15 il: 01 Giugno 2012, 17:03:34 »
La cosa brutta, anche se comprensibile, è il fatto del consumo esponenziale delle risorse. Vuol dire che le funzionalità di Fast vanno ad agire pesantemente e direttamente sui cicli macchina.

Comunque lo stesso Minisini mi aveva sottolineato che facendo quei due esperimenti, sopra riportati, "con" e "senza" FAST, una CPU sarebbe stata utilizzata al 100%. Infatti, ho verificato che è così.
Ho fatto una prova di velocità utilizzando la chiamata ad una brevissima e semplice libreria esterna in C, scritta da me, per contare da 0 a 1 miliardo; ed anche in questo caso l'uso della CPU è andato al 100%.

V'è da notare, in particolare, che la chiamata della funzione esterna, scritta in C, mi è risultata ben meno veloce (ms 2266)  dell'uso di Fast (ms 966). Se in essa è presente l'Assembly, si è mostrata un po' più veloce: in media 650 millisecondi !
« Ultima modifica: 10 Aprile 2013, 19:17:03 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: New JIT Compiler
« Risposta #16 il: 02 Giugno 2012, 00:50:14 »
...ora però faccio notare che operando al di fuori di Gambas e facendo qualche prova su portatile a contare fino a 1 miliardo in Assembly e anche in C puro, si è avuto:
* in Assembly: 510 millisecondi;
* C compilato con GCC: 2090 millisecondi.
Il che da un lato dimostra che con l'Assembler si va super (che però contemporaneamente bisogna interfacciarlo bene); dall'altro evidentemente se con Gambas si utilizza una libreria esterna, nonostante si usi l'Assembly, vi è qualche difficoltà (come ho rappresentato nel mio precedente messaggio). Forse  :-\ c'è un qualche problema di impostazioni globali e settaggi vari...
Possibile mai che Gambas vada più veloce con Fast piuttosto che con l'uso di una libreria esterna contenente l'Assembly ?  :rolleyes:

bella questione da rivolgere a Minisini.......
« Ultima modifica: 03 Giugno 2012, 02:27:17 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: New JIT Compiler
« Risposta #17 il: 02 Giugno 2012, 14:05:03 »
A parte che non ben capito che prova hai fatto con l'asm, cosa hai usato, come l'hai compilato, e via dicendo...
Riguardo al C (ma C o C++ ?), mi pare strano che tu abbia differenze così evidenti con l'asm, dato che una volta compilato è codice puro, a meno con tu non abbia usato funzioni ad alto livello (es. oggetti stringhe), che è da tener presente che questo tipo di oggetti sono molto pesanti a livello di codice macchina. E' anche ovvio che la compilazione necessita di ottimizzazione, nel senso che bisogna operare sui parametri per compilare nel miglior modo possibile.
La cosa che però mi pare strana, nonostante sia stato usato un ottimizzatore, è quella appunto che il codice Gambas è interpretato, e non ha puramente codice a basso livello suo interno, perchè si appoggia a prodotti esterni. Il fatto appunto che ci sia un interprete in mezzo, che poi passa codice precompilato all'ottimizzatore, è già di per sè un inserimento di un fattore ritardo che non può essere minore dei tempi fatti scrivendo codice puramente a livello macchina, che non ha intermediari di mezzo. Posso capire che si possano avere incrementi di prestazione, usando arzigogoli particolari, ma addirittura superare quelli di un codice diretto mi pare alquanto anomalo...
Di certo è passato molto tempo da quando scrivevo programmi realtime in asm/c, ma qui mi pare fuori logica...  :-\

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: New JIT Compiler
« Risposta #18 il: 03 Giugno 2012, 00:19:18 »
A parte che non ben capito che prova hai fatto con l'asm, cosa hai usato, come l'hai compilato, e via dicendo...

Ho fatto nuovamente una prova in terminale lanciando con uno script con il motore del codice in asm che conta fino a 1 miliardo:

Codice: c [Seleziona]

static unsigned int car asm("raxregistro");
static unsigned int cbr asm("rbxregistro");

int prova(int numero) {
 cbr=numero;
 asm("mov rbxregistro(%rip),%eax");
 asm("ciclo:");
 asm("dec %eax");
 asm("jne ciclo");
 asm("mov %eax,raxregistro(%rip)");
return car;
}

Ha dato mediamente un tempo di 570 millesimi di secondo !


Invece, usando il C puro, sempre lanciato con script da terminale:
Codice: c [Seleziona]

#include <stdio.h>

int prova(int numero) {
int i;
for(i = 0; i < numero;i++){
}
return i;
}

In questo caso il risultato è stato: 2091 millisecondi.


Realizzata, invece, la seguente libreria esterna .so, con il primo codice (quello che presenta il motore in asm), ossia:
Codice: c [Seleziona]

static unsigned int car asm("raxregistro");    
static unsigned int cbr asm("rbxregistro");    

int prova(int numero) {
cbr=numero;
asm("mov rbxregistro(%rip),%eax");
asm("ciclo:");
asm("dec %eax");
asm("jne ciclo");
asm("mov %eax,raxregistro(%rip)");
return car;
}

e richiamata con Gambas, passandole il valore di 1 miliardo, si ha un risultato intorno ai 655 millisecondi !


Riguardo alla strana lentezza del codice asm (ma anche con il C come si vede sotto) con Gambas ho posto la questione a Minisini.  ;D


Faccio comunque notare che usando Gambas il conteggio da 0 ad 1 miliardo:
* con Fast = ms 966;
* con la libreria esterna scritta in C = ms 2430
* con la libreria esterna con motore asm (ovviamente compilato): ms 655
« Ultima modifica: 09 Aprile 2013, 18:01:26 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: New JIT Compiler
« Risposta #19 il: 03 Giugno 2012, 12:01:16 »
Quindi, se ho capito bene, hai provato ad eseguire il test con asm e c da terminale (spero), e per i tempi hai usato time?

Riguardo all'esecuzione da gambas, dato che ci sono molte incognite, riguardo al fatto che ci sono chiamate esterne e il passaggio di dati, questo potrebbe influire in maniera notevole sui tempi.

Anche per il C, invece del for... potresti usare lo stesso sistema usato per asm, ovvero con un loop su label...

Visto che ci sei...  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: New JIT Compiler
« Risposta #20 il: 03 Giugno 2012, 14:10:31 »
Quindi, se ho capito bene, hai provato ad eseguire il test con asm e c da terminale (spero)
Sì, da terminale.


per i tempi hai usato time?
Nello script:
Codice: [Seleziona]
tempo1=`date +%s%N | cut -b1-13`
LD_LIBRARY_PATH="." ./demo_use
tempo2=`date +%s%N | cut -b1-13`
sottrazione=$(($tempo2 - $tempo1))

Anche per il C, invece del for... potresti usare lo stesso sistema usato per asm, ovvero con un loop su label...
Visto che ci sei...  ;D
Bene, ho fatto, ed ecco i risultati (sempre contando da 0 a 1 miliardo) usando il GOTO all'interno del codice in C puro:
Codice: c [Seleziona]

int prova(int numero) {
 int i;

 zompa:
  if (i < numero){
  i++;
  goto zompa;}
 return i;

}

* con script da terminale: ms 1779   (con For invece: ms 2091);

* con libreria .so in Gambas: ms 2011   (con For invece: ms 2430).

Quindi un miglioramento effettivamente c'è !



Riguardo all'esecuzione da gambas, dato che ci sono molte incognite, riguardo al fatto che ci sono chiamate esterne e il passaggio di dati, questo potrebbe influire in maniera notevole sui tempi.
Bisognerà chiamare un esorcista   ..... Papa Ceskho I !!!   Lui è esperto da quanto so: notare l'antica immagine di Papa Ceskho I eremita che lotta contro il demone che tenta di inserire molte incognite in una libreria esterna .so  .
« Ultima modifica: 09 Aprile 2013, 18:02:06 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: New JIT Compiler
« Risposta #21 il: 03 Giugno 2012, 17:29:02 »
Il mio suggerimento riguardo il test con c proviene dall'esperienza fatta in campo realtime, e come vedi le differenze sono tangibili.

Il tutto riporta a come sono state costruite le librerie cui fai uso.

A suo tempo, quando avevo iniziato a programmare in C++, meravigliato dalle nuove potenzialità di una programmazione ad oggetti, avevo iniziato a lavoraci sopra, scoprendo poi quanta differenza e quanti problemi dava questa trasformazione. La cosa ovviamente era ed è di poca importanza quando un'applicazione aveva il solo scopo di fornire un'interfaccia con un utente, ma diventava problematica quando si dovevavo fare calcoli e rispondere ad un evento entro tempi strettissimi (nell'ordine del microsecondo e addirittura molto minori). Il discorso assumeva aspetti preoccupanti quando ci si accorgeva che l'accumulo di un ritardo (anche del millisecondo) dipendeva ovviamente dal numero di eventi, che portava di conseguenza a ritardi mostruosi...
Quando si ha a che fare con applicazioni, la cui interazione è dipendente dalla reazione umana, i ritardi assumono un'importanza marginale. Tenendo conto che, nella migliore delle ipotesi, la reazione umana ha un velocità di circa 300ms, il fatto che poi un'operazione ci metta 50/100ms non crea preoccupazione. Se già il numero minimo di fotogrammi necessari per non far notare all'occhio la transazione è di circa 25/sec, ovvero 40ms a fotogramma, questo ti dà un'idea della cosa (e stiamo parlando dell'occhio, che è sicuramente superiore come velocità di una mano su una tastiera...).

A parte i piccoli ritocchi che uno può fare su un codice per migliorarne le prestazioni, si possono intraprendere anche altre tecniche, ma questo discorso credo vada oltre a questa discussione.

Da quello che ho notato nella nuova libreria, è che la stessa và a sostituire quasi completamente alcune funzioni base di gambas, traducendole direttamente e trasferendole alle funzioni di llvm. Queste trasformazioni riguardano principalmente le funzioni e le operazioni di calcolo (ovvero la parte matematica), e di certo non possono influire sulle logiche più ad alto livello, come ad esempio l'interfacciamento di un database e/o l'i/o verso/da fonti esterne. Anche le classi sono esclude da questa trasformazione, in quanto oggetti facenti parte di uno strato software complesso e altamente dinamico.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: New JIT Compiler
« Risposta #22 il: 04 Giugno 2012, 13:53:14 »
Anche per il C, invece del for... potresti usare lo stesso sistema usato per asm, ovvero con un loop su label...
Ho effettuato la prova del conteggio da 0 a 1 miliardo con uso del GOTO in C con sistema Kubuntu a 32bit, montato in modo "persistente" su penna. Ebbene, i risultati - provati più volte - del ciclo con libreria esterna contenente il ciclo Goto e con altra libreria esterna contenente il ciclo For, entrambe scritte in C puro, sono stati del tutto diversi da quelli che ho segnalato sopra effettuati su un 64bit.

In particolare, con quel 32bit ho ottenuto:
* con ciclo GOTO = ms 4850
* con ciclo FOR = ms 2190
  :rolleyes:
« Ultima modifica: 09 Giugno 2012, 00:42:04 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: New JIT Compiler
« Risposta #23 il: 02 Luglio 2012, 14:00:13 »
Caro vuott, sarà sicuramente il caldo di questi giorni, ma mi sono completamente perso...

Tanto per capire e fare un confronto immediato, non riesci a fare una tabellina con i valori riscontrati dai tuoi test?

Andando su e giù tra i post, mi dimentico di cosa stò cercando e qual'era il primo valore...  :D