Newsgroup: it.comp.lang.visual-basic
Titolo: [NET] Dual core...quad core...??? che me ne faccio?

Ammetto la mia abissale ignoranza...
Oramai si trovano a prezzi stracciati dual core...e anche quad
core....
Se uso Net 3.5 posso usufruire di queste 4 cpu?
Leggo leggo leggo....spulcio spulcio spulcio...
E arrivo a questo (forse errato?) punto:
l'applicazione deve essere pensata per andare "parallela"...
Questo vuol dire cosa?
Potrebbe voler dire che il mio utente richiede una stampa
locale....assegno la procedura: connessione
richiesta dati
disconnessione
elaborazione e preparazione dati
stampa
...ad una cpu?
e contemporaneamente avere la cpu su cui gira il programma principale
tranquillo come se avesse già effettuato la stampa?
Se è così come si fà a farlo?
Compilando un programma a parte e Usando System.Threading ?
Ce la faccio da dotNet a dire quale programma voglio che "giri" su
quale cpu?
o la faccio troppo semplice???
Grazie a chi mi risponde!
:o)

 Questo vuol dire cosa?
Di solito la gestione è demandata al sistema operativo, con alcune
eccezioni.
In azienda lavoriamo su dati bancari, gigate di file con le transazioni
giornaliere. Il sistema è progettato per lavorare in multithreading.
La nostra soluzione sfrutta due concetti:
-L'utilizzo di vari thread durante l'elaborazione (si, usiamo la
system.threading) se l'application server è disgiunto dal db server
(quasi sempre è così).
-L'utilizzo di un singolo thread se application server e db server sono
la stessa macchina (ci capita solo su un cliente che non ha grosse
necessità di elaborazione).
Nella prima opzione l'utilizzo delle CPU è gestito da noi, nel senso che
 non ci sono altri software o servizi che possano consumare grossi
quantitativi di cicli macchina, per cui il SO bilancia il carico sui
processi nostri che in quel momento necessitano di potenza di calcolo.
Nella seconda opzione è sempre il SO ad assegnare una CPU al primo
thread ed una CPU a SQL Server
Quindi, alla fine, decide lui come bilanciare le cose, non abbiamo il
controllo pieno della CPU. Non saprei dirti se ci siano delle classi di
.NET adibite all'assegnazione di una CPU ad un particolare processo.
L'unica cosa che mi viene in mente è la gestione delle priorità del
processo, ma non un'assegnazione esplicita della CPU.
Nicola

 Se è così come si fà a farlo?
Non so a basso livello di preciso come funziona, AFAIK si tratta di
distribuire il carico.
Se devi fare due elaborazioni da 5min su due tabelle, se dividi i thread
probabilmente avrai le due elaborazioni in 5 minuti totali, invece di
10minuti (con le dovute tolleranze).
Per i videogiochi ad esempio un core potrebbe lavorare solo sull'AI,
l'altro segue invece la GPU.
Una codifica video, ogni core potrebbe codificare un fotogramma, uno i pari
ed uno i dispari.
Non credo proprio che ci sia un discorso di interscambio di informazioni
fra processi, come fosse un calcolo distribuito stile Seti@Home e simile.

 ed uno i dispari.
si vabbe ma come??? che bisogna usare Assembler C C++ dotNet ...o che
altro?
Un tipico esempio:
il gestionale ad un certo punto deve stampare dei report.....mettiamo
che ne
debba stampare TANTI (una stampa ad esempio delle etichette delle
spedizioni del mese)....
il programma 1 comunica al programma 2 COSA stampare......e viene
gestita tutta la problematica da un altro programma( stampa finita,
record mancanti, etc etc)
....sarebbe stato interessante...avendo un dual core....che i 2
programmi stassero su cpu diverse ognuno lavorante per i cacchi suoi!
Altrimenti a che "server" un dual core ? (oltrechè ad arricchire intel
e amd)
Il fatto che lo determini il SO non mi fa stare tranquillo...ora che
ci sono anche i "quad" core almeno decidere "che cosa fa un core"...mi
sarebbe piaciuto!
"Te ne lascio 3 ma almeno uno fammelo gestire!"

 "Te ne lascio 3 ma almeno uno fammelo gestire!"
Per adesso sono un quartetto, ma pensa quando saranno una orchestra intera 
da 50-100-200 elementi.
Certo avresti ancora di piu ragione: lasciatemi un core per fargli suonare 
quello che piace a me!
-- 
Greg 

 :o)
Non so se puņ aiutare:
'Process.ProcessorAffinity'
<URL:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassProcessorAffinit
 
yTopic.asp>
'ProcessThread.ProcessorAffinity'
<URL:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessThreadClassProcessorA
 
ffinityTopic.asp>
'ProcessThread.IdealProcessor'
<URL:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessThreadClassIdealProce
 
ssorTopic.asp>
Non credo comunque che ci sia un modo per "riservare" in modo esclusivo 
un core per scopi tuoi. Francamente non lo vedo come un problema, 
probabilmente Windows se la cava meglio di noi su questi aspetti.
E, sģ, č il caso di usare System.Threading.
Esistono decine e decine di libri dedicati al multithreading, stiamo 
parlando di un campo parecchio vasto.
-- 
S.

 "Te ne lascio 3 ma almeno uno fammelo gestire!"
Mah, non saprei.
Sarebbe come dire che siccome il tuo disco ha molti giga, "almeno per un
giga lasciami gestire i settori del disco".
Il SO è ottimizzato per bilanciare il carico sui core a disposizione in
base ad alcune variabili.
D'altronde non potrebbe essere altrimenti.
Tornando all'esempio che facevi prima: un processore lo assegni al
generatore del report ed uno al software di stampa... e gli altri
processi (indicizzazione, antivirus, scheda di rete, cazzilli vari...)
che fine fanno?
Fai una prova. Lancia due eseguibili che eseguono molti cicli.
Vedrai che il primo occuperà circa il 50% della cpu disponibile. Il
secondo idem.
Ora prendi il primo processo e rendilo con priorità alta, mentre il
secondo con priorità bassa...
Il primo processo prenderà il 60/70% di cpu, il secondo sarà sul 30/40%.
Quindi giocando sul numero di processi contemporanei e sulla priorità di
questi puoi in pratica gestire l'utilizzo dei processori a disposizione.
Ma tu non gestisci a basso livello... tu dici al SO come deve gestire i
processi e per il resto se la vede lui.
Nicola

 "Te ne lascio 3 ma almeno uno fammelo gestire!"
Uno lo gestisci :), fai l'applicazione single core e sfrutta tutto quello
:P