Come testare il software su altre piattaforme

2

Sono preoccupato per il determinismo in virgola mobile e il fatto che diverse CPU hanno implementazioni diverse delle operazioni FPU in modo tale che lo stesso codice C ++ avrà risultati diversi quando compilato ed eseguito su macchine diverse.

Come posso testare il mio codice su altre piattaforme (cioè CPU) senza dover acquistare fisicamente nuovo hardware?

    
posta user2108462 16.03.2017 - 19:57
fonte

2 risposte

1

Pensare che i risultati in virgola mobile dovrebbero sempre produrre lo stesso risultato è in qualche misura fuorviato.

La maggior parte delle implementazioni oggi utilizza aritmetica in virgola mobile IEEE 754 a precisione a 32 bit e precisione doppia a 64 bit. È possibile utilizzare il doppio lungo che è 64 bit, 80 bit o 128 bit a seconda dell'implementazione, quindi non darà risultati identici. Ma dà risultati migliori . Quindi puoi scegliere tra i risultati migliori e identici . Cosa preferisci, migliore o identico? Preferisco "meglio".

Il tuo compilatore potrebbe rendere disponibile o meno l'opzione moltiplicata per fusione. Se disponibile, ti dà più precisione, più velocità e risultati diversi. Cosa preferisci, più veloce e migliore, o identico? Preferisco "più veloce e migliore".

Se i risultati su due implementazioni sono leggermente diversi, non c'è problema. Se sono molto diversi, sei fortunato (tipo): hai appena scoperto che c'è un problema con i tuoi calcoli. Se hai i risultati A e B, e sono diversi, e non hai motivo per cui A o B sarebbe il risultato migliore e l'altro sarebbe sbagliato, ora sai che i tuoi calcoli producono solo risultati sbagliati e devono essere corretti . Con risultati identici, non avresti mai saputo.

Puoi considerarti fortunato se pensi che avere risultati cattivi e sapere che è meglio che avere risultati cattivi e non sapere.

    
risposta data 16.03.2017 - 21:56
fonte
1

Se si desidera un comportamento in virgola mobile deterministico, compilare il codice sempre sulla stessa macchina ed eseguire i binari pre-compilati su qualsiasi macchina debba essere eseguito il software. Diverse ottimizzazioni del compilatore e diverse versioni del compilatore possono leggermente regolare la precisione dei calcoli in virgola mobile.

IEEE 754 dovrebbe garantire che se si ha lo stesso codice assembly e una CPU diversa, si otterranno comunque gli stessi risultati. Quindi, non importa dove si esegue il codice; importa dove si compila il codice (supponendo che l'architettura software non cambi, che di solito non funziona in questi giorni poiché quasi tutto è amd64).

Se vuoi supportare le architetture ARM, preparati a pensare che il codice possa produrre risposte leggermente diverse rispetto a quando si esegue su amd64.

Se hai assolutamente bisogno di determinismo, considera l'utilizzo di numeri interi. I numeri decimali possono essere rappresentati da numeri interi fissi.

    
risposta data 16.03.2017 - 21:19
fonte

Leggi altre domande sui tag