È l'orologio time.h () rotto sul mio hardware?
Domanda
Io cerco di misurare le cyles di clock necessari per eseguire un pezzo di codice sul TMS32064x + DSP che viene fornito con l'OMAP ZOOM 3430 MDK. Guardo il "manuale del programmatore" del chip DSP e si dice che il DSP supporta la funzione orologio ().
Quello che faccio è molto semplice, io faccio solo
start = clock();
for (i=0;i<100;i++){
/* do something here */
}
stop = clock();
total = stop - start;
e poi mettere i valori di "start", "stop" e "totale" per una memoria condivisa precedentemente allocato con il processore ARM. Poi ho semplicemente stamparlo su schermo a lato ARM.
Il problema è che nei miei primi esegue, ho sempre arrivare lo stesso valore "totale", e poi nei miei prossimi run ho sempre 0! "Start" e "Stop" valori andare avanti con il valore "totale".
La cosa più strana è che sembrano seguire uno schema di bit! Ho messo l'output di seguito:
# ./sampleapp
Total = 63744
Start clock() value = 0x000000f9
Stop clock() value = 0x0000f9f9
# ./sampleapp
Total = 4177526784
Start clock() value = 0x00f9f9f9
Stop clock() value = 0xf9f9f9f9
# ./sampleapp
Total clock cyles = 0
Start clock() value = 0xf9f9f9f9
Stop clock() value = 0xf9f9f9f9
A quanto pare, l'orologio () non funziona bene, ma non sono sicuro se questo è a causa di qualcosa che faccio di sbagliato o perché questo tipo di cose non è supportata con l'hardware ho. Tutte le idee perché questo potrebbe accadere?
Soluzione
Dalla lettura delle domande fino ad ora, direi che il manifesto originale ha sostanzialmente più la conoscenza di questa materia rispetto ai contribuenti fino ad ora, e che il sospetto che l'orologio () è rotto (o non supportato, e restituisce un non definito risultato) sul DSP sembra molto probabile.
Altri suggerimenti
Curiosamente, Perché avete bisogno di un precedentemente allocato memoria condivisa . Perché non provare con una variabile di stack normale? C'è qualcosa che mi manca?
Forse è necessario inizializzare l'orologio prima.
Come stai stampando fuori? forse il problema è in realtà con la visualizzazione del risultato?
sulla maggior parte delle piattaforme clock_t è molto lunga. Se stai usando printf con% d si potrebbe ottenere risultati variabili che è quello che si sta vedendo.
Supponendo l'inizio e la variabile end sono di tipo 'clock_t', e la vostra memoria condivisa assume la stessa interpretazione del l'altra estremità dei numeri passati, quindi il problema non è con la chiamata a orologio, e il vostro handleing della differenza tra l'inizio fine fine dei tempi.
Credo che il problema è nella memoria condivisa tra i due. Potete per favore inserire il codice per mostrare come si sta condividendo la memoria tra due processori separati?
Forse si potrebbe utilizzare alcuni assembly inline per accedere direttamente i registri del contatore della CPU.
Il TMS320C64x + ha un registro timestamp a 64 bit in TsCI, TSCH. Il contatore non è abilitata sul reset, è necessario scrivere al registro per avviare il contatore (forse questo è il problema con clock
?). La lettura dal registro non è abbastanza banale come ogni metà deve essere letto con un'istruzione separata (e si può ottenere interrupt ...).