Sto eseguendo alcune operazioni critiche sulle prestazioni in C++ e attualmente utilizziamo calcoli integer per problemi che sono intrinsecamente a virgola mobile perché "più veloce". Questo causa un sacco di fastidiosi problemi e aggiunge un sacco di codice fastidioso.Calcoli in virgola mobile vs integer su hardware moderno
Ora, mi ricordo di aver letto su come i calcoli in virgola mobile sono stati così lenti approssimativamente circa i 386 giorni, dove credo (IIRC) che ci fosse un co-Processore opzionale. Ma sicuramente al giorno d'oggi con CPU esponenzialmente più complesse e potenti non fa differenza in "velocità" se si eseguono calcoli in virgola mobile o interi? Soprattutto perché il tempo di calcolo effettivo è minuscolo rispetto a qualcosa di simile a causare uno stallo della pipeline o il recupero di qualcosa dalla memoria principale?
So che la risposta corretta è quella di eseguire il benchmark sull'hardware di destinazione, quale sarebbe un buon modo per testarlo? Ho scritto due piccoli programmi C++ e ho confrontato il loro tempo di esecuzione con "time" su Linux, ma il tempo di esecuzione effettivo è troppo variabile (non aiuta a funzionare su un server virtuale). A parte passare tutto il giorno a gestire centinaia di benchmark, fare grafici, ecc. C'è qualcosa che posso fare per ottenere un ragionevole test della velocità relativa? Qualche idea o pensiero? Ho completamente torto?
I programmi che ho usato come segue, essi non sono identici con qualsiasi mezzo:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main(int argc, char** argv)
{
int accum = 0;
srand(time(NULL));
for(unsigned int i = 0; i < 100000000; ++i)
{
accum += rand() % 365;
}
std::cout << accum << std::endl;
return 0;
}
Programma 2:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main(int argc, char** argv)
{
float accum = 0;
srand(time(NULL));
for(unsigned int i = 0; i < 100000000; ++i)
{
accum += (float)(rand() % 365);
}
std::cout << accum << std::endl;
return 0;
}
Grazie in anticipo!
Modifica: la piattaforma a cui tengo è regolare x86 o x86-64 in esecuzione su computer desktop Linux e Windows.
Modifica 2 (incollato da un commento di seguito): Attualmente disponiamo di una base di codice estesa. In realtà mi sono imbattuto nella generalizzazione secondo la quale "non dobbiamo usare float dato che il calcolo degli interi è più veloce" - e sto cercando un modo (se questo è vero) per smentire questa ipotesi generalizzata. Mi rendo conto che sarebbe impossibile prevedere il risultato esatto per noi, a corto di fare tutto il lavoro e di profilarlo in seguito.
In ogni caso, grazie per tutte le vostre eccellenti risposte e aiuto. Sentiti libero di aggiungere altro :).
Quello che hai come test ora è banale. Probabilmente c'è anche una piccola differenza nell'assemblaggio, (ad esempio, 'addl' sostituito con' fadd', ad esempio). L'unico modo per ottenere una buona misura è ottenere una parte fondamentale del tuo programma reale e profilare diverse versioni di questo. Sfortunatamente questo può essere piuttosto difficile senza usare tonnellate di sforzi. Forse indicandoci l'hardware di destinazione e il tuo compilatore aiuterebbe le persone a fornirti un'esperienza preesistente, ecc. A proposito del tuo uso di interi, ho il sospetto che potresti creare una sorta di classe di template "fixed_point' che faciliterebbe enormemente tale lavoro. – GManNickG
Ci sono ancora molte architetture là fuori che non hanno hardware dedicato in virgola mobile - alcuni tag che spiegano i sistemi che ti interessano ti aiuteranno a ottenere risposte migliori. –
Questo è un buon punto. Al momento abbiamo una grande base di codice, e sto cercando di rendere l'argomento che sarebbe essenzialmente la stessa "velocità" in ogni caso.Sperando di trovare alcune prove a supporto del mio punto di vista - per giustificare il lavoro di passaggio. In ogni caso - grazie per l'idea del template - lo proverò. – maxpenguin