Problema di sovrautilizzo di CPU

di il
10 risposte

Problema di sovrautilizzo di CPU

Ciao a tutti

volevo avere un consiglio per gestire al meglio il mio codice senza che l'utilizzo della CPU vada alle stelle.

Sto sviluppando un programma in c++ con raspberry, quindi sistema operativo Linux, in questo programma gestisco 3 Thread diversi che sono continuamente in loop infinito, parto dal fatto che funziona tutto alla perfezione, ma se controllo l'utilizzo della CPU vedo che và a 50-60%, questo valore scende se inserisco uno usleep() di almeno 50ms.

Il valore scende a 10-12%, ma volevo chiederti se è corretta una gestione del genere e se c'è un modo di evitare di inserire gli usleep(), visto che così la logica di programma si rallenta

10 Risposte

  • Re: Problema di sovrautilizzo di CPU

    Considerando che hai 3 thread credo che un impegno della cpu al 50-60% sia accettabile. In fondo non è che può processare 2000 thread contemporaneamente.

    Una soluzione più elegante di quella che hai citato sarebbe aumentare l'instruction level parallelism e il thread level parallelism, in modo da evitare stalli e ottimizzare le prestazioni, ma una cosa del genere la fa già il compilatore e credo sia difficile fare di meglio.
  • Re: Problema di sovrautilizzo di CPU

    Peccato...
    ma allora la percentuale di utilizzo diminuisce solamente dal fatto che inserendo delle pause con la funzione usleep() non viene processato il Thread dove è inserito, quindi il carico della CPU è minore??

    Secondo te se riuscissi ad eliminare un Thread e inglobassi le sue funzioni in un Thread unico la situazione cambierebbe o rimarrebbe invariato in quanto il codice da eseguire è lo stesso??

    In poche parole dipende dal numero di Thread o dalla complessità del codice??

    Tenendo conto che il programma è costituito da poco più di 9000 righe.
  • Re: Problema di sovrautilizzo di CPU

    E' un discorso complesso.

    In linea generale ogni core di un processore general purpose può processare 2-4 thread in parallelo (poi ci sono altri meccanismi per far in modo di processare ancora più thread ma a turno), quindi se riduci il numero di thread dovresti ridurre l'impegno della cpu ma al tempo stesso rallentare il programma.

    Però ci possono essere dei casi in cui i thread sono difficilmente processabili in parallelo, ad esempio perché ci sono delle dipendenze di dato, e ciò può provocare stalli, che se particolarmente lunghi peggiorano le prestazioni e al contempo tengono occupata la cpu.

    In generale se lavori con linguaggi di alto livello il compilatore provvede già a ottimizzare il codice, in modo da ridurre almeno le dipendenze di dato e gli altri tipi di cause di stallo (ad esempio riordinando le istruzioni). Per fare di meglio bisognerebbe analizzare molto nel dettaglio (livello assembly) il codice, ma come detto l'altro giorno un impegno della cpu al 50-60% è più che accettabile.

    Comunque, se vuoi avere consigli più dettagliati ti conviene chiedere nella sezione ingegneria del software. La mia conoscenza dell'argomento è ancora abbastanza superficiale, dovrei approfondirla quest'anno all'università.

    ciao
  • Re: Problema di sovrautilizzo di CPU

    Quanto dice dvaosta è corretto.

    Non conoscendo il programma ma sapendo che hai tre thread che girano e ciascuno dei quali ha un ciclo infinito, immagino siano in attesa che si riealizi un qualche evento per poi fare qualcosa; l'unico consiglio che ti si può dare è di vedere se è possibile avere un solo thread con un unico ciclo infinito che attende il verificarsi dell'evento e che quando esso si verifica, vengono generati gli altri thread che fanno quello che devono e muoiono lasciando superstite il thread che li ha generati.

    Ma come già ti diceva dvaosta è un argomento complesso che comunque richiede la conoscenza del problema specifico per capire se possibile trovare un'ottimizzazione delle risorse della CPU e non è detto che ciò si possa avere.
  • Re: Problema di sovrautilizzo di CPU

    Grazie mille ragazzi, siete stati chiari

    Proverò a rivedere alcune sezioni di programma per ridurre di almeno un Thread, o meglio ancora come consigliato SVNiko, ristrutturo l'avvio dei Thread in modo che terminino una volta finito il compito che dovevano svolgere, mi sembra anche la gestione più ovvia e corretta.

    Grazie ancora a tutti per il supporto.
  • Re: Problema di sovrautilizzo di CPU

    Oppure dargli un tempo di esecuzione come si fa nei giochi e nei sistemi operativi senza che vadino in stallo e salvare le variabili sopratutto, buona lettura occhio ai semafori e alle posate.!
  • Re: Problema di sovrautilizzo di CPU

    @Rigo11

    È un thread di sei anni fa...
  • Re: Problema di sovrautilizzo di CPU

    Rigo ... non ha senso rispondere a tutti i thread tanto per rispondere ... un thread di 6 anni fa si lascia perdere ...
  • Re: Problema di sovrautilizzo di CPU

    @oregon i threading vengono serviti anche da richieste, infatti rispondere o servire chi non vuole essere servito non ha alcun senso.
  • Re: Problema di sovrautilizzo di CPU

    Rigo ma di cosa parli? I threading? E che hai inteso dire perché in italiano non si comprende.
Devi accedere o registrarti per scrivere nel forum
10 risposte