• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 1 voto(i) - 5 media
  • 1
  • 2
  • 3
  • 4
  • 5
[C Benchmark] Piccolo benchmark per CPU
#1
Salve,
ho realizzato questo facile benchmark per CPU in C. L'algoritmo è facile: ricerca i numeri primi in base al numero massimo fornito dall'utente in ingresso, li stampa a video e li conta.
Alla fine, stampa il tempo di esecuzione della ricerca e il numero di primi trovati.
Ecco il codice:
Codice PHP:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

int isPrime( int );

int main()
{
    
struct timeval iniziofine;
    
long int time;
    
int maxPrime2count 0;
    
char choice[2];
    
    do
    {
        
printf"Inserisci il numero massimo entro il quale calcolare i numeri primi\t>" );
        
scanf"%d", &maxPrime );
        
printf"\n" );
        
gettimeofday( &inizio);
        while ( 
maxPrime )
        {
            if( 
isPrime) ){
                
printf"%d\n");
                
count++;
            }
            
c++;
        }
        
gettimeofday( &fine);
        
time = ((fine.tv_sec inizio.tv_sec) * 1000000 + (fine.tv_usec inizio.tv_usec)) / 1000;
        
printf"\n" );
        
printf"Tempo d'esecuzione:\t%li millisecondi\n",time );
        
printf"I numeri primi sono %d.\n"count );
        
        
printf"Ripetere l'esecuzione? Y/N\t" );
        
scanf"%s"choice );
    }while( 
choice[0] != 'N' && choice[0] != 'n' );
    
printf"\n" );
    
system"PAUSE" );
    return 
EXIT_SUCCESS;
}

int isPrimeint numero )
{
    
int i 2isPrimeFlag 1;
    
    while( 
isPrimeFlag == && numero )
    {
        if( 
numero == )
            
isPrimeFlag 0;
        
i++;
    }
    return 
isPrimeFlag;


Posterò anche il .exe già compilato a breve. Il codice non è multithreading, quindi, sia che voi abbiate un quad core o un sistema a singolo processore, il risultato non varierà in funzione del numero di core...

Saluti.
 
Rispondi
#2
uhm quindi chi come me ha un quad core avrà lo stesso risultato di uno che ha un singolo core?
 
Rispondi
#3
Quando si programma si "sceglie" se far fare più operazioni contemporaneamente (un operazione per ogni thread) oppure se eseguire un operazione alla volta.
Nel secondo caso, anche nei processori multi-core, tutte le operazioni vengono eseguite su un solo core. Nel primo caso invece è possibile sfruttare anche gli altri core, ma è il programmatore che decide quale parte del codice viene eseguita da un core e quale da un altro (e questo complica notevolmente la stesura del programma).

Ogni core ha minimo un thread, ma può averne anche più di uno, quindi si può sfruttare questo tipo di programmazione anche sui single core, tuttavia l'incremento di prestazioni non è così netto come sui processori multi-core (e non è sempre detto che ci sia).

Bisogna fare attenzione però, un programma single-thread gira su ogni processore, un programma multi-thread non gira sui processori single-core + single-thread (oppure se il numero di thread totali è inferiore al numero di thread utilizzati dal programma).

multithreading


In questo caso se io ho un processore single-core con 3GHz di clock e tu un proessore multi-core con 2GHz di clock, il programma gira più velocemente da me.
 
Rispondi
#4
Esattamente... Se mi date un po' di tempo inizio a documentarmi e ad imparare qualcosa anche sullo sviluppo di software che fanno uso di più thread...
 
Rispondi
#5
bravissimo, a me mi interessano molto questi programmi di benchmark, ne vorrei fare uno anch'io xD
 
Rispondi
#6
Comunque noto che nel tuo codice includi sys\time.h , quindi presumo che utilizzi linux.

In windows un programma simile potrebbe essere fatto così (ho riutilizzato in gran parte il tuo codice):
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int isPrime( int );

int main()
{
    unsigned long inizio, time;
    int maxPrime, c, count;
    char choice[2];
    do
    {
        inizio = 0;
        time = 0;
        c = 2;
        count = 0;
        printf( "Inserisci il numero massimo entro il quale calcolare i numeri primi\t>" );
        scanf( "%d", &maxPrime );
        printf( "\n" );
        inizio = GetTickCount();
        while ( c < maxPrime )
        {
            if( isPrime( c ) ){
                printf( "%d\n", c );
                count++;
            }
            c++;
        }
        time = GetTickCount() - inizio;
        printf( "\n" );
        printf( "Tempo d'esecuzione:\t%li millisecondi\n",time );
        printf( "I numeri primi sono %d.\n", count );
        
        printf( "Ripetere l'esecuzione? Y/N\t" );
        scanf( "%s", choice );
    }while( choice[0] != 'N' && choice[0] != 'n' );
    printf( "\n" );
    system( "PAUSE" );
    return EXIT_SUCCESS;
}

int isPrime( int numero )
{
    int i = 2, isPrimeFlag = 1;
    
    while( isPrimeFlag == 1 && i < numero )
    {
        if( numero % i == 0 )
            isPrimeFlag = 0;
        i++;
    }
    return isPrimeFlag;
}
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Piccolo aiuto? Tank269 13 1,721 29-03-2015, 07:49 AM
Ultimo messaggio: Master Gabriel
  SDL, un piccolo (?) aiuto Synlu 2 1,410 09-03-2013, 01:30 AM
Ultimo messaggio: Synlu

Vai al forum:


Browsing: 1 Ospite(i)