|
|
|
![]() |
|
Strumenti |
![]() |
#41 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Due cose riguardo GCC (Clang non l'ho ancora potuto usare seriamente nell'ambito lavorativo):
Avevo fatto un po' di test con l'auto vettorizzazione dovevi fare dei for con valori numerici e null'altro bastava una printf() dentro al for e l'auto vettorizzazione si disabilitava (che è ovvio la printf() non è di certo un'operazione vettoriale!) temo che gli ambiti in cui le istruzioni vettoriali hanno senso sia davvero limitato (codec video? Ma non è meglio far fare quel lavoro alla GPU invece che a SSE? Videogames? Di nuovo meglio far fare i conti float alla GPU...).
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#42 | |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Quote:
![]() Quindi pure con -O2 si rischiano casini? Beh dai, per il second punto, però, non si può dare la colpa a GCC, anzi, è un problema generale. AVX512 rimarranno segregate per un bel po', secondo me... ![]() |
|
![]() |
![]() |
![]() |
#43 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Lascia almeno che arrivino prima.
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#44 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Guarda usare GDB è proprio uno spasso
![]() Almeno lasciando i simboli di debug qualcosa ci capisci, ma spesso si va più a "intuito" o a botte di printf() per capire dove il CORE è capitato ![]() Eh ma il C è "efficiente" quindi ce lo teniamo... avevo letto una cosa divertente (credo riguardasse proprio Python vs C @cdimauro) "il tempo del programmatore è più importante di quello della CPU" ![]() Dalla mia esperienza personale sì: del resto da un linguaggio che "unsafe" by design perché mai non dovrebbe essere così? I problemi sono 2:
Quote:
![]() L'unico motivo per risolvere questo è far la compilazione JIT o forse ed è una cosa che in futuro mi piacerebbe esplorare in Cosmos usare il "CPU dispatch"...
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 19-10-2016 alle 09:27. |
|
![]() |
![]() |
![]() |
#45 | ||
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Quote:
![]() Quote:
![]() |
||
![]() |
![]() |
![]() |
#46 | ||
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quote:
![]() Quote:
1. __builtin_va_arg_pack / __builtin_va_arg_len (siamo costretti ad usare il C, ma alla fine nei paradigmi moderni molte cose del mondo ad oggetti sono necessario per esempio una funzione con argomenti opzionali) 2. _Decimal32 i faccio calcoli con valute: non mi serve che sia veloce, ma che sia corretto ![]() Clang non supporta nulla di tutto questo (l'1 si può fare lo stesso ed in modo più elegante hanno messo un po' di C++ dentro al C! Il 2 mi attacco...) ICC non lo so sinceramente...
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
||
![]() |
![]() |
![]() |
#47 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
No il codice era semplicemente:
Codice:
if (var != NULL) { do_something_with_var(); } ![]() 'var' poteva senza problemi valere NULL non aveva scuse di "assumere" che fosse sempre valorizzato (era a sua volta un parametro di input di quella funzione). Sarà stato un bug di quella specifica versione di GCC tanto ne esce una al mese e chi mai le testa?
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 19-10-2016 alle 16:59. |
![]() |
![]() |
![]() |
#48 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ma è un bug troppo strano, e soprattutto in un pattern molto comune, per essere sfuggito. Non ci posso credere. :|
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#49 | |||
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Quote:
Una delle caratteristiche di -O3 se non ricordo male è abilitare un inlining più aggressivo e una profondità maggiore per il loop unroll, oltre ad attivare (questo lo so per certo) la vettorizzazione. Due caratteristiche che non sempre sono convenienti, banalmente perché aumentano la size del codice e quindi l'impatto sulla cache istruzioni. E' possibile visualizzare quali flag vengono usati ad un certo livello di ottimizzazione usando il comando: Codice:
gcc -Q --help=optimizers Codice:
gcc -Q --help=optimizers -O2 Relativamente alla "rimozione" del controllo NULL, come hai verificato questa cosa? Hai visto il codice assembly che è stato generato? Se è come dici è presumibile che il compilatore abbia determinato che x non potesse mai essere NULL e quindi ha rimosso un check inutile. Bisognerebbe vedere il codice originale per poter dire quali assunzioni ha fatto GCC. Detto ciò in fase di debug presumibilmente conviene compilare con -Og (è un O2 ma con meno inlining). Quote:
- ti adegui restringendo il compilatore a generare codice meno ottimizzato ma che giri su un ampio numero di macchine - rendi il tutto dinamico, scegliendo a runtime l'implementazione ottimizzata per la CPU che trovi (vedi kernel Linux e molte librerie matematiche). Quote:
In realtà negli ultimi anni anche nel processamento delle stringhe, con le istruzioni di shuffle si riescono a fare cose interessanti. Se fai una chiamata a funzione ad ogni passo di un ciclo for non c'è niente da vettorizzare, l'esecuzione dev'essere per forza di cose serializzata. Riguardo le GPU sicuramente sono progettate appositamente per il calcolo vettoriale, ma il problema grande che ancora sussiste è la comunicazione tra CPU e GPU, e il fatto che le GPU mediamente hanno una quantità di memoria molto inferiore rispetto a quanto accessibile alla CPU. Quindi come sempre la risposta a tutto è: dipende. Ultima modifica di WarDuck : 19-10-2016 alle 20:56. |
|||
![]() |
![]() |
![]() |
#50 | |||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
![]() Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||
![]() |
![]() |
![]() |
#51 | ||
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quote:
Quote:
Almeno se va in core (e il C primo o poi ci andrà) c'è una flebile speranza di recuperare qualcosa dal core se no era tutto un "value optimezed out" ![]() Per me che l'ottimizzatore faccia corare codice corretto è un bug poi...
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
||
![]() |
![]() |
![]() |
#52 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Un sistema di ottimizzazione che io povero programmatore devo pure "aiutare" se no crea codice non valido non è che sia proprio il massimo dai!
Poi non so che tipo di programmi fate voi, ma i miei devono stare su H24 / 365 giorni all'anno appena c'è un crash tutti i telefoni iniziano a suonare ![]() E' per questo che io inizio ad essere sempre più convinto che il C non sia più una soluzione efficace cosa me ne frega se è veloce se poi si schianta (va in SEGFAULT)? Ritornando in topic mi è piaciuto come hanno fatto le istruzioni SSE per confrontare i double (CMPSD e CMPSS) che ritorna il valore come un array di bit 1 o 0 nella destinazione se la condizione è true o false... molto semplice da convertire nel tipo bool di .NET: un bel AND e via! Senza dover fare branch o altri casini... Peccato che manchi l'istruzione equivalente per fare il confronto tra interi la vecchia CMP setta i flag register e lì un branch non te lo toglie nessuno (forse puoi usare l'istruzione TEST per evitarlo?). Avevo provato a cercare nelle istruzione MMX, ma mi sembra che le uniche comparazione erano tra "packed integer" e non scalari... poi MMX usa gli stessi "registri" della FPU quindi mi pare un incubo da usare (infatti mi sa non la usa più nessuno!). Non mi piace nemmeno che SSE non abbia modo di operare su Int64 (mentre la vecchia FPU sì come è possibile?), né con valori unsigned... questo mi ruppe le uova nel paniere quando cercai di abolire ogni traccia della FPU da Cosmos ![]()
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! Ultima modifica di fano : 30-10-2016 alle 20:18. |
![]() |
![]() |
![]() |
#53 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
#54 | |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#55 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Si le ho viste, ma appunto funzionano con "packed integers" e non con "scalar integers" cioè non possono essere usati per fare il semplice:
Codice:
int a = 42; int b = 69; bool res = (a == b); // res = false;
__________________
Cosmos C# Open Source Managed Operating System Cosmos Thread Ufficiale Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat! |
![]() |
![]() |
![]() |
#56 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
E tu usa solo la parte bassa / primo elemento.
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:19.