Comando java per individuare il numero di core della cpu

di il
14 risposte

Comando java per individuare il numero di core della cpu

Esiste un comando java per individuare il numero di core/thread della cpu? Se si vuole scrivere un algoritmo multithread bisogna riferirsi ai thread oppure ai core? Per capirci su un i7 3770:
http://ark.intel.com/products/65719
conviene fare 4 thread oppure 8?
Sull'FX 8350 invece come ci si deve comportare?
http://www.amd.com/it/products/desktop/processors/amdfx/Pages/amdfx-model-number-comparison.aspx
Inoltre conviene lasciare un thread libero per il sistema oppure no?
La mia idea è fare un software di questo tipo:

1-individua il numero di core della cpu
2-crea tanti thread quanti sono quelli gestibili contenporaneamente dalla cpu

Ciao

14 Risposte

  • Re: Comando java per individuare il numero di core della cpu

    Non ha senso basare il numero di thread su quelli contemporaneamente gestibili dalla CPU.

    La schedulazione dei thread dipende dallo stato del sistema operativo e di quanti altri thread ci sono in esecuzione (possono essere centinaia) e dalla loro priorità.
  • Re: Comando java per individuare il numero di core della cpu

    Ciao, in Java puoi sapere il numero delle CPU attraverso l'istruzione
    Runtime.getRuntime().availableProcessors()
    .
    Per quanto mi avevano detto al corso di sistemi operativi all'università, il numero di thread ottimali per un programma (considerando lo scheduling e quant'altro) è uguale al numero di processori più 1.
  • Re: Comando java per individuare il numero di core della cpu

    Quindi sull'i7 3770 il numero di thread ottimale è 5 mentre sull'FX 8350 il numero ottimale è 9?

    Non ho capito un tubo allora... Considera che un thread potrebbe impegnare un core per circa 10 minuti. Se ho 4 core e 5 thread ogni core lavora per 10 minuti con i primi 4 thread poi uno dei 4 core restanti per 10 minuti con il 5° quindi in totale ci metto 20 minuti. Se avessi 4 thread ogni cpu del processore lavorerebbe per 12.5 minuti (50/4) risparmiando così 7 minuti e 30 secondi...

  • Re: Comando java per individuare il numero di core della cpu

    Secondo me dovresti affrontare il problema da un altro punto di vista: ho un compito che richiede in totale, che so, ad esempio 1 miliardo di operazioni. Tu puoi dividere questo task in un numero arbitrario di thread, però dovresti considerare il numero di core/cpu disponibili e, in generale, il fatto che ogni core/cpu non sarà dedicata solamente ai tuoi thread e, quindi, dovrà eseguire altri processi con i relativi threads. Per questo se usi molti thread c'è un'alta probabilità che, in un dato momento, uno di essi sia in esecuzione, ma frammenti troppo il programma e ci perdi in context switch e quant'altro.
    Al contrario se usi un solo thread non sfrutti il parallelismo.
    Per questo il numero ideale sarebbe uguale al numero di core (ovvero per sfruttare appieno il parallelismo). Dato, però, che i core non sono dedicati esclusivamente ai tuoi calcoli ma eseguono anche altri processi, allora utilizzando un ulteriore thread si aumenta la probabilità che uno di essi sia in esecuzione, senza degradare le performance (anzi, da test eseguiti in laboratorio nella nostra università erano emersi lievi miglioramenti).

    In ogni caso la questione della computazione parallela non è così semplice, perché bisognerebbe considerare, ad esempio, le operazioni di I/O e, in generale, si tratta di una questione application-specific.
  • Re: Comando java per individuare il numero di core della cpu

    Se nella tua università si è appurato questo concetto allora non ne discuto, sono solo poco convinto sulla motivazione. Farò dei test molto presto.

    grazie per la risposta

  • Re: Comando java per individuare il numero di core della cpu

    Ma che state a dì???

    settare il numero di thread a prescindere è sbagliato a prescidnere!!!


    i thread non possono accordarsi ai core in quanto un core può eseguire più thread "contemporaneamente"...gestiti dal sistema operativo...
  • Re: Comando java per individuare il numero di core della cpu

    Scusami, credo di non aver capito ciò che intendi
  • Re: Comando java per individuare il numero di core della cpu

    Neanche io...
  • Re: Comando java per individuare il numero di core della cpu

    Semplicemente che settare a prescindere il numero di thread è controproducente, visto che "deve" essere il s.o. a decidere quante e quali risorse assegnare.

    Avete presente come lavorano gli scheduler? Quindi è inutile (oltre che potenzialmente dannoso) assegnare un quantitativo di thread.

    Oppure io non ho capito un hacca di quello che state dicendo...

    Ripeto, sono fermamente convinto che stabilire un numero di thread ESCLUSIVAMENTE in base ai core del processore è sbagliato.
  • Re: Comando java per individuare il numero di core della cpu

    Beh settare esclusivamente sulla base dei core è sbagliato, perché bisognerebbe almeno conoscere la natura delle operazioni da eseguire (se esse sono prevalentemente di I/O oppure di computazione).
    In ogni caso possono esserci casi in cui il programmatore deve per forza creare più thread, ad esempio nell'ambito di sviluppo di programmi con GUI. Quindi che possa essere "dannoso" lo concepisco (ad esempio creando 1000 thread si impianta il normale funzionamento dei processi di sistema), ma in teoria dovrebbero essere previsti dal S.O. dei meccanismi di protezione in tal senso. Sul fatto che sia inutile, invece, non sono della tua stessa opinione
  • Re: Comando java per individuare il numero di core della cpu

    Non so cosa sia uno schedular ma vi faccio un esempio molto semplice (il primo che mi viene in mente, perdonate la banalità... ):

    Se io ho un vettore di n elementi e ho un processore con 4 core, se voglio calcolare la sommatoria di tutte le variabili per calcolarne la media usando i thread non faccio prima?

    Ovvero se spezzo il vettore in 5 parti uguali (o quasi uguali), ne calcolo la somma ed infine calcolo il totale come somma dei 5 parziali ed infine divido il totale per n non impiego meno tempo a trovare la media del vettore? è sbagliato avere 5 cicli for invece di 1 solo per calcolare la media? il comando thread non è stato creato per questo motivo?
  • Re: Comando java per individuare il numero di core della cpu

    Non è schedular ma scheduler ...

    Thread non è un comando ...

    A prima vista potrebbe sembrare meglio gestire un lavoro con più thread ma, come avevo scritto prima (completamente inascoltato), se in un determinato momento uno dei tuoi 5 thread viene messo in pausa ("addormentato") perché la risorsa CPU su cui dovrebbe essere eseguito è impegnata con thread a maggiore priorità, ecco che il tuo compito non verrebbe completato prima. E non è detto (non è detto) che un solo thread non avrebbe fatto meglio.

    Lo scheduling dei thread e dei processi su varie CPU è molto complesso e non può essere determinato semplicemente ... lascia fare al sistema operativo.
  • Re: Comando java per individuare il numero di core della cpu

    Perdonami ma se io creo tutti thread a priorità massima saranno sempre i primi ad essere eseguiti, non ti pare? Mentre lancio il programma di elaborazione non mi metterò a fare altro, attendo la soluzione e stop...
  • Re: Comando java per individuare il numero di core della cpu

    peruzzo ha scritto:


    Perdonami ma se io creo tutti thread a priorità massima saranno sempre i primi ad essere eseguiti, non ti pare? Mentre lancio il programma di elaborazione non mi metterò a fare altro, attendo la soluzione e stop...
    Ci sono thread che vengono comunque eseguiti prima e comunque creare thread con massima priorità non solo non è un comportamento adeguato da parte di un programma ma è anche poco conveniente.
Devi accedere o registrarti per scrivere nel forum
14 risposte