arkkimede
2017-05-10 06:59:42 UTC
Ciao a tutti.
Avrei bisogno di un suggerimento.
PREMESSA
Ho una piastra SDR che utilizzo per acquisire un segnale radio.
La piastra imposta tutti i parametri caratteristici e mi restituisce il segnale numerico in banda base.
Le capacita' eleborative della piastra sono un compromesso legato alla necesitta' di avere un dispositivo leggero e poco ingombrante pur mantenendo le capacita' elaborative.
Allo stato attuale attualmente il codice lavora allocandosi il vettore "piu' lungo" che non causi un crash del codice, immagazzina i dati ricevuti in questo vettore ed alla fine li scrive su file.
In questo contesto, al massimo, riesco ad ottenere spezzoni di segnale lunghi 43 secondi.
Chiedendo a persone con maggior esperinza, una possibile soluzione per superare questo vincolo dei 43 secondi e' quella di ricorrere ad un sistema multi-thread seguendo la filosofia dei due processi Produttore-Consumatore.
Ossia il produttore acquisisce sequenzialmente blocchi di lunghezza prefissata di dati e li immagazzina in un buffer circolare ed il Consumatore accede alla medesima area di memoria e scrive questi blocchi su file.
Il buffer circolare lo ho implementato semplicemente indirizzando l'elemento i-esimo del vettore come
Vect[i%lenVect] = x;
in questo modo, facendo crescere i all'infinito, si accede sempre al medesimo vettore, lasciando il tempo al consumatore di svuotare le aree del buffer che saranno riempite dal produttore al prossimo giro.
Ho una variabile mutex che controlla se i due processi stanno accedendo contemporaneamente alla stessa area di memoria e li blocca in modo mutuamente esclusivo.
Prima di implementare il codice complessivo, per separare i problemi ed essere sicuro che la parte multi-thread funzionasse correttamente, ho sviluppato una versione "simile" che non utilizzasse le feature della piastra ma semplicemente riempisse blocchi del vettore con numeri sequenziali nel produttore e che detti blocchi fossero salvati nel consumatore, riuscendo a salvare spezzoni equivalenti a circa 87 secondi (sono consapevole che non si puo' arrivare all'infinito perche comunque la scrittura su file e' un'operazione molto piu' lenta dell'acquisizione dei dati)
Il codice reale invece, funziona correttamente per sequenze molto corte ma quando le allungo alla fine la piastra va in over-run ed il codice va in segmentation fault. E' come se le capacita' elaborative richieste per effettuare tutte le operazioni relative alla ricezione del segnale radio, vadano in conflitto con il thread che deve scrivere su file.
FINE PREMESSA
Dopo questa lunga premessa la domanda:
Esiste un criterio per stabilire se oramai ho raggiunto la massima capacita' elaborativa della macchina di calcolo in un sistema multi thread oppure ho ancora margine per ottimizzare il codice per superare le attuali prestazioni?
E da una settimana che ci provo senza successo e non vorrei "star solo raschiando il fondo del barile"
Grazie
Avrei bisogno di un suggerimento.
PREMESSA
Ho una piastra SDR che utilizzo per acquisire un segnale radio.
La piastra imposta tutti i parametri caratteristici e mi restituisce il segnale numerico in banda base.
Le capacita' eleborative della piastra sono un compromesso legato alla necesitta' di avere un dispositivo leggero e poco ingombrante pur mantenendo le capacita' elaborative.
Allo stato attuale attualmente il codice lavora allocandosi il vettore "piu' lungo" che non causi un crash del codice, immagazzina i dati ricevuti in questo vettore ed alla fine li scrive su file.
In questo contesto, al massimo, riesco ad ottenere spezzoni di segnale lunghi 43 secondi.
Chiedendo a persone con maggior esperinza, una possibile soluzione per superare questo vincolo dei 43 secondi e' quella di ricorrere ad un sistema multi-thread seguendo la filosofia dei due processi Produttore-Consumatore.
Ossia il produttore acquisisce sequenzialmente blocchi di lunghezza prefissata di dati e li immagazzina in un buffer circolare ed il Consumatore accede alla medesima area di memoria e scrive questi blocchi su file.
Il buffer circolare lo ho implementato semplicemente indirizzando l'elemento i-esimo del vettore come
Vect[i%lenVect] = x;
in questo modo, facendo crescere i all'infinito, si accede sempre al medesimo vettore, lasciando il tempo al consumatore di svuotare le aree del buffer che saranno riempite dal produttore al prossimo giro.
Ho una variabile mutex che controlla se i due processi stanno accedendo contemporaneamente alla stessa area di memoria e li blocca in modo mutuamente esclusivo.
Prima di implementare il codice complessivo, per separare i problemi ed essere sicuro che la parte multi-thread funzionasse correttamente, ho sviluppato una versione "simile" che non utilizzasse le feature della piastra ma semplicemente riempisse blocchi del vettore con numeri sequenziali nel produttore e che detti blocchi fossero salvati nel consumatore, riuscendo a salvare spezzoni equivalenti a circa 87 secondi (sono consapevole che non si puo' arrivare all'infinito perche comunque la scrittura su file e' un'operazione molto piu' lenta dell'acquisizione dei dati)
Il codice reale invece, funziona correttamente per sequenze molto corte ma quando le allungo alla fine la piastra va in over-run ed il codice va in segmentation fault. E' come se le capacita' elaborative richieste per effettuare tutte le operazioni relative alla ricezione del segnale radio, vadano in conflitto con il thread che deve scrivere su file.
FINE PREMESSA
Dopo questa lunga premessa la domanda:
Esiste un criterio per stabilire se oramai ho raggiunto la massima capacita' elaborativa della macchina di calcolo in un sistema multi thread oppure ho ancora margine per ottimizzare il codice per superare le attuali prestazioni?
E da una settimana che ci provo senza successo e non vorrei "star solo raschiando il fondo del barile"
Grazie