Avendo già letto questo question Sono ragionevolmente certo che un determinato processo che utilizza aritmetica in virgola mobile con lo stesso input (sullo stesso hardware, compilato con lo stesso compilatore) dovrebbe essere deterministico. Sto guardando un caso in cui ciò non è vero e cerco di determinare cosa potrebbe aver causato questo.Cosa potrebbe causare un processo deterministico per generare errori in virgola mobile
Ho compilato un file eseguibile e gli sto dando gli stessi dati esatti, in esecuzione su una singola macchina (non multithreaded) ma sto ricevendo errori di 3.814697265625e-06 che dopo aver cercato su Google ho trovato è in realtà pari a 1/4^9 = 1/2^18 = 1/262144. che è abbastanza vicino al livello di precisione di un numero in virgola mobile a 32 bit (circa 7 cifre secondo wikipedia)
Il mio sospetto è che abbia qualcosa a che fare con le ottimizzazioni che sono state applicate al codice. Sto usando il compilatore intel C++ e ho trasformato la speculazione in virgola mobile in rapida invece che sicura o severa. Questo potrebbe rendere un processo in virgola mobile non deterministico? Ci sono altre ottimizzazioni ecc. Che potrebbero portare a questo comportamento?
EDIT: Come suggerito da Pax, ho ricompilato il codice con la speculazione in virgola mobile trasformata in sicura e ora sto ottenendo risultati stabili. Questo mi permette di chiarire questa domanda - cosa fa realmente la speculazione in virgola mobile e in che modo ciò può causare lo stesso binario (cioè una compilazione, più esecuzioni) per generare risultati diversi se applicati allo stesso input identico?
@Ben Sto compilando utilizzando Intel (R) C++ 11.0.061 [IA-32] e sono in esecuzione su un processore Intel quadcore.
Quale processore del processore e quale compilatore? .. per favore – Ben
Se hai capito quale flag lo sta causando, perché non controllare la documentazione del compilatore? –
@Tal - Ho difficoltà a reperire qualsiasi cosa dalla documentazione (dice solo che veloce abilita fps e disabilita/disabilita severamente). Il meglio che riesco a capire, fps permette il riordino delle operazioni (a * c + b * c => c * (a + b)) ma queste sono ottimizzazioni del tempo di compilazione, il binario risultante dovrebbe essere ancora deterministico e mi piacerebbe molto per sapere esattamente perché non lo è. –