Creare Videogiochi - Game Developer
[C Benchmark] Piccolo benchmark per CPU - Versione stampabile

+- Creare Videogiochi - Game Developer (https://www.making-videogames.net/giochi)
+-- Forum: Programmazione (https://www.making-videogames.net/giochi/Forum-Programmazione)
+--- Forum: Programmazione in C C++ e C# (https://www.making-videogames.net/giochi/Forum-Programmazione-in-C-C-e-C)
+--- Discussione: [C Benchmark] Piccolo benchmark per CPU (/thread-C-Benchmark-Piccolo-benchmark-per-CPU)



[C Benchmark] Piccolo benchmark per CPU - ManHunter - 06-05-2011

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.



RE: [C Benchmark] Piccolo benchmark per CPU - David - 07-05-2011

uhm quindi chi come me ha un quad core avrà lo stesso risultato di uno che ha un singolo core?


RE: [C Benchmark] Piccolo benchmark per CPU - steve - 07-05-2011

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.


RE: [C Benchmark] Piccolo benchmark per CPU - ManHunter - 07-05-2011

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...


RE: [C Benchmark] Piccolo benchmark per CPU - Alche - 08-05-2011

bravissimo, a me mi interessano molto questi programmi di benchmark, ne vorrei fare uno anch'io xD


RE: [C Benchmark] Piccolo benchmark per CPU - steve - 08-05-2011

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;
}