Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
proprio perche fa dei salti che gli fanno risparmiare un sacco di colonen , si puo fare solo con il ritardo o con il ritardo max , per le frequenze non funge ..avevo impostato parametri diversi.
sbaglio mio
.stesso tempo, solo che il singolo è velocissimo
Caro Luigi, i libri sono importanti per renderti edotto del tipo di battaglia che potrai combattere ma per aver ragione del problema che in un determinato momento hai per le mani, devi dar fondo alle tue motivazioni e a tutta la tua intuizione per avere successo. E tu questo lo hai imparato sul campo. La certificazione col piú alto valore, é quella conseguita nella vita reale, con problemi e ostacoli veri non quelli costruiti a far da esempi per scrivere i libri. E mi tocca di affermare, senza temi di smentita, che di queste certificazioni, puro frutto di spremute meningee, ne potresti sfoggiare tante, qualora ricorresse il caso. Lode a te, Luigi.Grazie Rookie , libro sicuramente interessante .. ora deve partire la caccia alla copia pirata che sti mattoni possono costare pure 120 euro a libro ..eheh vabe non si dovrebeb dire ma sapete come sono io non ho peli sulla lingua ..
Qualche test con la libreria tpl (parallel.for )è gia stato fatto ma non ha avuto lo stesso esito positivo che abbiamo avuto con i thread dove siamo stati piu fortunati.
Comunque la cosa piu imprtante che è emersa con questi nostri timidi approcci è che un algoritmo efficiente (quando possibile) è la cosa migliore,massima efficienza con il minimo delle risorse , esistono libroni enormi sugli algoritmi , io non ho fatto l'università quindi non ho mai dato esami sull'argomento e potrebbero mancarmi (anzi mi mancano) quelle basi che ti danno la possibilità di pensare all'algoritmo migliore o di pensarne uno all'occorrenza anche se qualche risultato lo otteniamo lo stesso facendo lavorare le meningi.
Sub TestParallelFor()
Dim k1 As Integer, k2 As Integer, k3 As Integer, k4 As Integer, k5 As Integer
Dim nSvilTmp As Integer
Dim strctParam As New STRUCT_PARAM_THREAD
Dim nLunghetteTot As Integer
Dim watch As New Stopwatch
watch.Start()
nLunghetteTot = 5000 ' HScrollBar2.Value
ReDim aLunghette(nLunghetteTot)
LunghettaPiuRitardata.Ritardo = 0
strctParam.SetRuote(TextBox1.Text)
strctParam.nSorte = 2
strctParam.nClasse = 5
Dim aN(5) As Integer
For k1 = 1 To 86
Label1.Text = k1
Application.DoEvents()
aN(1) = k1
For k2 = k1 + 1 To 87
aN(2) = k2
For k3 = k2 + 1 To 88
aN(3) = k3
For k4 = k3 + 1 To 89
aN(4) = k4
For k5 = k4 + 1 To 90
aN(5) = k5
nSvilTmp += 1
aLunghette(nSvilTmp).Numeri.SetNumeri(aN)
If nSvilTmp = nLunghetteTot Then
Parallel.[For](1, nSvilTmp, Sub(index)
aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote)
End Sub)
For k As Integer = 1 To nSvilTmp
If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then
LunghettaPiuRitardata = aLunghette(k)
End If
Next
nSvilTmp = 0
End If
Next
Next
Next
Next
Next
If nSvilTmp > 0 Then
Parallel.[For](1, nSvilTmp, Sub(index)
aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote)
End Sub)
For k As Integer = 1 To nSvilTmp
If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then
LunghettaPiuRitardata = aLunghette(k)
End If
Next
End If
watch.Stop()
MsgBox("Lunghetta <" & LunghettaPiuRitardata.Numeri.StringaNumeri & ">" & vbCrLf & " al ritardo : " & LunghettaPiuRitardata.Ritardo.ToString & vbCrLf & " Tempo millisecondi : " & watch.ElapsedMilliseconds.ToString)
End Sub
Luigi, oltre che intriso di talento sei pure un fulmine di guerra! Complimenti meritati!con il parallel for si ottengono i risultati migliori , ed è pure tutto piu facile ..
Vedi l'allegato 2272806
prendiamo in considerazione il nostro problema , lo scopo è trovare la cinquina piu ritardata per ambo nel minor tempo possibile, per farlo vogliamo sfruttare a pieno le capacità della macchina.
La parte pesante della ricerca è quella di confrontare ogni cinquina che noi sviluppiamo tramite i cicli for nidificati , con le estrazioni dell'archivio.
la parte di sviluppo delle cinquine non è particolarmente critica . Rimuovendo la parte della statistica , lasciando solo i cicli for nidificati e l'assegnazione della lunghetta nell'array sul mio pc ci vogliono 6 secondi (testato in debug mode quindi pure leggermente piu lento)
Vedi l'allegato 2272807
quind ia questi 6 secondi necessari per sviluppare tutte le cinquine si aggiunge il tempo necessario per calcolare il ritardo di ogni cinquina.
Con l'approccio multithread abbiamo impostato la cosa creando un array , ogni elemento dell'array rappresentava una delle cinquine sviluppate.
Una volta riempito l'array fino al limite previsto partivano i differenti thread ciascuno dei quali analizzava la sua parte di colonne sviluppate (quindi una porzione di array) e al termine verificava se la cinquina col ritardo piu alto che aveva trovato lui (il thread) era migliore di quella finale se si aggiornava il valore di quest'ultima , facendo pero attenzone a sincronizzare l'assegnazione di questa variable che essendo globale è condivisa da tutti ithread.
Il processo continuava finche non finivano le colonen da sviluppare e al termine ovviamente si aveva la cinquina col ritardo piu alto come da obiettivo.
Ora con l'approccio parallelo invece di gestire noi i thread e il blocco di colonne sul quale lo stesso deve operare ,possiamo eseguire l'operazione di calcolo del ritardo tramite un ciclo for parallelo in quanto per ogni iterazione del ciclo ogni calcolo su quella cinquina è indipendente cioè non è influenzato alle altre operazioni che si svolgono in altri indici del ciclo.
Rientriamo in questo caso qui , proprio il primo specificato nel libro suggerito da Rookie
Vedi l'allegato 2272808
Con il parallel for distribuiamo praticamente senza fareniente di speciale il carico di lavoro pesante (cioè il calcolo del ritardo della singola cinquina) sui core presenti sulla macchina.
Durante il calcolo però vogliamo evitare di andare a toccare la variabile globale ( cioè quella che alla fine conterrà la lunghetta che cerchiamo) perche dobbiamo evitare operazioni che potrebbero andare in conflitto a causa proprio del parallelismo.
Come risolviamo ? Al termine del ciclo for parallelo quando a tutte le colonne del nostro array è stato attribuito il ritardo introduciamo un
ciclo sequenziale (quindi normalissimo ciclo for) che fa il confronto e l'aggiornamento del valore globale .
per fare la prova Legend inserisci questa routine.
Codice:Sub TestParallelFor() Dim k1 As Integer, k2 As Integer, k3 As Integer, k4 As Integer, k5 As Integer Dim nSvilTmp As Integer Dim strctParam As New STRUCT_PARAM_THREAD Dim nLunghetteTot As Integer Dim watch As New Stopwatch watch.Start() nLunghetteTot = 5000 ' HScrollBar2.Value ReDim aLunghette(nLunghetteTot) LunghettaPiuRitardata.Ritardo = 0 strctParam.SetRuote(TextBox1.Text) strctParam.nSorte = 2 strctParam.nClasse = 5 Dim aN(5) As Integer For k1 = 1 To 86 Label1.Text = k1 Application.DoEvents() aN(1) = k1 For k2 = k1 + 1 To 87 aN(2) = k2 For k3 = k2 + 1 To 88 aN(3) = k3 For k4 = k3 + 1 To 89 aN(4) = k4 For k5 = k4 + 1 To 90 aN(5) = k5 nSvilTmp += 1 aLunghette(nSvilTmp).Numeri.SetNumeri(aN) If nSvilTmp = nLunghetteTot Then Parallel.[For](1, nSvilTmp, Sub(index) aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote) End Sub) For k As Integer = 1 To nSvilTmp If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then LunghettaPiuRitardata = aLunghette(k) End If Next nSvilTmp = 0 End If Next Next Next Next Next If nSvilTmp > 0 Then Parallel.[For](1, nSvilTmp, Sub(index) aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote) End Sub) For k As Integer = 1 To nSvilTmp If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then LunghettaPiuRitardata = aLunghette(k) End If Next End If watch.Stop() MsgBox("Lunghetta <" & LunghettaPiuRitardata.Numeri.StringaNumeri & ">" & vbCrLf & " al ritardo : " & LunghettaPiuRitardata.Ritardo.ToString & vbCrLf & " Tempo millisecondi : " & watch.ElapsedMilliseconds.ToString) End Sub
Lieto di essere stato utile…lanciata
5 secondi
ovviamente
l altro algoritmo quello dedicato è più veloce
ma è un ottimo risultato pensando ai 17 secondi
Fantastico
mi meraviglio che qualcuno non ti abbia regalato non dico una torta , ma almeno un pasticciotto
Grazie luigi
grazie anche a te Rookie per il suggerimento del libro
post scriptum... ma vale anche per @i legend che ha voglia di sporcarsi le mani e... non pensare al suo fardello (il dolore fisico che lo accompagna) vi e' anche la versione del libro per il c++ ovvero l'evasione dalla prigione del framework .Net (leggi managed code; cioe' poter parlare al ferro a quattr'occhi) che fa uso di una libreria diversa (ovviamente) ma sintassi equivalente. A quanto pare cambierebbe solo il file header da includere e il modo di codificare qualche istruzione operativa! Quindi, mi aspetto che i vostri prossimi attrezzi di gioco facciano un salto di livello WARP.... nel tempo e/o nello spazio!Luigi, oltre che intriso di talento sei pure un fulmine di guerra! Complimenti meritati!
Il futuro é una delle poche cose su cui riflettere prima di ipotecarlo, le altre sono la salute, le mogli e la propria casa comunque il suggerimento ipotetico era per chi (@i legend ) si diletta per hobby non per chi vive del proprio lavoro!la curva di apprendimento del c++ è molto elevata , io non ho mai visto niente di c++ al massimo qualche video suu youtube dei primi rudimenti , quindi non posso essere produttivo su quel linguaggio , di impararlo non se ne parla .. su questo vi dovrò deludere..