La programmazione Multicore – Parte 1

micro

Se per un programmatore di media esperienza la gestione di un processore “single-core” non rappresenta un problema, le cose possono complicarsi anche notevolmente nel caso in cui i “core” da gestire siano più di uno. In questa serie "La programmazione Multicore" della Rubrica Firmware Reload, all'interno della quale vi sono articoli della rivista cartacea Firmware, affrontiamo in maniera esaustiva questa complessa materia.

Il processo tecnico è fatto di miglioramenti, ammodernamenti e prestazioni sempre crescenti. La tecnica e la programmazione non fanno eccezione a queste logiche. Cerchiamo di realizzare applicazioni sempre più complesse che siano anche più performanti ed ormai non siamo più nelle condizioni di poter semplicemente aumentare la frequenza di clock del processore coinvolto nell’esecuzione dei programmi. Abbiamo bisogno di qualcosa di più, e per fare questo, per riuscire a raggiungere i requisiti sempre crescenti in termini di capacità di calcolo, esistono i moderni “System-On-a-Chip”, dispositivi complessi e particolarmente versatili che rappresentano soluzioni che contengono più core contemporaneamente. Saperli usare, programmarli opportunamente e sfruttare nella maniera migliore le risorse proposte da questi sistemi, rappresenta la strada verso il successo in ogni applicazione odierna. Quelle che vedremo oggi sono alcune indicazioni utili per chi inizia a lavorare in questo campo, con metodi di programmazione che convertiranno applicazioni da eseguire su dispositivi multicore. Parlando di questa implementazione non si può prescindere dai DSP e dalla possibilità di riuscire, anche in questi casi, a rendere il tutto più efficiente in termini di implementazione, esecuzione, sincronizzazione ed analisi delle applicazioni. Buona lettura a tutti voi.

ANALIZZIAMO IL PROBLEMA

Negli ultimi cinquant’anni abbiamo assistito alla salda tenuta della legge di Moore ed abbiamo potuto credere al fatto che fosse accurata e precisa. In pratica, che fosse davvero una legge. Oggi, sappiamo che non era così e che la tecnologia ha dei limiti che in qualche modo, se vogliamo che il progresso segua il suo corso, bisogna superare. Tradurre questo in processo tecnologico in questo momento significherebbe aumentare la frequenza di clock (il che richiede istruzioni pipeline più profonde), l’aumento del livello di parallelismo (e quindi la possibilità di predire thread e branch concorrenti) ma anche l’aumento delle prestazioni delle memorie ed una diminuzione generale del consumo di potenza. Questi sono sostanzialmente tutti i criteri che, fino a questo momento, hanno guidato, e che ancora guidano, l’evoluzione.

Ciò significa che si aprono quattro distinte aree di sviluppo per la tecnologia così come la conosciamo oggi, e che permetterebbero, per esempio lavorando sulla frequenza, di eseguire più operazioni, ma questo non è più possibile per via dei problemi dovuti alle dimensioni. Problemi tecnici, si intende. Il parallelismo, poi, è limitato fortemente dal fatto che sono le applicazioni a non sfruttarlo. Le performance delle memorie sono limitate dal considerevole divario che sussiste tra le loro prestazioni e quelle dei processori, in termini di velocità. Riguardo al consumo di potenza, poi, questo dipende fortemente dalla frequenza di clock, come ben sappiamo, specie in circuiti basati su cMOS. Utilizzare più processori su un solo chip permette ai progettisti di far incontrare i requisiti ed i criteri funzionali senza utilizzare processori che abbiano frequenze operative particolarmente elevate. È possibile selezionare frequenze più basse e poi lavorare tecnologicamente per ottenere sistemi altrettanto veloci che siano in grado di incontrare anche i requisiti più bassi in termini di consumo di potenza. Le prestazioni complessive vengono raggiunte con più core una volta che siano state semplificate le pipeline architectures, soprattutto in confronto con le soluzioni a singolo processore. Le istanze multiple del core all’interno del dispositivo hanno effetti enormi sulle performance, calcolate in MIPS-per-Watt.

I progressi nell’hardware fatti fino a questo momento hanno portato incrementi significativi nell’esecuzione di un software, in termini di velocità, il che non ha coinvolto quasi per nulla i programmatori ma semplicemente essi hanno trovato hardware più performante che eseguisse gli stessi compiti. In qualche modo, adesso, i programmatori dovranno impegnarsi maggiormente per riuscire a gestire in maniera migliore la situazione che hanno tra le mani, ovvero l’interazione tra più core. Come vedremo, infatti, questo riguarda l’accesso alle memorie, l’utilizzazione dei registri, le tecniche di segnalazione dello stato di esecuzione di ciascun processo e soprattutto la temporizzazione, che diventerà un fatto critico. Il parallelismo nei task pone immediatamente il problema dell’esecuzione concorrente di compiti indipendenti; se il processore è singolo, ciascuno di questi viene eseguito sullo stesso processore, ma se sono di più naturalmente la loro esecuzione è indipendente, e questo è il motivo per cui l’esecuzione diventa più efficiente. Se la si sa gestire in maniera opportuna.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend