|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Il primo core svolgera' il for da 0 a N/2, il secondo da N/2 +1 a N Poi in realta' la distribuzione del carico e gli indici effettivamente eseguiti dal singolo core non si sanno, dipende da come e' stata compilata la pragma quello che e' certo e' che il corpo di un singolo indice del primo ciclo verra' svolto tutto da un ben specifico core di quelli a disposizione. Per come si usa la OMP, che e' decisamente estesa, meglio leggere qualcosa. Per poter funzionare bene e' necessario che i singoli task eseguiti siano indipendenti tra loro, come in questo caso (scrivere una particolare cella di una matrice che non verra' mai piu' scritta, ne letta da nessun altro task) Fate pero' attenzione alle dipendenze implicite negli utilizzi di librerie come queste (come la PLINQ, p.es.) Talvolta sembra che si stia agendo su celle di memoria tra loro scorrelate, ma in realta' una correlazione nascosta potrebbe esserci a livello di righe di cache, che forza il processore a rinfrescare le cache di secondo (o terzo) livello privata dei diversi core, annullando di fatto i benefici del parallelismo. Mi e' gia' capitato, e prima di accorgersene...
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#22 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
http://www.codeproject.com/KB/cpp/BeginOpenMP.aspx
|
|
|
|
|
|
|
#23 |
|
Senior Member
Iscritto dal: May 2005
Città: Montecatini terme
Messaggi: 309
|
Ciao, rispondo solo ora e scusate. Il tutto è stato implementato in un pezzo di codice sorgente per l' inversione di matrici tramite metodo gauss-jordan (punto iniziale) e poi con passaggi iterativi per l'affinamento dovuto agli errori di arrotondamento. Grazie ai consigli vostri mi sono documentato un pò sulla faccenda openMP e comunque non mi sembra molto complesso, poiché come vi ripeto, sono bastati un analisi per scovare le indipendenze nei cicli for...ed una giusta sintassi.
Il compilatore usato è microsoft VS2008 (con l'opzione da riga di comando /openmp). comunque sia girando per internet si trovano un sacco di appunti e dispense, anche se ritengo che un libro come primo approccio è sempre la scelta migliore. L'esempio che ho riportato diciamo è la condizione più "banale", poiché lo stesso openmp ci mette anche a disposizione comandi per il controllo di flusso e sincronizzazione dei sincoli threads (per la stesura di un codice a regola d'arte)...comunque sono sempre all' inizio, e la faccenda è molto più complicata di quanto possa sembrare, ma è giuto trovare un compromesso fra quello che si vuole come obbiettivo,senza dover incasinarsi troppo la vita (ufficio complicazioni affari semplici :-)). Un saluto e una buona serata.
__________________
Asus M2N-SLI DELUXE - Athlon 64 X2 4600+ - 2x1GB Corsair XMS2 PC6400 - ATI HD3650 - 2x250GB SATA2 RAID-0 |
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
GRAZIE RAGAZZI
|
|
|
|
|
|
#25 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
scusate ragazzi posso farvi quest'altra domanda ?
la direttiva del preprocessore "#pragma" a cosa serve ? so a cosa servono tutte le altre direttive come : #if #elif #else #define #defined ... ma #pragma cosa fa ? grazie per le vostre risposte. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:51.




















