Come sfruttare più di un core della CPU?

di il
17 risposte

Come sfruttare più di un core della CPU?

È possibile eseguire diversi threads con diversi cores? nel mio caso devo semplicemente esguire una semplice operazione il maggior numero di volte possibile in un secondo, e ho notato che la CPU non viene mai sfruttata al cento per cento mentre per esempio un programma con un semplice ciclo infinito in C porta il processore al 100%.

17 Risposte

  • Re: Come sfruttare più di un core della CPU?

    PLAYER.RUNNER ha scritto:


    è possibile eseguire diversi threads con diversi cores?
    Il multi-threading serve appunto a quello.
  • Re: Come sfruttare più di un core della CPU?

    Il mio programma tuttavia non va mai a sfruttare più del 30% della CPU anche se ha 2 threads
  • Re: Come sfruttare più di un core della CPU?

    PLAYER.RUNNER ha scritto:


    Il mio programma tuttavia non va mai a sfruttare più del 30% della CPU anche se ha 2 threads
    Dipende cosa fanno i thread, dipende da quanti "core" hai a disposizione, dipende (anche in parte) dal S.O. sottostante.
  • Re: Come sfruttare più di un core della CPU?

    I thread come detto prima sono due, uno che è quello principale e gestisce l'interfaccia grafica dell'applicazione (cose leggere), l'altro che è sostanzialmente un ciclo infinito che cambia un grande numero di valori (qualche milione) in un array bidimensionale e riesce a fare questo processo circa 15-16 volte al secondo. Utilizzo un I7 da 2 core fisici e quattro theads. E sono su windows. C'è un modo per eseguire quel processo più volte in meno tempo? Si può eventualmente creare un altro thread che faccia la stessa cosa in parallelo per accelerare?
  • Re: Come sfruttare più di un core della CPU?

    PLAYER.RUNNER ha scritto:


    uno che è quello principale e gestisce l'interfaccia grafica dell'applicazione (cose leggere)
    E quindi, ragionevolmente, "caricherà" relativamente poco la CPU. Se parliamo di interfaccia Swing il suo (unico) thread è il Event Dispatch Thread che fa certo dei lavori ma è basato su "eventi" e quindi raramente impegna veramente tanto la CPU.

    PLAYER.RUNNER ha scritto:


    l'altro che è sostanzialmente un ciclo infinito che cambia un grande numero di valori (qualche milione) in un array bidimensionale e riesce a fare questo processo circa 15-16 volte al secondo.
    E quindi tecnicamente "caricherà" al massimo la capacità di un singolo core. Tieni inoltre presente che i thread NON utilizzano i core in modo fisso/esclusivo. Se hai un thread X che dura molti secondi, in un certo istante potrebbe usare il core 1, poco dopo il core 2, poi riprendere più avanti la esecuzione sul core 1, ecc... Questo DIPENDE dallo scheduler del S.O.

    PLAYER.RUNNER ha scritto:


    e quattro theads.
    Hai detto prima due.

    PLAYER.RUNNER ha scritto:


    C'è un modo per eseguire quel processo più volte in meno tempo? Si può eventualmente creare un altro thread che faccia la stessa cosa in parallelo per accelerare?
    Ripeto: multi-threading (escludendo dal calcolo il EDT, che comunque carica poco la CPU).
    E se più thread devono accedere ad una stessa risorsa (es. un oggetto o array condiviso), allora DEVI aver ben chiare le questioni sulla concorrenza, sincronizzazione, visibilità delle modifiche tra thread e altro.
  • Re: Come sfruttare più di un core della CPU?

    Quando dicevo 4 threads intendevo il numero di core 'virtuali'.

    Se utilizzassi un altro thread che fa le stesse cose del secondo ma con un altro array e poi ognuno di essi mandasse l'array elaborato al thread principale ci sarebbe un aumento di prestazione?

    Puoi consigliarmi della documentazione sulle questioni che dici?
  • Re: Come sfruttare più di un core della CPU?

    PLAYER.RUNNER ha scritto:


    Quando dicevo 4 threads intendevo il numero di core 'virtuali'.
    Sì vero, scusa, non ho letto bene io: infatti è tipico dire per le CPU moderne "N core / M thread".

    PLAYER.RUNNER ha scritto:


    Se utilizzassi un altro thread che fa le stesse cose del secondo ma con un altro array e poi ognuno di essi mandasse l'array elaborato al thread principale ci sarebbe un aumento di prestazione?
    Se fai due thread che fanno la STESSA identica cosa sullo stesso array (o anche se fosse duplicato) non stai migliorando le prestazioni, stai duplicando lo spreco ....
    Vedi la mia risposta in questa discussione.
  • Re: Come sfruttare più di un core della CPU?

    Se NON ci sono interferenze tra i thread E chi sviluppa l'applicazione utilizza CORRETTAMENTE la programmazione concorrente/parallela, lo speedup e' (piu' o meno) lineare con il numero dei thread FINO al numero di thread FISICI della CPU.

    Se hai una CPU con 8 thread, la tua applicazione puo' stare 1/8 del tempo iniziale per essere eseguita.
    ANCHE se imposti 16 o 32 thread!!!

    ATTENZIONE: ho scritto SE NON CI SONO INTERFERENZE.
    Altrimenti, entrano in gioco altre N-mila questioni
  • Re: Come sfruttare più di un core della CPU?

    Non è che i due thread farebbero la stessa cosa, diciamo che ad un certo istante x il primo thread assegna tutti i valori necessari all'array a1, una volta finito invia l'array al thread principale e ricomincia il lavoro ad un istante x2. Nel mentre il secondo thread aveva iniziato lo stesso processo su un array diverso in un istante y e, ottenuto un risultato diverso in un momento diverso, lo aveva mandato al thread principale e aveva ricominciato il lavoro.
    In questo modo nel tempo che impiegava un thread per fare una volta il processo, i due insieme lo fanno 2 volte.
    Ha un senso quest'idea o ho fatto un errore di concetto da qualche parte?
    Se tutto ciò non fosse possibile, ci sarebbe un modo per far arrivare l'utilizzo della CPU al 100%?
  • Re: Come sfruttare più di un core della CPU?

    La questione nel è banale (visto che ormai tutti gli indirizzi sono virtuali e pure paginati), e meno ancora nel caso di Java, che aggiunge un "mammozzone" non da poco (la JVM) che quindi "distrugge" tutti i ragionamenti che si possono fare dal punto di vista teorico.
    Comunque, in generale e sotto le precedenti osservazioni, il suggerimento due post sopra è quello che si adotta normalmente.
    Parallelizzazione come riduzione massima di interdipendenza tra le porzioni di codice in esecuzione parallela; possibilmente anche con riduzione massima (eliminazione) delle race condition.
    Ad esempio nel mondo "reale" (che poi è virtuale comunque), cioè quello-non JAVA, non si adotta mai una politica del tipo
    "due thread lavorano uno le righe pari e uno le righe dispari di un vettore", perchè questo distrugge tutta una serie di meccanismi (o meglio ne riduce l'efficienza) di pre-caricamento nella cache e nelle pipeline della CPU dei dati provenienti dalla memoria.
    Piuttosto (riprendendo questo esempio banale) il thread 1 va da 0 a n/2-1 righe, il thread 2 da n/2 a n.
    Questo proprio per sfruttare la località dei dati, ridurre le bubble e chi più ne ha ne metta.

    Giusto per darti una (sia pur vaga) idea di quanto sia difficile scrivere un "buon" programma parallelo, ed ancor più in Java.
  • Re: Come sfruttare più di un core della CPU?

    Quello che ho scritto nella mia risposta precedente quindi ha un senso in termini di guadagno di performance o no?
    E se i threads fossero 4 la CPU toccerebbe il 100% o no?
  • Re: Come sfruttare più di un core della CPU?

    Chi può dirlo?
    Fermo che è molto difficile (quasi impossibile, quasi) saturare la CPU con un programma Java, raggiungi il 100% teorico (quindi al netto della JVM blablabla) qualora ogni thread abbia un tempo di esecuzione > del turnaround del sistema operativo (che poi è sempre la JVM+il sistema operativo).
    Se, per dire, un thread non fa nulla (esempio ciclo a vuoto) ne puoi eseguire anche centinaia in parallelo, senza arrivare al 100% della CPU
  • Re: Come sfruttare più di un core della CPU?

    PLAYER.RUNNER ha scritto:


    Quello che ho scritto nella mia risposta precedente quindi ha un senso in termini di guadagno di performance o no?
    E se i threads fossero 4 la CPU toccerebbe il 100% o no?
    Se vuoi sfruttare il multi-threading per aumentare le prestazioni e diminuire i tempi devi (saper) "partizionare" il lavoro da compiere.
    Non ti preoccupare adesso del "voglio arrivare al 100%". Inizia a preoccuparti di COME partizionare il lavoro, sempre ammesso che sia possibile.
  • Re: Come sfruttare più di un core della CPU?

    Ho fatto dei tentativi con 2 e 3 threads (3 e 4 totali) e l'utilizzo della CPU è salito con 2 al 60% e con 3 al 90%. Tuttavia ho notato che le prestazioni dei singoli thread diminuiscono in modo (a quello che vedo) non prevedibile tra lo 0 e il 20% in meno con 2 thread e tra il 30 e il 50% in meno con 3 thread.
    Ho notato inoltre che il thread che più risente di una perdita di prestazioni è l'ultimo che viene creato, c'è un motivo?
    Più di così non posso ottenere o c'è qualcosa in più che posso fare?
Devi accedere o registrarti per scrivere nel forum
17 risposte