Newsgroup: it.lavoro.informatica
Titolo: Pc con piu' processori e calcolo parallelo

Per sfruttare un pc che ha piu' processori fisici , le applicazioni che vengono eseguite devono essere scritte in modo da rendere possibile l'esecuzione di codice in parallelo?  Oppure è il pc che riesce ad eseguire piu' applicazioni contemporaneamente indipendentemente dal tipo di software?  
Grazie

 
 
In realtà non lo so, ma credo che dipenda sia da come sono fatte
le applicazioni (*), sia da cosa intendi per "sfruttare". Di solito un 
PC ha un Sistema Operativo e sembrerebbe logico che anche se una singola 
applicazione non fosse scritta esplicitamente per essere eseguita su più 
processori, quando lanci più applicazioni il sistema operativo dovrebbe 
provvedere a farle girare su processori diversi, per aumentare il grado 
di parallelismo;
poi dipende: molti anni fa, alla fine degli anni '90, mi
e' capitato di lavorare ad un sistema dove c'era una macchina spacciata 
come "workstation grafica" per un simulatore motociclistico. Questa 
aveva 4 processori [una rarità per l'epoca]. Era la macchina su cui 
girava il software che mostrava la grafica del circuito nel quale si 
muoveva la moto. Era spacciata come "macchina con bilanciamento 
automatico del carico". Facendo qualche prova si scopri' che il 
"bilanciamento automatico del carico" consisteva nel fatto che 
inizialmente il sistema operativo lasciava che tutto il carico andasse 
sul primo processore [mentre i processori 2,3,4 non facevano una mazza]. 
Quando questo primo processore non ne poteva piu', allora il S.O si 
decideva a dirottare parte del carico sul secondo processore [e i 
processori 3 e 4 continuavano a non fare una mazza, mentre il processore 
1 lavorava ancora al 100%]. Poi, quando anche il processore 2 non ne 
poteva più allora il S.O. dirottava una parte del carico sul processore 
3, mentre il processore 4 continuava a non fare una mazza e mentre i 
processori 1 e 2 lavoravano al 100%. Solo se tutti i processori 1,2,3 
non ne potevano piu', allora il S.O si decideva a caricare anche il 
processore 4 (cosa che non accadeva quasi mai). Però sfido chiunque ad 
affermare che quella descritta non sia una "politica di bilanciamento 
del carico" e che i 4 processori non fossero "sfruttati".
 
Ciao,
Marco
 
(*) In realta', pur avendo brevemente usato python in tempi abbastanza 
"pionieristici" (1999-2000), non lo conosco molto bene e non so cosa sia 
il python GIL  (Global Interpreter Lock) ma da qualche parte (tipo qui 
http://www.di-srv.unisa.it/professori/debonis/debonis1/progAv2019-20/concorrenza_I.pdf
) 
sembrano affermare che tale GIL impedirebbe a python di essere eseguito 
su piu' di un core alla volta, rendendo quindi inutile avere un 
multiprocessore (anche se mi pare di capire che questo valga solo per 
applicazioni multithreading e non ad esempio per applicazioni 
multiprocessing). Quindi per alcune appplicazioni potrebbe 
effettivamente non esserci modo di trarre benefici da architetture 
multiprocessore, se non sono state scritte tenendo presente che 
potrebbero girare su sistemi multiprocessore, mentre portrebbero trarre
dei benefici se fossero state scritte tenendo presente che potrebbero
girare su sistemi multiprocessore..
 
-- 
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

 
La faccenda mi sa che e' un po' lunga ma do un suggerimento:
Non confondete l'esecuzione di piu' *processi* distinti
con l'esecuzione di processi, o un singolo processo, *multithread*
(o se multithread non lo fosse...)
Salut

 
 
Tecnicamente sono i threads non i processi ad essere eseguiti in 
parallelo ma in generale una applicazione mono thread non viene 
automaticamente spezzata per essere eseguita in multicore
Occorre ristrutturala per essere eseguita multicore
 
 
-- 
|___|

 Per sfruttare un pc che ha piu' processori fisici , le applicazioni che vengono eseguite devono essere scritte in modo da rendere possibile l'esecuzione di codice in parallelo? Oppure è il pc che riesce ad eseguire piu' applicazioni contemporaneamente indipendentemente dal tipo di software? 
 
per come poni la domanda la seconda che hai detto.
all'interno della singola applicazione le istruzioni possono essere eseguite in parallelo se sono scritte in modo da essere eseguite in parallelo. è ovvio una sequenza di istruzioni non può che essere eseguita in sequenza, parallelizza più sequenze di istruzioni se queste vengono assegnate a thread diversi.
per questo non è nemmeno necessario il multiprocessore perché è da quando esistono i 32 bit che esiste il multitasking preemptive  gestito dallo scheduler del sistema operativo.

 è ovvio una sequenza di istruzioni non può che essere eseguita in sequenza
 
Ehm...
Se cosi' fosse non avremmo Spectre, Meltdown e compagnia.
 
Poi se premetti "per semplicita'" :)

 Se cosi' fosse non avremmo Spectre, Meltdown e compagnia. 
 
Infatti, non e` cosi`. L'esecuzione out-of-order (che e` cio` che credo sfrutti Meltdown, per esempio) consente una forma di parallelismo.

Il 24/10/20 03:05, Elephant ha scritto:

Che e' un altra cosa
Un conto e' lo scheduling offerto dal kernel, un altro e' lo 
sfruttamento della pipeline del processore
Se ho due istruzioni in sequenza A e B che il processore li esegua in 
parallelo o no e' rilevante solo per le performance
Ma dal punto visto esterno alla cpu A e B sono logicamente eseguite in 
sequenza
 
 
 
-- 
|___|

 Poi se premetti "per semplicita'" :)
 
premetto per semplicità. stiamo parlando di un livello logico superiore, in una discussione di questo tipo disquisire di out-of-order execution è fuori luogo visto che non è "percepibile" al programmatore. quest'ultimo due istruzioni in sequenza le vedrà comunque eseguite in sequenza, se poi sotto il processore quando può si mette avanti col lavoro sono affari suoi :-)

> Che e' un altra cosa 
 
E' un'altra cosa quel che dici tu, semmai. Il fatto che, perché un programma sia eseguibile parallelamente, debba esplicitamente far uso del multithreading, non implica che le istruzioni di un singolo thread siano sempre eseguite in sequenza da un processore. Un processore può, in teoria, organizzare come meglio crede l'esecuzione di quelle istruzioni, parallelizzando ciò che meglio crede secondo determinati algoritmi.

disquisire di out-of-order execution è fuori luogo visto che non è "percepibile" al programmatore. quest'ultimo due istruzioni in sequenza le vedrà comunque eseguite in sequenza, 
 
Non si sta disquisendo: Si sta precisando. La tua affermazione era precisa: "all'interno della singola applicazione le istruzioni possono essere eseguite in parallelo se sono scritte in modo da essere eseguite in parallelo."
 
In realtà non è così. Possono essere eseguite in parallelo comunque.


ok, quando il pisello è appuntato bene fammi un fischio.
 
 


:-)

 
 
 
Che e' proprio quello che ho affermato

Il 24/10/20 16:38, 4ndre4 ha scritto:

Ma e' irrilevante se non per le performance
Se cosi non fosse buttiamo via i threads e lo scheduling del kernel, 
tanto ci pensa il processore
Ovviamente non e' cosi.
 
-- 
|___|

 parallelo
 
??
Non ho capito. Se hai un'applicazione fatta da due processi,
cosa impedisce ai due processi di essere eseguiti in parallelo
se hai due processori ?
 
Ciao,
Marco.


 se hai due processori ? 
 
ma anche se ne ha uno.
 

 
https://www.avast.com/antivirus
 
 
siccome nel libro di C# c'è un capitolo  sul codice parallelo che usa le librerie TPL ,  
https://docs.microsoft.com/it-it/dotnet/standard/parallel-programming/task-parallel-library-tpl
,  pensavo che solo i programmi scritti usando quel codice e quegli oggetti particolari fosse in grado di sfruttare piu' processori del computer!   grazie

 
 
Ogni processo almeno un thread (il cosiddetto main thread)
Poi tecnicamente una applicazione non ha processi
Un processo (ed il suo main thread) lo crea il kernel basandosi sulla 
struttura dell'exe che e' l' applicazione
 
 
-- 
|___|

 siccome nel libro di C# c'è un capitolo sul codice parallelo che usa le librerie TPL , 
https://docs.microsoft.com/it-it/dotnet/standard/parallel-programming/task-parallel-library-tpl
, pensavo che solo i programmi scritti usando quel codice e quegli oggetti particolari fosse in grado di sfruttare piu' processori del computer! grazie
 
quelle librerie servono per gestire programmaticamente il multitasking. processori e sistemi operativi hanno la capacità di eseguire operazioni in parallelo, ma ovviamente quando scrivi un programma devi avere il controllo della cosa: lo sai te cosa deve essere parallelizzato e cosa no o quali risorse possono essere usate in concorrenza e quali no, il sistema mica lo può sapere.

 
 
??
Ma secondo te un'istruzione fork() cosa fa ?
 
Ciao,
Marco


 
 
 
-- 
|___|

 Ma secondo te un'istruzione fork() cosa fa ? 
 
chiede al sistema (syscall) di creare un processo figlio uguale al processo corrente.


non c'è problema; e' che se scrivo un'applicazione
e nel mio codice ho una
roba del tipo
 
<codice>
pid=fork(...);
<altro codice>
 
dal mio punto di vista, tecnicamente
la mia applicazione "ha due processi"
(che per altro possono tranquillamente essere eseguiti in parallelo,
in particolare se ho due processori [ma entro certi limiti anche se ne 
ho uno solo]).
 
ciao,
Marco.


 
 
La tua applicazione non ha due processi,fa solo una chiamata a fork()
Semmai puoi affermare che la tua applicazione e' composta da 2 exe se il 
primo exe fa una fork() e una exec() sul secondo exe,ma nulla di piu
Una applicazione non e' e non contiene processi ma e' solo un insieme di 
exe,dll,altre risorse come immagini,ecc..
il processo esiste in quanto e' una struttura dati allocata e gestita 
dal kernel.
Non per niente si afferma anche che un processo e l'istanza di una 
applicazione in esecuzione
Se prendo ad esempio un editor (per esempio vi) e lo lancio due volte
 
$vi pippo.txt in term1
$vi pluto.txt in  term2
 
Uso la stessa applicazione ma i processi sono 2
 
 
 
 
 
 

 
 
Te ne svelo una
fork() non e' piu una syscall in linux (credo dal kernel 2.6)
E' una normale funzione che chiama la syscall clone()
 

 Uso la stessa applicazione ma i processi sono 2
 
I processi sono due ammesso che vi al suo interno non crei
(o chieda al SO di creare) altri processi, altrimenti sono di più, ma 
comunque atteniamoci al caso sopra, cioe' di casistiche ne possono 
esistere molte, ma atteniamoci a quel caso di un solo exe che contiene 
una fork() e nessuna exec. Se mando in esecuzione una sola volta 
l'eseguibile avro' comunque ad un certo punto due processi in 
esecuzione, magari con i due processi in esecuzione contemporaneamente, 
ognuno su un processore diverso.
 
Ciao,
Marco.
 
P.S.
 
Avevo detto che non volevo introdurre cose nuove, ma
per quanto riguarda l'affermazione:
 
 > il processo esiste in quanto e' una struttura dati allocata e gestita
 > dal kernel.
 
la commento in P.S. perché richiede appunto l'aggiunta di cose nuove
mentre quello che mi interessava di più è sopra, prima del P.S.
 
Comunque per quanto riguarda tale affermazione,non so se negli ultimi 
anni le cose siano cambiate, ma quando mi sono laureato io, con 
un'affermazione del genere non si sarebbero mai
passati come minimo ne' l'esame di Sistemi Operativi ne' quello di 
Calcolatori Elettronici (ma probabilmente nemmeno molti altri).
 
A giudicare da qui:
lia.deis.unibo.it/Courses/sola0708-info/lucidi/2-ProcessiThread(2x).pdf
 
 
oppure qui
https://www.di.univr.it/documenti/OccorrenzaIns/matdid/matdid719475.pdf
 
 
(i primi due che ho trovato.)
 
si direbbe che con un'afferamzione come la tua, questi esami
non si sarebbero passati almeno fino al 2011(in particolare la tua 
affermazione non tiene conto, o almeno non dice in modo esplicito, che 
il codice che verrà eseguito dal processore e' parte integrante del 
processo [come si evince dalle prime 5-6 pagine di ciascuno dei file 
linkati] e che quel codice sarà eseguito dal processore o dai
processori se ce n'è più di uno. E questa cosa i miei docenti non 
l'avrebbero mai lasciata passare sotto silenzio).
Poi non so se dopo il 2011 sia cambiato qualcosa (dico 2011 perché il 
secondo file sembra essere del 2011, mentre il primo sembra essere
del 2008)
 
Ciao,


 
 
 
-- 
|___|

 
 
Si' ma se non si parla un linguaggio comune non ci si capisce


 
 
 
-- 
|___|

 su un altro exe (exe2)
 
si', ma le mie domande erano state fatte perché mi interessava chiarire 
il caso di prima, cioe' il caso di un solo exe, nessuna dll, nessuna 
exec, una fork() chiamata con successo e quindi un solo processo allo 
startup ma due processi da un certo punto in poi, successivo allo 
startup (non mi interessava il caso in cui la fork() fallisca) .
 
Direi che il caso che mi interessava e' stato chiarito a sufficienza.


 Salut
 
Questa non l'avevo vista.
In particolare in cosa ci saremmo confusi ?
