THE PARALLEL Numero 10 2012 Edizione in italiano UNIVERSE DEVELOPER ROCK STARs: Shannon Cepeda Performance a prova di futuro per le tue applicazioni con la in sei passi di Shannon Cepeda e Wendy Doerner Wendy Doerner Intel® Cilk™ Plus Potenzia le performance Intel® Cilk™ Plus adesso è disponibile in open source e per GCC 4.7. Tre parole chiave di Intel Cilk Plus offrono un semplice, ma sorprendentemente efficace, modello per la programmazione parallela. ›› Librerie a runtime e di modelli offrono un ambiente armonizzato per realizzare applicazioni parallele ›› Ideale per sviluppatori C++ e Fortran in Linux*, Windows*, open source o GCC 4.7 Cerca Intel® Cilk™ Plus in Intel® Parallel Studio XE ©2012, Intel Corporation. Tutti i diritti riservati. Intel e il logo Intel sono marchi registrati di Intel Corporation negli U.S.A. e in altri Paesi. *Altri nomi e marchi potrebbero essere rivendicati come proprietà di terzi. THE PARALLEL UNIVERSE INDICE Lettera dall'Editor Opportunità di performance: come sfruttarle — dai cluster ai dispositivi, di James Reinders 4 Performance a prova di futuro per le tue applicazioni con la vettorizzazione in sei passi, di Wendy Doerner e Shannon Cepeda 6 La vettorizzazione è una forma chiave del supporto hardware al parallelismo dei dati, perché consente di elaborare i dati in parallelo con una CPU single core. Può fornire un significativo miglioramento delle performance e può essere combinata anche con il parallelismo dei thread e/o dei cluster. Calcolo parallelo tascabile; personalizzarlo con Intel® IPP di Robert Mueller, Noah Clemons e Paul Fischer 12 L’uso di funzioni di librerie di performance in applicazioni che vengono eseguite su componenti small form factor può essere un ottimo sistema per ottimizzare e unificare il flusso di esecuzione dei calcoli in task ad alta intensità di dati. Questo articolo esamina le potenzialità di Intel® Integrated Performance Primitives per il processore Intel® Atom™. Strumenti che potenziano affidabilità e performance delle applicazioni .NET di levent akyil e Asaf Yaffe 20 Le capacità degli ultimi strumenti software che servono agli sviluppatori di codice .NET, codice nativo e applicazioni “miste” (.NET e native) durante il ciclo di sviluppo. Iscriviti per i prossimi numeri in inglese Condividi la rivista con un amico © 2012, Intel Corporation. Tutti i diritti riservati. Intel, il logo Intel, Atom, Cilk, Intel Core, VTune e Xeon sono marchi registrati di Intel Corporation negli U.S.A. e in altri Paesi. *Altri nomi e marchi potrebbero essere rivendicati come proprietà di terzi. The Parallel Universe è una rivista trimestrale gratuita. Fai clic qui per iscriverti per i prossimi numeri e condividere la rivista con gli amici. THE PARALLEL UNIVERSE opportunità di perforMance: Come sfruttarle – dai cluster ai dispositivi 4 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Letter From the Editor James Reinders è chief software evangelist alla Intel Corporation. Tra i suoi articoli e libri sul parallelismo citiamo Intel Threading Building Blocks: Outfitting C++ for Multicore Processor Parallelism, che è stato tradotto in giapponese, cinese e coreano. Reinders viene spesso intervistato sul tema del parallelismo. Questo è un numero da "sviluppatore a sviluppatore" in quanto i nostri ingegneri del software esaminano da vicino le tecniche che permettono di migliorare le performance delle applicazioni. Queste non devono essere complesse per ottenere buoni risultati – molti dei processi base del parallelismo possono essere svolti in modo efficiente con l’aiuto degli strumenti Intel®. Performance a prova di futuro per le tue applicazioni con la vettorizzazione in sei passi descrive una forma di parallelismo, detta vettorizzazione, che svolge alcune operazioni contemporaneamente su più blocchi di dati. I metodi di scale-forward consentono di vettorizzare il codice senza bisogno di modifiche per le future architetture di processori e CPU. Calcolo parallelo tascabile; personalizzalo con Intel® Integrated Performance Primitives per il processore Intel® Atom™ applica il parallelismo ai componenti small form-factor con alcune varianti molto interessanti per gli sviluppatori di applicazioni per la telefonia mobile. Strumenti che potenziano affidabilità e performance delle applicazioni .NET descrive il valore di due strumenti di Intel Parallel Studio XE – lo strumento di controllo degli errori Intel® Inspector XE e lo strumento di analisi delle performance Intel® VTune™ Amplifier XE – che servono agli sviluppatori di codice .NET, codice nativo e applicazioni “miste” (.NET e native) durante il ciclo di sviluppo. Spero che apprezzerete questo numero, utilizzerete il codice, valuterete i miglioramenti del processo di sviluppo del vostro software, amplierete il vostro toolkit di performance e, soprattutto, otterrete un potenziamento delle prestazioni delle vostre applicazioni. James Reinders Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Performance a prova di futuro per le tue applicazioni con la in sei passi 6 di Wendy Doerner e Shannon Cepeda, Software Technical Consulting Engineers, Intel Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE DEVELOPER ROCK STARs: Shannon Cepeda Wendy Doerner Impara prima a ottenere significativi miglioramenti delle prestazioni dall'elaborazione parallela dei dati all'interno di una CPU single core. Poi, ­aggiungi il parallelismo dei thread e/o dei cluster per ulteriori miglioramenti. Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE The Parallel Universe ha pubblicato molti articoli sul parallelismo che spiegavano come sfruttare i processori a più core tramite la programmazione dei thread e dei cluster. Questo articolo descrive una forma ugualmente importante di parallelismo nota come parallelismo vettoriale. La vettorizzazione è il parallelismo all’interno di una CPU single core ed è una forma chiave di supporto hardware per il parallelismo dei dati. Con la vettorizzazione alcune operazioni possono essere eseguite su più blocchi di dati contemporaneamente. Ciò è possibile grazie a speciali istruzioni, dette SIMD (Single Instruction, Multiple Data). Le istruzioni SIMD e l’hardware associato sono presenti nei processori Intel® da oltre un decennio. Alcuni esempi di istruzioni SIMD sono Intel® Streaming SIMD Extensions (Intel® SSE), introdotte nel 1999 e successivamente ampliate, e Intel® Advanced Vector Extensions (Intel® AVX), introdotte l’anno scorso. Come funziona la vettorizzazione? Nel tipico caso scalare (non vettorizzato), ogni variabile utilizzata viene memorizzata nel suo registro della CPU. Se viene eseguita un’operazione con due variabili, come l’addizione, le quantità dei due Modalità scalare registri vengono sommate e il risultato viene memorizzato in un registro. La versione vettorizzata di questo esempio riempie prima un registro con le variabili da sommare; questa operazione è detta impacchettamento (packing) del registro. Per esempio, nei processori che supportano Intel AVX, in un registro possono essere impacchettati fino a otto elementi di dati floating point in singola precisione. Poi, utilizzando un’istruzione SIMD, questi elementi possono essere combinati con un altro registro pieno di elementi, generando più risultati contemporaneamente. La possibilità di eseguire queste operazioni in parallelo, anziché separatamente, può tradursi in un significativo miglioramento delle performance del codice. Come mostra la Figura 1, la vettorizzazione è applicata tipicamente agli elementi di un array o vettore che vengono elaborati all’interno di cicli. Oltre all’addizione, ci sono altre istruzioni SIMD per molte funzioni matematiche, operazioni logiche e anche operazioni su stringhe. I set delle istruzioni SIMD sono progettati per applicazioni che elaborano grandi quantità di dati. Le applicazioni scientifiche, ingegne­ ristiche, finanziarie, grafiche e multimediali sono ottime candidate alla vettorizzazione. Elaborazione delle istruzioni SIMD a[i] a + + b[i] b a[i]+b [ i ] a+b a [ i+7 ] a [ i+6 ] a [ i+5 ] a [ i+4 ] a [ i+3 ] a [ i+2 ] a [ i+1 ] a[i] b [ i+7 ] b [ i+6 ] b [ i+5 ] b [ i+4 ] b [ i+3 ] b [ i+2 ] b [ i+1 ] b[i] c[i+7] c[i+4] c[i] c[i+6] c[i+5] c[i+3] c[i+2] c[i+1] Figura 1: Un'addizione SIMD applicata agli elementi di un array “La vettorizzazione consente di elaborare i dati in parallelo all’interno di una CPU single core. Da sola, può apportare un significativo miglioramento delle performance e può essere combinata con il parallelismo dei thread e/o dei cluster ... Utilizzando uno dei nostri metodi per vettorizzare il vostro codice, otterrete due vantaggi: aumento immediato delle performance e scalabilità futura del codice.” 8 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Come vettorizzare il codice? Gli sviluppatori possono utilizzare le istruzioni SIMD nelle loro applicazioni in vari modi. Tradizionalmente, la vettorizzazione è stata realizzata manipolando direttamente le istruzioni SIMD e i registri, tramite il linguaggio assembly o istruzioni intrinseche fornite dal compilatore. Questo metodo richiede che gli sviluppatori diventino esperti dell’architettura SIMD e adattino manualmente il codice alle varie CPU. Oltre a richiedere un significativo sforzo per sviluppare e mantenere il codice, la vettorizzazione tramite il linguaggio assembly o le istruzioni intrinseche del compilatore ha anche lo svantaggio di generare un codice che non è portabile fra i vari compilatori. Poiché il codice deve essere scritto per un determinato hardware SIMD, la vettorizzazione ottenuta con questo metodo non è scalabile, nel senso che dovrà essere reimplementata per le nuove CPU. Fortunatamente, oggi gli sviluppatori possono scegliere fra vari metodi di vettorizzazione che richiedono meno sforzo e generano un codice scalabile. Le tecniche successive si basano su un compilatore di vettorizzazione; consigliamo di utilizzare il nostro Intel® Compiler, disponibile per C++ o Fortran. Il compilatore Intel include un vettorizzatore avanzato e molte altre opzioni, report ed estensioni a supporto della vettorizzazione. Il nostro processo di “vettorizzazione in sei passi” utilizza molte di queste funzionalità. Metodi per la scalabilità futura Quando vettorizzate il vostro codice con uno dei seguenti metodi, esso sarà vettorizzabile senza modifiche anche per le architetture future e per le nuove CPU. Quando compilerete il codice su queste architetture future, il compilatore Intel (o un compilatore che supporta completamente il metodo) farà la scelta appropriata della modalità di vettorizzazione. >> Utilizzare l’auto-vettorizzatore del compilatore Intel: se abilitato, l’autovettorizzatore cercherà le opportunità di vettorizzazione dei cicli senza bisogno di modificare il vostro codice sorgente. Questo metodo può essere sufficiente per ottenere la vettorizzazione del codice. Tuttavia, il compilatore non vettorizzerà i cicli se non può provare che le operazioni in parallelo potranno essere eseguite in modo sicuro. Per questo motivo, potreste vedere ulteriori vettorizzazioni se, dopo questo metodo, ­applicherete una delle seguenti tecniche. >> Utilizzare un costrutto di alto livello fornito da Intel® Cilk™ Plus: Cilk Plus è un insieme di estensioni dei linguaggi C e C++ (e, in un caso, del Fortran) che supporta il parallelismo e la vettorizzazione. Attualmente Cilk Plus è completamente supportato dal compilatore Intel ed è parzialmente implementato in GCC. È uno standard aperto (per maggiori dettagli, vedi cilk.com). Cilk Plus fornisce una varietà di costrutti che possono essere applicati al vostro codice per dare al compilatore le informazioni necessarie alla vettorizzazione. Molti di questi costrutti sono semplici da aggiungere al codice – in quanto richiedono una semplice modifica della notazione o l’aggiunta di un’istruzione pragma. >> Utilizzare un costrutto di alto livello Fortran: il linguaggio Fortran include varie funzioni di vettorizzazione, come le notazioni degli array e il ciclo DO CONCURRENT. Dispone anche della direttiva di vettorizzazione obbligatoria di Cilk Plus (!DIR$ SIMD). Come Cilk Plus, questi costrutti sono utilizzati per fornire informazioni al compilatore in modo che esso sappia quando può vettorizzare. BLOG highlights Equivalenza seriale dei programmi Cilk Plus Robert Geva, Intel Nella comunità C++ c'è la tendenza a potenziare le capacità ­aumentando le librerie ed evitando di utilizzare le parole chiave del linguaggio. Intel® Threading Building Blocks e Microsoft Parallel Patterns Library* sono in linea con questa tendenza. La domanda che nasce è quindi: perché implementare Intel® Cilk™ Plus con le estensioni del linguaggio anziché con le librerie? Una delle risposte è che il linguaggio è implementato dai compilatori, e i compilatori possono fornire determinate garanzie. Una di queste garanzie è l’equivalenza seriale. Ogni programma Cilk Plus che usa le tre parole chiave del parallelismo ha un’elisione seriale ben definita. L’elisione seriale è definita sostituendo tutti i cilk_spawn e each cilk_sync con spazi vuoti, e tutti i cilk_for con la parola chiave for. Ovviamente, l’elisione seriale di un programma Cilk Plus è un programma C/C++ valido. Un programma ha un conflitto di determinatezza se due parti logicamente parallele accedono alla stessa locazione di memoria e almeno una di esse modifica la locazione. Se un programma parallelo Cilk Plus non ha conflitti di determinatezza, allora produrrà gli stessi risultati della sua elisione seriale. Qual è il contributo del compilatore alla garanzia dell’equivalenza seriale? Considerate la seguente illustrazione del codice ... Leggi la parte restante del blog di robert: Visita Go-Parallel.com Sul sito troverai altri blog che trattano vari argomenti correlati: trasformare la potenza multicore in performance delle applicazioni. Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Il processo di vettorizzazione in sei passi della vostra applicazione I precedenti metodi e il compilatore Intel fanno parte di un processo in sei passi che abbiamo progettato per vettorizzazione un’applicazione. Potete provare questo metodo su una vostra applicazione completa o su una parte di essa. Per aiutarvi a seguire il processo abbiamo documentato i passi online nel nostro Vectorization Toolkit. Il toolkit include anche alcuni link a risorse aggiuntive per ciascun passo. Controllate il toolkit online al seguente indirizzo: http://software.intel.com/en-us/ articles/vectorization-toolkit/. Passo 1. Definite il riferimento delle performance nella release build Dovete avere un riferimento per le performance in modo che possiate conoscere se le modifiche introdotte con la vettorizzazione sono efficaci. Dovete avere anche un riferimento per impostare gli obiettivi delle performance, in modo che possiate sapere quando li avrete raggiunti. Dovrà essere usata una release build al posto di una debug build. Una release build conterrà tutte le ottimizzazioni nella vostra applicazione finale e potrà modificare i punti critici (hotspot) o anche il codice eseguito. Per esempio, una release build può ottimizzare un ciclo in un punto critico che altrimenti sarebbe un candidato per la vettorizzazione. Una release build è l’impostazione di default nel compilatore Intel. Dovrete disattivare le ottimizzazioni eseguendo DEBUG build su Windows* (o utilizzando lo switch –Zi) o utilizzando lo switch –Od su Linux* o Mac OS* X. Se utilizzate il compilatore Intel, verificate che state utilizzando i livelli di ottimizzazione 2 o 3 (–O2 o –O3) per abilitare l’auto-vettorizzatore. Passo 2. Determinate i punti critici utilizzando Intel® VTune™ Amplifier XE Potete utilizzare Intel® VTune™ Amplifier XE, il nostro profilatore di performance, per trovare le funzioni che consumano più tempo nella vostra applicazione. Vi consigliamo di utilizzare il tipo di analisi “Hotspots”, anche se potrebbe essere utilizzata l’analisi “Lightweight Hotspots” (profila l’intero sistema, anziché la sola applicazione). Identificando le aree del vostro codice che richiedono la maggior parte del tempo, potrete focalizzare i vostri sforzi di ottimizzazione nelle aree dove i miglioramenti delle performance avranno maggiore effetto. In generale, conviene concentrarsi soltanto sui punti critici più importanti o sulle funzioni che richiedono almeno il 10% del tempo totale della vostra applicazione. Prendete nota dei punti critici che intendete esaminare per il passo successivo. Passo 3. Determinate i cicli candidati utilizzando vec-report del compilatore Intel Il report della vettorizzazione (o vec-report) del compilatore Intel può dirvi se i cicli del vostro codice sono stati vettorizzati oppure no. Verificate che state utilizzando i livelli di ottimizzazione 2 o 3 (–O2 o –O3) del compilatore per abilitare l’auto-vettorizzatore. Eseguite vec-report ed esaminate l’output per i punti critici identificati nel Figura 2: La videata dei punti critici di Intel® VTune™ Amplifier XE .\main.cpp(30): warning : loop was vectorized. .\scalar_dep.cpp(80): warning : loop was vectorized. .\main.cpp(47): warning : loop was not vectorized: not inner loop. .): warning : loop was not vectorized: nonstandard loop is not a vectorization candidate. .): warning : loop was not vectorized: nonstandard loop is not a vectorization candidate. .): warning : loop was not vectorized: existence of vector dependence. .): warning : loop was not vectorized: not inner loop. .): warning : loop was not vectorized: existence of vector dependence. .): warning : loop was not vectorized: not inner loop. .): warning : loop was not vectorized: existence of vector dependence. .): warning : loop was not vectorized: not inner loop. Figura 3: Output di vec-report del compilatore Intel® 10 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Passo 2. Se ci sono cicli nei punti critici che non sono stati vettorizzati, controllate se essi includono calcoli matematici, elaborazioni di dati o operazioni su stringhe in parallelo (per esempio, in un array). In caso affermativo, questi cicli possono trarre vantaggio dalla vettorizzazione. Prendete nota di questi cicli per il Passo 4. Per eseguire vec-report, utilizzate l’opzione “-vec-report2” o “/Qvec-report2”. Notate che il compilatore Intel può essere eseguito su una sola porzione del codice ed è compatibile con i compilatori nativi (gcc su Linux e Mac OS X e Microsoft Visual Studio* su Windows). risultati cambiano. Se i risultati cambiano, il ciclo ha delle dipendenze e la vettorizzazione non è “sicura”. In questo caso, la vettorizzazione è ancora possibile se si eliminano le dipendenze. Modificate il vostro codice sorgente per fornire informazioni aggiuntive al compilatore oppure ottimizzate il vostro ciclo per ottenere una vettorizzazione migliore. A questo punto potete introdurre alcuni costrutti di alto livello forniti da Cilk Plus o dal Fortran. Nella pagina online Vectorization Toolkit potete trovare i link a documenti che spiegano dettaglitamente i costrutti disponibili. Passo 4. Seguite i consigli del report GAP del compilatore Intel e fate riferimento alle risorse del toolkit Passo 6: Ripetete! Eseguite il report GAP (Guided Auto-Parallelization) del compilatore Intel per vedere i suggerimenti del compilatore su come vettorizzare i cicli individuati nel Passo 3. Valutate i consigli e, se necessario, fate riferimento alle risorse aggiuntive del toolkit. Eseguite il report GAP utilizzando le opzioni “guide“ o “/Qguide“ per il compilatore Intel. Nota: potete eseguire il compilatore Intel su specifiche parti della vostra applicazione, se necessario. Rivedete il processo finché non avrete raggiunto le performance desiderate o finché non ci saranno più buoni candidati nei punti critici. for (i=0; i<n; i++) { b = A[i]; if (A[i] > 0) {A[i] = 1 / A[i];} if (A[i] > 1) {A[i] += b;} } Figura 6: Il ciclo della Figura 4, modificato per la vettorizzazione for (i=0; i<n; i++) { if (A[i] > 0) { b=A[i]; A[i] = 1 / A[i]; } if (A[i] > 1) { A[i] += b;} } Figura 4: Esempio di ciclo non vettorizzato scalar_dep.cpp(80): warning #30515: (VECT) Assign a value to the variable(s) “b” at the beginning of the body of the loop in line 80. This will allow the loop to be vectorized. [VERIFY] Make sure that, in the original program, the variable(s) “b” read in any iteration of the loop has been defined earlier in the same iteration. Figura 5: Consiglio del report GAP per il ciclo della Figura 4 Conclusione La vettorizzazione consente di elaborare i dati in parallelo all’interno di una CPU single core. Da sola, può apportare un significativo miglioramento delle performance e può essere combinata con il parallelismo dei thread e/o dei cluster. La vettorizzazione è importante per le performance delle attuali CPU Intel, come quelle delle famiglie dei processori Intel® Xeon® e Intel® Core™. In futuro sarà un componente ancora più critico per le performance di questi processori, come pure per utilizzare l’architettura Intel® Many Integrated Core. Utilizzando uno dei nostri metodi per vettorizzare il vostro codice, otterrete due vantaggi: aumento immediato delle performance e scalabilità futura del codice. Visitate il nostro Vectorization Toolkit per avere le informazioni più aggiornate sui processi e sulle risorse che semplificano il processo di vettorizzazione. Consultate il webinar: Future-Proof Your Application's Performance › o Passo 5. Implementate i consigli del report GAP e altri suggerimenti (per esempio, usare le funzioni elementari e/o le notazioni degli array) Adesso che conoscete i consigli del report GAP per il vostro ciclo, potete implementarli se possibile. Il report potrebbe suggerire qualche modifica del codice. Accertatevi che ogni modifica sia “sicura”, ovvero verificate che la modifica non influisca sulla semantica o sulla sicurezza del vostro ciclo. Un modo per accertarsi che il ciclo non ha dipendenze che possano essere compromesse consiste nel vedere se eseguendo il ciclo in ordine inverso i Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE 12 THE PARALLEL UNIVERSE Calcolo parallelo tascabile; personalizzarlo con Intel® Integrated Performance Primitives per il processore Intel® Atom™ di Robert Mueller, Noah Clemons e Paul Fischer Software Technical Consulting Engineers, Intel Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Scopri come le librerie di performance, come Intel® Integrated Performance Primitives (Intel® IPP), ­migliorano le applicazioni per componenti small form-factor, ottimizzando e unificando il flusso di ­esecuzione dei calcoli per task ad alta intensità di dati. Come si vede nella Figura 1, l’elaborazione dei segnali e il calcolo vettoriale avanzato sono i due campi più utilizzati nei vari tipi di sistemi intelligenti. Spesso, viene utilizzato un processore di segnali digitali (DSP) per aiutare il processore general purpose in questi particolari task di calcolo. Un DSP può includere una sua interfaccia e una serie di funzioni di libreria, ma non è particolarmente adatto a svolgere compiti general purpose. I DSP sono progettati per eseguire rapidamente le operazioni matematiche elementari (addizione, sottrazione, moltiplicazione e divisione). I DSP includono una serie di istruzioni di moltiplicazione e accumulo (MAC) molto veloci per effettuare le stime del calcolo matriciale che si presentano spesso nella convoluzione, nel prodotto scalare e in altre operazioni matematiche con più operandi. Le istruzioni MAC che includono la maggior parte del codice in un’applicazione DSP sono equivalenti alle istruzioni Intel® SSSE3 (Intel® Supplemental Single Instruction Multiple Data Streaming Extension 3). Come le istruzioni MAC in un DSP, anche le istruzioni Intel® SSSE3 svolgono con grande efficienza operazioni matematiche su vettori e array di dati. Diversamente da un DSP, le istruzioni SIMD (Single Instruction, Multiple Data) in un processore Intel Atom sono più facili da integrare in applicazioni che usano algoritmi matematici complessi per vettori e array, in quanto tutti i calcoli vengono eseguiti nello stesso processore e sono parte di un flusso logico unificato di esecuzione. Per esempio, un algoritmo che cambia la luminosità di un’immagine aggiungendo (o sottraendo) un valore costante a ciascun pixel deve leggere i valori RGB nella memoria, aggiungere (o sottrarre) l’offset e riscrivere i nuovi valori dei pixel nella memoria. Quando si usa un coprocessore DSP, i dati dell’immagine devono essere preparati per il DSP (posti in un’area della memoria che sia accessibile al DSP), segnalati per eseguire l’algoritmo di trasformazione e, infine, restituiti al processore general purpose. L’uso di un processore general purpose con le L'uso di funzioni delle librerie di performance in applicazioni eseguite su componenti small form-factor – detti anche sistemi intelligenti – basati sul processore Intel® Atom™ può essere un’eccellente tecnica per ottimizzare e unificare il flusso di esecuzione dei calcoli per task ad alta intensità di dati. In questo modo si minimizza il rischio di problemi di timing del flusso di dati, detti heisenbug. Questi problemi, difficili da riprodurre e spesso apparentemente casuali, sono causati dal timing finemente orchetrato di componenti SoC (System on Chip) e DSP (Digital Signal Processor) differenti che perdono la sincronizzazione. Le librerie di performance, come Intel® Integrated Performance Primitives (Intel® IPP), contengono algoritmi altamente ottimizzati e codice per funzioni comuni, incluse l’elaborazione dei segnali, l’elaborazione delle immagini, la codifica/decodifica di audio e video, la crittografia, la compressione di dati, speech coding e computer vision. Set avanzati di istruzioni aiutano lo sviluppatore a sfruttare le nuove funzionalità dei processori che sono state appositamente progettate per particolari applicazioni. Basta chiamare Intel IPP come se fosse una scatola nera tascabile di calcolo per un componente embedded o di bassa potenza: “in” riceve i dati e “out” produce il risultato. In questo modo, Intel IPP può prendere il posto di molte unità di calcolo create appositamente per svolgere determinati compiti. Intel IPP eccelle in vari campi (Figura 1) dove viene utilizzato il processore Intel Atom per sistemi intelligenti. Senza librerie di performance altamente ottimizzate, gli sviluppatori avrebbero bisogno di ottimizzare manualmente e con grande attenzione funzioni di calcolo intensivo per ottenere performance adeguate. Questo processo di ottimizzazione è lungo e complicato, e deve essere aggiornato per ogni nuova generazione di processori. I sistemi intelligenti spesso hanno lunghi cicli di vita e quindi occorre un grande lavoro di manutenzione per ottimizzare manualmente le funzioni. Aerospaziale e difesa Integrità dei dati Componenti di rete • • • • • • • • • • • • Rendering realistico Elaborazione di stringhe Calcolo matriciale/vettoriale Speech coding Codifica audio Compressione video Compressione delle immagini Computer vision Conversione dei colori delle immagini Elaborazione delle immagini Elaborazione dei segnali Crittografia Compressione dei dati • • • • • • Consumer • Medicale Auto • • • • • • • • • • • • • • • • • • Figura 1: Domini delle funzioni di Intel® Integrated Performance Primitives 14 Industriale Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. • • • • • • • • • • THE PARALLEL UNIVERSE ippsCopy per processori Intel® Core™ i7 Codice dell’applicazione: void main (void) { ... ippsCopy(); ... } ippsCopy per processori Intel® Core™ 2 ippsCopy per processori Intel® Atom™ 2 ippsCopy per processori Intel® Pentium® 4 ippsCopy per processori General IA-32 Figura 2: Dispatching automatico delle funzioni di libreria per vari processori istruzioni SIMD semplifica questo processo di preparazione, segnalazione e restituzione dei dati. Le primitive della libreria di Intel IPP sono ottimizzate per ciascuna architettura di istruzioni SIMD in modo che esistano più versioni di ciascuna primitiva nella libreria. Intel IPP può essere riutilizzato in un’ampia gamma di processori basati sull’architettura Intel® e, grazie al dispatching automatico, il codice di base dello sviluppatore seguirà sempre il flusso di esecuzione ottimizzato per l’architettura in questione, senza dover modificare la chiamata di funzione sottostante (Figura 2). Ciò è particolarmente utile quando un sistema embedded impiega sia il processore Intel® Core™ per l’analisi e l’aggregazione dei dati sia una serie di SoC basati sul processore Intel® Atom™ per la raccolta e il preprocessing dei dati. In questo scenario, lo stesso codice di base può essere utilizzato in parte sia nei SoC del processore Intel Atom sia nel processore Intel Core nel punto centrale di aggregazione dei dati. Considerando i componenti SoC specializzati nella gestione del flusso dei dati e dell’I/O, combinati con un’interfaccia utente limitata, qualcuno potrebbe pensare che non ci siano molte opportunità di IPP SSSE3 SIMD CPU sfruttare le ottimizzazioni e/o il parallelismo con i processori Intel Atom; non è così. C’è spazio per: >> un’elaborazione multipla asincrona (Asynchronous Multi-Processing, AMP) basata su architetture differenti; >> un’elaborazione multipla sincrona (Synchronous Multi-Processing, SMP) che sfrutta la tecnologia Intel® Hyper-Threading e la struttura dual-core utilizzate nell’ultima generazione di processori Intel Atom per i sistemi intelligenti di bassa potenza. AMP ed SMP spesso coesistono nello stesso SoC. Il codice con requisiti di sicurezza in tempo reale è protetto all’interno di un suo ambiente (gestito da uno scheduler round-robin modificato), mentre il resto del sistema operativo (OS) e i livelli delle applicazioni sono gestiti applicando i concetti standard dell’elaborazione SMP. I processori Intel Atom contengono due core basati sulla tecnologia Intel Hyper-Threading e possono contenere altri due core formando un sistema quad-core. I processori Intel Atom supportano anche il set di istruzioni SSSE3. Un’ampia gamma di funzioni Intel IPP, che potete trovare all’indirizzo http://software.intel. com/en-us/articles/ new-atom-support/, sono ottimizzate per sfruttare l’architettura dei processori Intel Atom e le istruzioni Intel SSSE3 (Figura 3). Le applicazioni con throughput intensivo possono trarre vantaggi dalla semplicità d’uso delle istruzioni vettoriali Intel SSSE3 e dall’esecuzione parallela di più flussi di dati tramite registri vettoriali di capacità extra per l’elaborazione delle istruzioni SIMD. Come detto in precedenza, i moderni processori Intel Atom possono avere fino a quattro core virtuali. Questo fatto rende interessante il threading. Sebbene non ci sia una soluzione universale di threading che sia ottimale per tutte le applicazioni, Intel IPP è stato progettato per essere thread-safe: >> Le primitive della libreria possono essere chiamate contemporaneamente da più thread all’interno della vostra applicazione; >> Il modello di threading che scegliete può avere granularità variabile; Figura 3: Intel® Integrated Performance Primitives è ottimizzato per sfruttare il processore Intel® Atom™ e il set di istruzioni Intel® Supplemental Single Instruction Multiple Data Streaming Extension 3 >> Le funzioni Intel IPP possono sfruttare direttamente i core del processore tramite OpenMP*; >> Le funzioni Intel IPP possono essere combinate con il threading a livello OS utilizzando i thread nativi, Intel® Cilk™ Plus o un altro membro della famiglia Intel di modelli paralleli. Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Il sistema più rapido per creare un’applicazione multithread che usa in modo estensivo Intel IPP consiste nello sfruttare il threading OpenMP incluso nella libreria. Non sono richieste significative modifiche del codice. Tuttavia, soltanto dal 15 al 20 percento delle funzioni Intel IPP sono soggette a threading nella maggior parte dei casi. È quindi preferibile considerare processi di threading di livello più alto per ottenere i risultati ottimali. Poiché le primitive della libreria sono thread-safe, i thread possono essere implementati direttamente nell’applicazione e le primitive delle performance possono essere chiamate direttamente dall’interno dei thread dell’applicazione. Questo approccio offre un controllo migliore del threading e soddisfa le corrette esigenze di threading dell’applicazione (Figura 4). Quando si applica il threading al livello dell’applicazione, è consigliabile disabilitare il threading interno della libreria. In questo modo si elimina la competizione per le risorse dei thread hardware tra i due modelli di threading e, quindi, si evitano prenotazioni in eccesso di thread software per i thread hardware disponibili. 1 di 2 Core 2 di 2 Core Oltre alle performance e alla facilità di manutenzione, anche i footprint di memoria e il consumo di potenza sono fattori importanti nello sviluppo di uno stack software per sistemi intelligenti di bassa potenza. Le istruzioni SIMD possono avere un consumo di energia leggermente superiore rispetto ad altre istruzioni; tuttavia, poiché vengono eseguite in modo più efficiente – consentendo a un’applicazione di essere completata in minor tempo – il risultato finale è un minor consumo totale di energia per completare un compito. Quindi, le istruzioni SIMD permettono di migliorare le performance di workload critici con un minor consumo della batteria. I sistemi intelligenti spesso devono operare entro limiti di memoria prestabiliti. Quindi, l’esigenza di controllare il footprint dell'applicazione su un’unità di memorizzazione (total binay size) o nella memoria durante l’esecuzione può essere critica. Se un’applicazione non può essere eseguita con le risorse disponibili, l’affidabilità dell’intero sistema può essere a rischio. 1 di 2 Core 2 di 2 Core Thread dell’applicazione Thread dell’applicazione Chiama Intel® IPP Thread dell’applicazione 1 Intel® IPP esegue il threading Intel® IPP Internal Thread Thread L’applicazione dell’applicazione 2 esegue il threading Funzioni thread-safe Intel® IPP Internal Thread Chiama Intel® IPP Chiama Intel® IPP Il controllo ritorna all’applicazione Chiama Intel® IPP Chiama Intel® IPP Thread dell’applicazione continua Thread dell’applicazione continua Thread dell’applicazione continua Potenza Figura 4: Threading a livello funzione e threading a livello applicazione tramite Intel® Integrated Performance Primitives app. ottimizzata con IPP potenza = velocità di esecuzione del lavoro energia consumata = potenza media * ∆ tempo esecuzione più rapida delle app. significa ritorno più rapido allo stato idle con conseguente minor consumo di energia app. non ottimizzata Tempo Figura 5: Effetto della libreria ottimizzata sul consumo di potenza 16 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Intel IPP offre la necessaria flessibilità ai modelli di collegamento per ottenere il corretto bilanciamento fra portabilità e gestione dei footprint (Tabella 1). I modelli “dinamico standard” e “dispatched statico” sono le opzioni più semplici da utilizzare per costruire le applicazioni con Intel IPP. La libreria dinamica standard include il set completo delle ottimizzazioni del processore e offre il vantaggio della condivisione del codice a runtime fra più applicazioni Intel IPP. Il rileva­ mento del processore a runtime e del metodo di dispatch al livello appropriato di ottimizzazione è automatico. Dinamico standard Dinamico personalizzato Statico dispatched Statico non-dispatched Ottimizzazioni Tutti i set SIMD Tutti i set SIMD Tutti i set SIMD Un solo set SIMD Distribuzione Eseguibili e DLL Intel IPP standard Eseguibili e DLL personalizzate Solo eseguibili Solo eseguibili Libreria aggiornata Direttamente ridistribuita Ricostruita e poi ridistribuita Applicazione ricompilata e ridistribuita Libreria personalizzata ricostruita, applicazione ricompilata e ridistribuita Executable Only Size Piccolo Piccolo Grande Medio Total Binary Size Grande Medio Medio Piccolo Modalità kernel No No Sì Sì Tabella 1: Confronto dei modelli di collegamento di Intel® Integrated Performance Primitives Codice sorgente dell’applicazione Campioni di codice Intel IPP Campioni di codice di alto livello • Codec video/audio/speech campioni • Compressione ed elaborazione delle immagini • Elaborazione di segnali e stringhe • Compressione e crittografia dei dati • Integrazione dei linguaggi Java e .NET Sviluppo rapido dell’applicazione Chiamate API API della libreria C/C++ Intel IPP API Cross-platform • • • • • • • Compressione dei dati Integrità dei dati Elaborazione dei segnali Calcoli matriciali Calcoli vettoriali Elaborazione di stringhe Speech coding • • • • • • • Crittografia Elaborazione delle immagini Conversione dei colori delle immagini JPEG/JPEG2000/JPEGXR Computer Vision Codifica/decodifica video Codifica/decodifica audio Compatibilità e riutilizzo del codice Collegamento statico o dinamico Ottimizzazioni Intel IPP Implementazioni ottimizzate per il processore • Processori • Processori • Processori • Processori • Processori • Processori • Processori Intel® Intel® Intel® Intel® Intel® Intel® Intel® Atom™ Core™ i7/i5/i3 Core™2 Duo e Quad Core™ Duo e Core™ Solo Pentium® D Dual-Core Xeon® 64-bit Dual-Core Pentium® M and Pentium® 4 Performance superiori Figura 6: Panoramica di Intel® Integrated Performance Primitives. Molti domini sono associati a un codice sorgente campione per un rapido sviluppo. Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Se il numero di funzioni Intel IPP utilizzate nella vostra applicazione è piccolo e gli oggetti della libreria standard condivisa sono troppo grandi, utilizzare una libreria dinamica personalizzata potrebbe essere un’alternativa. Se si vuole ottimizzare l'applicazione in modo da ridurre al minimo il footprint complessivo, il collegamento con una versione statica non-dispatched della libreria potrebbe essere la soluzione appropriata. Questo metodo fornisce un codice eseguibile che contiene soltanto il livello di ottimizzazione richiesto per il processore target. Questo modello assicura il footprint minimo, ma limita l’ottimizzazione a un tipo di processore specifico e a un particolare set di istruzioni SIMD. Questo modello di collegamento è utile quando l’obiettivo è un’applicazione indipendente che viene eseguita su un solo tipo di processore. È anche il modello consigliato per essere utilizzato in modalità kernel o nei driver di unità. L’ecosistema di sviluppo per i sistemi intelligenti embedded non è una prerogativa esclusiva dei sistemi operativi dominanti nel mondo dei server e dei PC da scrivania. Spesso un SoC usa un sistema operativo Linux embedded personalizzato che si basa su qualcosa di simile a Yocto Project* (http://www.yoctoproject.org) o Wind River* Linux (http://www.windriver.com) per l'applicazione e l’interfaccia utente, mentre altre parti del chipset possono eseguire un sistema operativo fail-safe, real-time (FTOS o RTOS). Attualmente, Intel IPP è distribuito e omologato per cinque sistemi operativi: Microsoft Windows*, Linux, Mac OS* X, QNX Neutrino* e Wind River VxWorks*. QNX* e VxWorks* sono limitati a varianti statiche a singolo thread di Intel IPP. L’applicazione di Intel IPP a un sistema operativo “non supportato” richiede che il sistema operativo sia compatibile con l’ABI (Application Binary Interface) definita da uno dei suddetti sistemi operativi e che le routine di allocazione della memoria possano essere utilizzate tramite una libreria C standard o mappata con un codice colla utilizzando una speciale interfaccia i_malloc. Nativo Cross Sistema Target Host La natura atomica (assenza di lock e semafori) dell’implementazione delle funzioni di Intel IPP garantisce un’esecuzione sicura nell’ambiente deterministico di un RTOS. Un esempio della convenienza di applicare la libreria Intel IPP a un RTOS potrebbe essere TenAsys INtime* RTOS per Windows (http://www.tenasys.com). INtime RTOS è un sistema operativo progettato per essere eseguito accanto a Windows, gestendo le richieste real-time su una piattaforma basata su Windows. L’ABI utilizzata da INtime* RTOS è compatibile con l’ABI di Windows e adotta le convenzioni delle chiamate di funzione compatibili con Windows. L’uso di Intel IPP in combinazione con tale RTOS accresce il suo interesse perché offre le performance di un’elaborazione intensiva di dati basata su SIMD, con il determinismo tipico dei DSP. Intel IPP soddisfa le esigenze degli sviluppatori di applicazioni native che operano nel mondo del personal computing, come pure degli sviluppatori di sistemi intelligenti che devono conciliare i requisiti dei sistemi real-time con l’interazione tra il livello applicazione e lo stack software sottostante. Se consideriamo il mondo dei middleware, dei driver e delle interazioni dei sistemi operativi, Intel IPP può essere utilizzato anche nelle unità embedded con requisiti real-time e modelli di esecuzione dominanti. La dipendenza limitata dalle librerie dei sistemi operativi e il supporto a modelli flessibili di collegamento semplificano l’inserimento di Intel IPP in ambienti cross-build embedded, sia che essi siano specifici RTOS sia che seguano una delle configurazioni crossbuild basate sul popolare GNU*, come Poky-Linux* or MADDE*. Sviluppare software per sistemi intelligenti e componenti small form-factor spesso significa che lo sviluppo nativo non è un’opzione disponibile. Intel IPP può essere facilmente integrato con un ambiante cross-build e utilizzato con toolchain cross-build che soddisfano i requisiti di flusso di molti di questi sistemi real-time. Intel IPP consente ai sistemi intelligenti di sfruttare le istruzioni Intel SSSE3 e i registri vettoriali di ampiezza maggiorata del processore Intel Atom. È anche possibile soddisfare le esigenze di determinismo degli sviluppatori, Host Applicazione Applicazioni Angry Birds Middleware 4.99 USD OS/RTOS/Kernel Driver • Host di sviluppo = sistema target • Host di sviluppo ≠ sistema target • PC tradizionali con Windows*/Linux* • PC non standard, piccolo schermo, … • PC industriali, automazione, chioschi, ecc. • IVI, smartphone, tablet, medicali, sistemi embedded (scatola nera) • Livelli OS/RTOS, sviluppo di kernel, unità hardware-near • Richiede tool di sviluppo software specializzati • OEM, OSV, integratori di sistema, sviluppatori di unità embedded • Piattaforma con sistema operativo e API • Tool di sviluppo standard • Sviluppatori di app. mobile, comunità Android*, sviluppatori Windows*, Linux* app. store-centric Figura 7: Intel® Integrated Performance Primitives può essere usato in un'ampia gamma di unità di sviluppo e target 18 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE senza accrescere i rischi associati agli scambi di dati in cross-architecture di componenti SoC complessi. Sviluppare software per componenti small form-factor significa anche che le applicazioni con esigenze di flusso di esecuzione deterministico devono essere interfacciate più direttamente con il livello software del sistema e con lo scheduler del sistema operativo (o RTOS). Gli strumenti e le librerie di sviluppo per queste applicazioni devono essere in grado di operare con i vari livelli dello stack software, sia che esso sia l'applicazione dell’utente finale, il driver che controlla un particolare flusso di dati o un’interfaccia I/O. Intel IPP ha dipendenze minime dal sistema operativo e un’ABI ben definita per operare con le varie modalità riportate nella Figura 7. È possibile applicare funzioni altamente ottimizzate per elaborare segnali e dati multimediali nello stack software, sfruttando l’architettura del processore sottostante e le sue potenzialità – tutto senza dover riprogettare le funzioni critiche con successivi aggiornamenti della piattaforma hardware. Come avviare Intel® Integrated Performance Primitives nei processori Intel® Atom™ >> Acquistate Intel IPP o scaricate una copia di prova (http://software.intel. com/en-us/articles/intel-ipp/) >> Esaminate i campioni di codice gratuiti di Intel IPP (http://software. intel.com/en-us/articles/intel-integrated-performance-primitivescode-samples/) e verificate se qualcuno soddisfa le esigenze di uno dei vostri algoritmi (implementato o progettato). I campioni di codice di Intel IPP sono disponibili per i sistemi operativi Windows, Linux e Mac OS*. Le istruzioni per utilizzare i campioni si trovano nei file ReadMe nella cartella principale di ciascun campione. Alcuni campioni includono una documentazione più dettagliata nella cartella doc, di solito nella forma di file PDF. >> Se nessun campione di codice soddisfa le vostre esigenze, date un'occhiata al manuale di riferimento (http://software.intel.com/sites/ products/documentation/hpc/composerxe/en-us/2011Update/ ippxe/ipp_manual_lnx/index.htm), che è organizzato prima per domini di funzioni, inclusa l'elaborazione dei segnali, e poi per classi di funzioni all'interno di ciascun dominio. La Figura 1 mostra le funzioni di Intel IPP in 14 domini differenti. >> Scegliete l'opzione di collegamento che soddisfa le vostre esigenze fra quelle riportate nella Tabella 1; a questo punto potete iniziare. L'articolo che si trova nella pagina http://software.intel.com/en-us/articles/ introduction-to-linking-with-intel-ipp-70-library/ descrive più approfonditamente queste opzioni. o BLOG highlights Alcuni miglioramenti delle performance utilizzando un modello di parallelismo ­basato sui task Shannon Cepeda, Intel Fra i miei compiti c’è anche quello di supportare e consigliare l’implementazione appropriata per il parallelismo scalabile nelle applicazioni. Ci sono varie ragioni per implementare il parallelismo, e ci sono anche molti metodi per farlo – ma questo blog non si occupa di queste cose. Il blog tratta i miglioramenti delle performance che si ottengono utilizzando un particolare modo di implementare il parallelismo – e fortunatamente, questo modo è supportato da vari modelli a disposizione degli sviluppatori. Sto parlando del parallelismo basato sui task, che significa che potete progettare i vostri algoritmi in funzione dei “task” (il lavoro da fare), anziché delle specifiche dei thread e dei core della CPU. Attualmente ci sono vari modelli di parallelismo che usano i task: Intel® Threading Building Blocks (TBB), Intel® Cilk Plus, Microsoft* Parallel Patterns Library, e OpenMP 3.0, per citarne alcuni. Con una libreria basata sui task (come quelle citate) potete utilizzare funzioni precodificate, istruzioni pragma o template per aggiungere il parallelismo alle vostre applicazioni ... Leggi la parte restante del blog di shannon: Visita Go-Parallel.com Sul sito troverai altri blog che trattano vari argomenti correlati: trasformare la potenza multicore in performance delle applicazioni. Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE collo di bottiglia conflitto di dati accesso in memoria non valido errore di memoria errore di threading memory leak 20 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE conflitto di dati accesso in memoria non inizializzato mismatched allocation errore di memoria collo di bottiglia Strumenti che potenziano affidabilità e performance delle applicazioni .NET Adesso gli sviluppatori .NET possono potenziare le performance delle a­ pplicazioni e migliorare la qualità e l’affidabilità del codice necessarie per il calcolo ad alte prestazioni (HPC) e per le applicazioni aziendali. di Levent Akyil e Asaf Yaffe, Software and Services Group, Intel Corporation Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Strumenti appositamente studiati per scoprire gli errori nella prima fase del ciclo di sviluppo possono offrire grandi benefici. Tali errori di solito sono molto costosi da correggere e, una volta rilasciato un prodotto, spesso ne danneggiano la reputazione. Quanto prima individuiamo e correggiamo gli errori difficili da scoprire, come gli errori di threading (conflitti di dati e deadlock) e gli errori di memoria (memory leak), tanto più facilmente potremo correggerli. Questi strumenti aiutano gli sviluppatori perché associano i vari pro­blemi alle linee del codice sorgente, visualizzando lo stack delle chiamate e gli eventi in funzione del tempo, offrendo così agli sviluppatori un quadro chiaro dei punti critici del loro software. Intel® Parallel Studio XE consente agli sviluppatori .NET di identificare gli elementi critici delle performance, come le funzioni o le linee di codice che consumano più t­ empo, i proble­mi di scalabilità e il tempo speso in attesa di sincronizzazione e nelle attività di I/O. Nel fare questo, ­Parallel Studio XE identifica i potenziali colli di bottiglia della micro­ architettura causati da vari problemi, quali cache miss, predizioni errate del branch e larghezza di banda della memoria. In questo articolo presenteremo alcuni esempi per dimostrare come siano preziosi due strumenti di Intel Parallel Studio XE – lo strumento di controllo degli errori Intel® Inspector XE e lo strumento di analisi delle performance Intel® VTune™ Amplifier XE – agli sviluppatori di codice .NET, codice nativo e applicazioni “miste” (.NET e native) durante il ciclo di sviluppo. Dopo aver descritto l’attuale supporto .NET in Inspector XE e VTune™ Amplifier XE, illustreremo le caratteristiche chiave in azione nelle applicazioni C#. Attuale supporto .NET in Intel® VTune™ Amplifier XE e Intel® Inspector XE I prodotti Inspector XE e VTune Amplifier supportano l’analisi delle applicazioni .NET pure e anche delle applicazioni “miste” che contengono codice “managed” e “unmanaged”. L’analizzatore dei thread di Inspector XE può identificare potenziali deadlock e conflitti di dati nei programmi .NET, così come fa per il codice nativo. Inspector XE monitorizza le allocazioni degli oggetti e accede alla memoria condivisa nell’heap del garbage collector e nelle aree statiche dei dati, contrassegnando come potenziali conflitti di dati gli accessi non sincronizzati (con almeno un accesso in scrittura) di più thread allo stesso membro di un oggetto o classe di dati. Inspector XE conosce anche tutte le API da .NET 2.0 a 3.5 e, quindi, è in grado di identificare deadlock e violazioni della gerarchia dei lock. VTune Amplifier XE assiste gli sviluppatori nel processo di ottimizzazione delle performance delle applicazioni seriali e parallele nei moderni processori e semplifica tale processo per gli sviluppatori .NET in modo che possano scoprire rapidamente i colli di bottiglia per le performance delle applicazioni .NET pure o miste. L’analisi dei punti critici di VTune Amplifier XE mette in evidenza le funzioni e le parti del codice sorgente in cui un’applicazione impiega la maggior parte del tempo di esecuzione. Le analisi Concurrency e Locks & Waits visualizzano la distribuzione del lavoro fra i thread e i punti di sincronizzazione dei thread, aiutando gli utenti a identificare i problemi di distribuzione del lavoro e di eccessiva sincronizzazione dei thread che ostacolano l’esecuzione parallela. VTune Amplifier XE può inoltre aiutare gli sviluppatori a scoprire i problemi di performance della microarchitettura utilizzando la PMU (Performance Monitoring Unit) della CPU per campionare gli eventi del processore e identificare i colli di bottiglia dell’architettura di un determinato processore Intel®. Configurare l'analisi .NET in VTune Amplifier XE e Inspector XE Gli utenti possono scegliere se analizzare le parti managed (modalità “managed”), le parti native (modalità “native”) o entrambe (modalità “mixed”), in questo modo: >> Modalità Native: raccoglie i dati sul codice nativo senza attribuire i dati al codice managed. >> Modalità Managed: raccoglie i dati soltanto sul codice managed senza attribuire i dati al codice nativo. >> Modalità Mixed: raccoglie e attribuisce i dati al codice managed e al codice nativo. Utilizzate questa opzione per analizzare il codice managed che effettua chiamate del codice nativo. >> Modalità Auto: rileva automaticamente il tipo di codice eseguibile. Passa alla modalità mixed quando rileva un’applicazione managed; passa alla modalità native quando rileva un’applicazione nativa. Figura 1: Opzioni di debugging di Microsoft Visual Studio* per un progetto .NET 22 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Il modo in cui scegliere la modalità di analisi dipende dal modo in cui si usano i tool. Se utilizzate i tool dalla riga dei comandi, specificate la modalità utilizzando lo switch “-mrte-mode”. Se utilizzate i tool all’interno di Microsoft Visual Studio*, la modalità di analisi viene automaticamente scelta in base al tipo di progetto attivo: per i progetti nativi (applicazioni C e C++), la modalità di analisi di default è “native” sia in VTune Amplifier XE sia in Inspector XE. Per i progetti .NET (applicazioni C#), la modalità di analisi di default è “managed” in VTune Amplifier XE e “mixed” in Inspector XE. Gli utenti possono utilizzare la pagina Visual Studio Debug Properties per scegliere una modalità di analisi differente. Per abilitare la modalità “mixed” per un progetto .NET, selezionate l’opzione “Enable unmanaged code debugging” (Figura 1). Analogamente, per abilitare la modalità di analisi “mixed” per un progetto nativo, impostate “Debugger Type” a “Mixed” (Figura 2). Se utilizzate l’interfaccia grafica di VTune Amplifier XE o Inspector XE, potete scegliere la modalità di analisi dalla finestra Project Properties (Figure 3 e 4). Figura 2: Scelta della modalità di analisi con Microsoft Visual Studio* per un progetto nativo Figura 3: Scelta della modalità di analisi con Intel® VTune™ Amplifier XE Figura 4: Scelta della modalità di analisi con Intel® Inspector XE Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE namespace VTuneAmplifierXE.Examples { public class POTENTIAL_MT { private static Thread[] threads = new Thread[Benchmarks.gThreadCount]; private static workerThread[] workerThreads = new workerThread[Benchmarks.gThreadCount]; private static object[] threadparams = new object[Benchmarks.gThreadCount]; // segnali di inizio e fine static AutoResetEvent[] goSignals = new AutoResetEvent[Benchmarks.gThreadCount]; static AutoResetEvent[] doneEvents = new AutoResetEvent[Benchmarks.gThreadCount]; public static double potential = 0.0; public double potentialTotal = 0.0; public class workerThread { private volatile bool stopNow = false; private ThreadParameters threadParameters; public void RequestStop() { stopNow = true; } private void computePot_mt(int tid) { int start, end; double distx, disty, distz, dist; start = threadParameters.chunkBegin; end = threadParameters.chunkEnd; potential = 0.0; for { for { } } } … (int i = start; i < end; i++) (int j = 0; j < i - 1; j++) distx = Math.Pow((r[0][j] - r[0][i]), 2); disty = Math.Pow((r[1][j] - r[1][i]), 2); distz = Math.Pow((r[2][j] - r[2][i]), 2); dist = Math.Sqrt(distx + disty + distz); potential += 1.0 / dist; public void doWork(object parameter) { threadParameters = (ThreadParameters)parameter; Console.WriteLine("Thread: {0} ready to start <{1} - {2}>", threadParameters.tid, threadParameters.chunkBegin, threadParameters.chunkEnd); while (!stopNow) { threadParameters.goSignal.WaitOne(); computePot_mt(threadParameters.tid); threadParameters.eventDone.Set(); } Console.WriteLine("worker thread: terminating gracefully."); } } // fine di workerThread … }// fine di POTENTIAL_MT Figura 5 24 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Codice campione Intel® Inspector XE in azione Per mostrare come Inspector XE e VTune Amplifier XE supportano le applicazioni .NET, utilizziamo un programma C# che calcola l’energia potenziale di un sistema di particelle in funzione della distanza nello spazio tridimensionale. Si tratta di un’applicazione che usa i thread .NET per creare un numero di thread pari ai core disponibili. Lo scopo di questo articolo non è descrivere i thread C# e come utilizzare i thread con efficienza nell’ambiente .NET, ma spiegare come i tool possono aiutare a identificare i problemi di threading e a sviluppare applicazioni parallele scalabili ad alte performance. Il seguente codice mostra la parte dell’applicazione che viene eseguita da ciascun thread worker. Il metodo computePot si trova dove si svolge l’azione. Ciascun thread usa i confini indicizzati tramite il numero di identificazione che gli viene assegnato (tid, thread identification number). Questo aiuta a stabilire l’inizio e la fine dell’intervallo delle particelle da utilizzare. Dopo che ciascun thread ha inizializzato il suo spazio iterativo (valori di inizio e fine), inizia a calcolare l’energia potenziale delle particelle. Iniziamo eseguendo Inspector XE sul nostro codice campione. Dal menu Tools di Visual Studio, selezioniamo “Intel Inspector XE 2011” e poi “New Analysis” (Figura 6). Nella successiva pagina Configure Analysis Type, selezioniamo “Locate Deadlocks and Data Races” (Figura 7) e facciamo clic sul pulsante “Start” per avviare l’analisi di correttezza dei thread. L'esecuzione di Inspector XE sul nostro codice campione rivela che c'è un conflitto di dati o data race (Figura 8). Il pannello Problems elenca i singoli problemi. Il pannello Code Locations mostra le posizioni del codice sorgente che sono rilevanti per i problemi identificati. Il pannello Filters consente di filtrare i problemi in base al livello di gravità, al tipo, al modulo e ai file sorgente. Figura 6: Avviare una nuova analisi di Inspector XE da Visual Studio Figura 7: Scegliere un tipo di analisi di Inspector XE Figura 8: Un potenziale conflitto di dati (data race) identificato da Inspector XE 2011 Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Facendo doppio clic sul problema si apre la pagina Sources (Figura 9) dove possiamo esaminare i dettagli del problema. Questa pagina mostra due tipici thread che effettuano un accesso non sincronizzato a una locazione di memoria condivisa, incluso uno stack dettagliato di chiamate per ciascun thread. Utilizzando queste informazioni, possiamo facilmente determinare che c’è un accesso non sincronizzato al membro della classe statica “potential” – un classico conflitto di dati. Facendo doppio clic su una qualsiasi linea sorgente possiamo accedere direttamente al codice sorgente e correggere l’errore. Una soluzione banale di questo conflitto di dati consiste nell’accertarsi che qualsiasi accesso al membro della classe “potential” sia opportunamente sincronizzato con un lock. Tuttavia, questa soluzione introduce una regione seriale (una sezione critica) nel nostro codice parallelo che influisce negativamente sulle performance. Una soluzione migliore consiste nel fare in modo che ciascun thread memorizzi una copia privata di “potential” in una variabile locale del thread e, poi, accumuli i risultati per calcolare il valore finale. Questa soluzione riduce le dipendenze e la sincronizzazione fra i thread ed è probabile che acceleri il codice parallelo. Alcune parole sul controllore della memoria L’analizzatore della memoria di Inspector XE conosce anche il codice .NET e può essere utilizzato per trovare errori e memory leak nelle applicazioni miste che contengono codice nativo e managed. Sebbene l’analisi della memoria sia svolta soltanto per le porzioni native delle applicazioni (in quanto molti degli errori rilevabili sono irrilevanti per il codice .NET), i risultati dell’analisi mostrano tracce complete dello stack, inclusa la catena delle chiamate .NET che ha determinato l’errore di memoria nel codice nativo. La combinazione delle capacità di analisi dei thread e di analisi della memoria rende Inspector XE un potente e prezioso strumento di analisi della correttezza di applicazioni complesse che includono nello stesso programma codice .NET e codice nativo. Intel® VTune™ Amplifier XE in azione Dopo aver risolto i problemi di correttezza, iniziamo ad analizzare le performance della nostra applicazione. La Figura 10 mostra come avviare la Concurrency Analysis all’interno di Visual Studio*. Se l'applicazione è analizzata in un processore della famiglia Intel® quadcore, 2a generazione, a 2.5 GHz, si ottengono i risultati illustrati nella Figura 11. Figura 9: Dettagli del problema di conflitto dei dati Figura 10: Avviare la Concurrency Analysis di Intel® VTune™ Amplifier XE all'interno di Visual Studio 26 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Istogramma della Thread Concurrency Questo istogramma rappresenta la ripartizione del Tempo trascorso. Visualizza la percentuale di tempo in cui un determinato numero di thread sono eseguiti contemporaneamente. I thread sono considerati in esecuzione quando vengono effettivamente eseguiti in una CPU o si trovano in uno stato “eseguibile” nello scheduler del sistema operativo. In sostanza, la Thread Concurrency è una misura del numero di thread che non sono in attesa; può essere maggiore dell’Impiego della CPU se i thread sono nello stato eseguibile e non consumano il tempo della CPU. target media Tempo trascorso 3s 0s 0 1 Idle 2 Poor 3 4 OK Ideal 5 6+ Over Thread eseguiti contemporaneamente Istogramma dell’Impiego della CPU Questo istogramma rappresenta la ripartizione del Tempo trascorso. Visualizza la percentuale di tempo in cui un determinato numero di CPU sono in esecuzione contemporaneamente. L’impiego della CPU può essere maggiore della Thread Concurrency se un thread sta eseguendo un codice su una CPU mentre è logicamente ... target media Tempo trascorso 5s 0s 0 Idle 1 2 Poor 3 4 OK Ideal Thread eseguiti contemporaneamente Figura 11: Istogrammi della Thread Concurrency e dell'Impiego della CPU Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Figura 12: Punti critici per la Thread Concurrency Figura 11mostra che la nostra applicazione non utilizza completamente tutti i core disponibili. La parte superiore della Figura 12 mostra i risultati più da vicino. Il metodo workerThread::computePot_mt consuma la maggior parte del tempo della CPU e ha una parte significativa del tempo identificata come impiego della CPU insufficiente (Poor, colore rosso) e sufficiente (Ok, colore arancione). Ciò indica che questo particolare metodo è un punto critico (ovvero consuma la maggior parte del tempo della CPU) e, pur essendo eseguito da thread, non utilizza completamente i core disponibili. Quindi, ha senso analizzare meglio il suo comportamento esaminando i singoli thread che lo eseguono. La Figura 13 chiarisce che quattro thread, che eseguono il metodo workerThread::computePot_mt, consumano una quantità differente di tempo della CPU, causando uno sbilanciamento del carico e un’utilizzazione sub-ottimale dei core. Questi problemi di sbilanciamento del carico ostacolano la scalabilità delle applicazioni su più core e devono essere risolti. Anche se ciascun thread esegue il ciclo for esterno lo stesso numero di volte, tuttavia il ciclo interno viene eseguito di più dal thread che opera sull’ultimo pezzo, e di meno dal thread che opera sul primo pezzo. Distribuendo l’offset ciclico dell’iterazione sul numero di thread si risolve lo sbilanciamento del carico e i thread potranno utilizzare meglio i core disponibili. L’analisi della concurrency e i risultati ottenuti non solo ci consentono di identificare i problemi di sbilanciamento del carico, ma ci aiutano pure ad accelerare l'applicazione. La seguente modifica consente di mantenere occupati e in esecuzione tutti i thread (Figura 16). “I problemi di sbilanciamento del carico ostacolano la scalabilità delle applicazioni su più core e devono essere risolti." 28 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE La quantità di lavoro svolto è differente! Figura 13: Sbilanciamento del carico dei thread in funzione del tempo e tempo di esecuzione di ciascun thread nella CPU Thread 1 (range) Thread 2 (range) Thread 3 (range) Thread 4 (range) Versione originale 0 –249 250 – 499 500 – 749 750 - 999 Dopo le modifiche 0,4,8,…,992, 996 1,5,9,..,993,997 2,6,10,…,994,998 3,7,11,…,995,999 Figura 14 Versione originale Versione con carico bilanciato chunkBegin = tid * (nParts / threadCount); chunkEnd = (tid + 1) * (nParts / threadCount); ... start = threadParameters.chunkBegin; end = threadParameters.chunkEnd; for (int i = start; i < end; i++) { for (int j = 0; j < i - 1; j++) { distx = Math.Pow((r[0][j] - r[0][i]), 2); disty = Math.Pow((r[1][j] - r[1][i]), 2); distz = Math.Pow((r[2][j] - r[2][i]), 2); dist = Math.Sqrt(distx + disty + distz); potential += 1.0 / dist; } } for (int i = tid; i < constants.POT_NPARTS; i += threadParameters.threadCount) { for (int j = 0; j < i - 1; j++) { distx = Math.Pow((r[0][j] - r[0][i]), 2); disty = Math.Pow((r[1][j] - r[1][i]), 2); distz = Math.Pow((r[2][j] - r[2][i]), 2); dist = Math.Sqrt(distx + disty + distz); potential += 1.0 / dist; } } Figura 15 Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE La quantità di lavoro svolto è identica Figura 16: Il metodo workerThread::computePot_mt è eseguito da quattro thread, che svolgono la stessa quantità di lavoro Abbiamo finito? Non ancora. Proviamo l’analisi dell’architettura di VTune™ Amplifier XE per verificare se il tool è in grado di identificare altre opportunità di miglioramento delle performance. Per eseguire questa analisi in VTune Amplifier XE, utilizziamo l’analisi General Exploration preconfigurata per l’architettura 2nd Generation Core™. La microarchitettura 2nd Generation Core™ è capace di raggiungere 0.25 CPI (Cycles Per Instruction) nelle situazioni ideali. Valori maggiori di CPI per un dato workload indicano che ci sono altre opportunità di migliorare le performance del codice. La Figura 18 mostra i risultati dell’analisi General Exploration. In questo caso, la chiamata della funzione Math.Pow() consuma una significativa quantità di clocktick. Sostituendo Math.Pow() con una semplice moltiplicazione, otteniamo performance molto migliori e riduciamo il valore di CPI a 1.5. Figura 17: Esecuzione di Intel® VTune™ Amplifier XE General 30 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Figura 18: General Exploration mette in evidenza le funzioni problematiche for (int i = tid; i < constants.POT_NPARTS; i += threadParameters.threadCount) { for (int j = 0; j < i - 1; j++) { distx = Math.Pow((r[0][j] - r[0][i]), 2); disty = Math.Pow((r[1][j] - r[1][i]), 2); distz = Math.Pow((r[2][j] - r[2][i]), 2); dist = Math.Sqrt(distx + disty + distz); potential += 1.0 / dist; } } for (int i = tid; i < constants.POT_NPARTS; i += threadParameters.threadCount) { for (int j = 0; j < i - 1; j++) { distx = (r[0][j] - r[0][i]) * (r[0][j] - r[0][i]); disty = (r[1][j] - r[1][i]) * (r[1][j] - r[1][i]); distz = (r[2][j] - r[2][i]) * (r[2][j] - r[2][i]); dist = Math.Sqrt(distx + disty + distz); potential += 1.0 / dist; } } Figura 19 Versione originale (sec) Sbilanciamento del carico corretto (sec) Math.Pow() sostituito con * (sec) 5.4 4.65 0.39 Figura 20 “Intel® Parallel Studio XE consente agli sviluppatori .NET di identificare gli elementi critici delle performance, come le funzioni o le linee di codice che consumano più t­ empo, i problemi di scalabilità e il tempo speso in attesa di sincronizzazione e nelle attività di I/O. Nel fare questo, ­Parallel Studio XE identifica i potenziali colli di bottiglia della microarchitettura causati da vari problemi, quali cache miss, predizioni errate del branch e larghezza di banda della memoria.” Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Metrica di ottimizzazione delle performance Cycles Per Instruction (CPI) è una metrica fondamentale delle performance che indica approssimativamente per quanto tempo viene eseguita ciascuna istruzione, in unità di cicli. I moderni processori superscalari riescono ad eseguire fino a quattro istruzioni per ciclo, cui corrisponde un valore teorico di 0.25 CPI. Vari effetti (opera­zioni SIMD, floating point o in memoria a lunga latenza; istruzioni non-retired dovute a predizioni errate del branch; insufficienza di istruzioni nel front-end) Per analisi più avanzate e approfondite delle microarchitetture, lo strumento dispone di tipi di analisi predefinite, che usano la PMU (Performance Monitoring Unit) per campionare gli eventi del processore e identificare i problemi delle microarchitetture, quali cache miss, cicli di stallo, predizioni errate del branch e altro ancora. I tipi di analisi avanzate sono definiti per architetture quali Intel® Core 2™, Intel® Core™ (Nehalem o Westmere) e Intel® Core™ di II generazione (SandyBridge). Quando si usano questi tipi di analisi predefinite, lo strumento fornisce suggerimenti selezionando le funzioni problematiche. Versioni .NET supportate VTune Amplifier XE e Inspector XE supportano i meccanismi di sincronizzazione di base disponibili nelle versioni da 2.0 a 3.5 di .NET. I tool non supportano le nuove API di sincronizzazione introdotte in .NET 4.0 e la nuova Task Parallel Library. tendono ad aumentare il valore osservato di CPI. Ciò nonostante, CPI è una metrica eccellente per stimare un potenziale miglioramento delle performance. 32 Riepilogo Inspector XE e VTune Amplifier XE offrono preziose tecnologie agli sviluppatori .NET. Questi tool combinano gli strumenti di controllo degli errori e di profilatura delle performance sotto Intel Parallel Studio XE. Aiutano a migliorare le performance delle applicazioni e ad aumentare la qualità e l’affidabilità del codice necessarie per il calcolo ad alte prestazioni (HPC) e per le applicazioni aziendali. Nello stesso tempo, la suite agevola l’approvvigionamento di tutti i tool necessari per le alte performance e semplifica il passaggio dai processori multicore ai processori manycore del futuro. Vedi il codice sorgente › o Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. THE PARALLEL UNIVERSE Risorse e siti Interessanti Go Parallel La missione di Go Parallel del Dr. Dobb è assistere gli sviluppatori nel loro impegno di “tradurre la potenza multicore in performance delle applicazioni”. Ricco di utili informazioni, questo sito contiene blog, notizie, video e storie riguardanti i sistemi multicore e altre importanti risorse. “What If” Experimental Software Che ne direste di sperimentare le implementazioni di ricerca di Intel che sono ancora in fase di sviluppo? E che ne direste se le vostre proposte potessero influire sullo sviluppo di un prodotto futuro? Qui tutto ciò è possibile. Provate gli strumenti emergenti, collaborate con i vostri colleghi e condividete le vostre idee tramite i blog “What if” e i forum di supporto. Step Inside the Latest Software Alcuni video illustrano i prodotti software più recenti di Intel®. Potrete vedere le ultime funzionalità, quali il controllo della memoria, il controllo dei thread, l’analisi dei punti critici (hotspot), l’analisi dei “locks and waits” e altro ancora. Intel® Inspector XE Intel® VTune™ Amplifier XE Intel® Software Network Propone una serie di risorse relative a vari temi di software, che vanno dalla gestione alla programmazione parallela, dalla virtualizzazione al calcolo visivo. Il sito ricco di contenuti include Intel® Software Network TV, blog popolari, video, strumenti e download. Intel® Software Evaluation Center Il centro di valutazione del software Intel® mette a disposizione, gratuitamente per 30 giorni, le versioni di prova dei prodotti di sviluppo del software di Intel®. Per i prodotti di calcolo ad alte performance, potete ottenere un supporto gratuito durante il periodo di valutazione, creando un account Intel® Premier Support dopo aver richiesto la licenza di valutazione o tramite Intel® Software Network Forums. Per valutare Intel® Parallel Studio, potete accedere al supporto gratuito soltanto attraverso Intel® Software Network Forums. Iscriviti per i prossimi numeri in inglese | Condividi la rivista con un amico THE PARALLEL UNIVERSE Avviso sulle ottimizzazioni I compilatori Intel ® potrebbero non ottimizzare allo stesso livello le istruzioni per i microprocessori non-Intel in quelle ottimizzazioni che non sono specifiche dei microprocessori Intel. Tali ottimizzazioni includono i set di istruzioni SSE2, SSE3, SSSE3 e altro. Intel non garantisce la disponibilità, la funzionalità o l’efficienza di qualsiasi ottimizzazione effettuata su microprocessori non fabbricati da Intel. Le ottimizzazioni dipendenti dai microprocessori in questo prodotto riguardano l’utilizzo di microprocessori Intel. Alcune ottimizzazioni non specifiche della microarchitettura Intel sono riservate ai microprocessori Intel. Consultate le guide di riferimento dei prodotti per maggiori informazioni su specifici set di istruzioni trattati da questo avviso. Revisione #20110804 Porta il tuo software in un nuovo mondo di opportunità. Innova le tue applicazioni con strategie proiettate al futuro dalla telefonia mobile alla cloud computing e oltre. Isctiviti: softwareadrenaline.intel.com Iscriviti per i prossimi numeri in inglese Condividi la rivista con un amico The Parallel Universe è una rivista trimestrale gratuita. Fai clic qui per iscriverti per i prossimi numeri e condividere la rivista con gli amici. 34 Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. Go Parallel ha un nuovo look Presentiamo il nuovo portale online per tutte le risorse parallele. Qui troverai le ultime novità, notizie, blog, video, suggerimenti e documentazione tecnica sul parallelismo. Tra i collaboratori ci sono sviluppatori d’avanguardia come Jeff Cogswell e John Jainschigg, e i migliori esperti di parallelismo come James Reinders, Heinz Bast e Levent Akyil di Intel, come pure Stephen Wellman e Chris Yeich di Geeknet. Potenzia le tue applicazioni con performance multicore Video Tutorials Blogs Building Parallel Applications with Cilk Plus and Threading Building Blocks, Using Intel® TBB in network applications: Network Router emulator Wellington and Austin: Programming Lots of Cores Chris Yeich, Intel James Reinders, Intel THE PARALLEL Issue 7 June 2011 THE PARALLEL UNIVERSE Issue 8 September 2011 UNIVERSE THE PARALLEL Issue 9 February 2012 UNIVERSE Intel® Cilk™ Plus: A C/C++ Language Extension for Parallel Programming By Robert Geva Parallelizing DreamWorks Easing the Performance Analysis of Serial and Parallel Applications HPC Study: by Levent Akyil Three Flavors of ‘for’ Loops with Intel® Parallel Building Blocks by Noah Clemons DEVELOPER ROCK STAR: Robert Geva Biophysicists and Mathematicians Embrace Parallelism with Intel® Parallel Advisor by Zakhar A. Matveev Animation* Fur Shader By Sheng Fu Intel® Parallel Studio XE SP1 by Michael D’Mello The Intel® Threading Building Blocks Flow Graph by Michael J. Voss, Ph.D. Letter from the Editor By James Reinders New Analysis Tools in Intel® Cluster Studio XE By David Mackay, Ph.D. and Krishna Ramkumar Evaluation Guides Tech Documents White Papers Intel® Cilk™ Plus The Parallel Universe Magazine Optimizing VLife* Molecular Design Suite Using Intel® Parallel Studio XE ©2012, Intel Corporation. Tutti i diritti riservati. Intel e il logo Intel sono marchi registrati di Intel Corporation negli U.S.A. e in altri Paesi. *Altri nomi e marchi potrebbero essere rivendicati come proprietà di terzi. Ottieni performance estreme Intel® Parallel Studio XE Dalle singole persone alle aziende con migliaia di sviluppatori che lavorano su una singola applicazione, Intel® Parallel Studio XE 2011 estende gli strumenti di sviluppo d’avanguardia per raggiungere livelli di performance e affidabi­lità senza precedenti. Compilatori e librerie avanzati Intel® Composer XE Analizzatore avanzato della memoria, del threading e della sicurezza Intel® Inspector XE Profilatore avanzato delle performance Intel® VTune™ Amplifier XE Chiedi una versione gratuita per 30 giorni di Intel Parallel Studio XE a www.intel.com/software/products. Per maggiori informazioni sulle scelte di ottimizzazione e performance dei prodotti software di Intel, visita http://software.intel.com/en-us/articles/optimization-notice. © 2012, Intel Corporation. Tutti i diritti riservati. Intel, il logo Intel, Intel Core e VTune sono marchi registrati di Intel Corporation negli U.S.A. e in altri Paesi. *Altri nomi e marchi potrebbero essere rivendicati come proprietà di terzi.