2013-06-16 22 views
5

Sto cercando di capire gli effetti della memorizzazione nella cache a livello di programmazione utilizzando il seguente programma. Sto ottenendo segfault con il codice. Ho usato GDB (compilato con -g -O0) e ha scoperto che era la segmentazione fagliazione sulErrore di segmentazione quando si chiama clock()

start = clock() (first occourance) 

Sto facendo qualcosa di sbagliato? Il codice mi sta bene. Qualcuno può indicare l'errore?

#include <stdio.h> 
#include <sys/time.h> 
#include <time.h> 
#include <unistd.h> 

#define MAX_SIZE (16*1024*1024) 
int main() 
{ 
    clock_t start, end; 
    double cpu_time; 
    int i = 0; 
    int arr[MAX_SIZE]; 

    /* CPU clock ticks count start */ 
    start = clock(); 

    /* Loop 1 */ 
    for (i = 0; i < MAX_SIZE; i++) 
     arr[i] *= 3; 

    /* CPU clock ticks count stop */ 
    end = clock(); 

    cpu_time = ((double) (end - start))/CLOCKS_PER_SEC; 

    printf("CPU time for loop 1 %.6f secs.\n", cpu_time); 

    /* CPU clock ticks count start */ 
    start = clock(); 

    /* Loop 2 */ 
    for (i = 0; i < MAX_SIZE; i += 16) 
     arr[i] *= 3; 

    /* CPU clock ticks count stop */ 
    end = clock(); 

    cpu_time = ((double) (end - start))/CLOCKS_PER_SEC; 

    printf("CPU time for loop 2 %.6f secs.\n", cpu_time); 

    return 0; 
} 

risposta

4

provare a cambiare:

int arr[MAX_SIZE]; 

a:

int *arr = (int*)malloc(MAX_SIZE * sizeof(int)); 

Come Potatoswatter suggerito The array might be too big for the stack ... Si potrebbe allocare sul mucchio, che sulla pila ...

More informations .

8

L'array potrebbe essere troppo grande per lo stack. Prova a renderlo static invece, quindi va nello spazio variabile globale. Come bonus aggiuntivo, le variabili static vengono inizializzate a zero.

A differenza di altri tipi di archiviazione, il compilatore può verificare che le risorse esistano per i globali in fase di compilazione (e il sistema operativo può ricontrollare in fase di esecuzione prima dell'avvio del programma), quindi non è necessario gestire gli errori di memoria. Una matrice non inizializzata non renderà il file eseguibile più grande.

Questo è uno sfortunato vantaggio del modo in cui funziona lo stack. Vive in un buffer di dimensioni fisse, impostato dalla configurazione del programma eseguibile in base al sistema operativo, ma le sue dimensioni effettive vengono raramente verificate rispetto allo spazio disponibile.

Benvenuti nello Stack Overflow land!

Problemi correlati