Marco Russo

.NET, Business Intelligence e dintorni

Corsi

Miei blog in inglese

Intel Software College

Primo giorno di TechEd, pre-conference day. Ho scelto di seguire una sessione che definire tutorial può essere visto come un eufemismo: si parla di ottimizzazione del codice per i processori Intel.
In realtà gli argomenti non sono poi così complessi. Una considerazione interessante sullo sviluppo per notebook è quello di adeguare l'applicazione al Power Scheme: un'applicazione che faccia attività di polling al mondo esterno (si pensi a un Web Service) dovrebbe adeguare il proprio comportamento allo stato complessivo del sistema operativo, altrimenti potrebbe inibire lo sleep o lo spegnimento dell'hard disk, a causa delle operazioni periodiche che potrebbe compiere.
Altrettanto interessanti le considerazioni sul tipo di controlli da fare per verificare lo stato di connessione di un'applicazione... Con un notebook collegato in modo wireless non è piacevole avere delle applicazioni che si comportano "male" quando cade la connessione e che non sono in grado di ripristinarsi quanto questa ritorna. I riferimenti sono alle API GetAdaptersInfo, DeviceIoContro, InternetGetConnectedState per verificare lo stato della connessione, arrivando a misurare i tempi di latenza della rete usando tecniche di PING basate sull'invio di pacchetti UDP.
OpenMP: si tratta di una tecnologia che consente di parallelizzare il codice scritto in C/C++ senza necessariamente apportarvi modifiche. Consiste in un'estensione del compilatore con alcune librerie e l'uso di appositi #pragma per le direttive richieste dal programmatore. In realtà qualche modifica al codice va apportata, ma l'idea è di sfruttare i thread del sistema operativo senza scrivere del codice apposito per creare thread e sincronizzarli. In altre parole, mettendo qualche pragma qua e là si ottiene la parallelizzazione. Ad es.:
	#pragma omp parallel sections {
	        #pragma omp section
	        a = a + b; // un thread
	        #pragma omp section
	        c = c + d; // un altro thread
	}
La cosa è più interessante per i loop:
	#pragma omp parallel for
		for (int i = 0; i < maxvalue; i++ ) {
		    // ...
		}
il loop viene spezzato in N parti uguali (dove N è il numero di processori); bisogna poi considerare come definire le variabili condivise e quelle private (che non richiedono sincronizzazione), il tutto sempre usando dei pragma). Per bilanciare il carico del ciclo for è possibile usare "schedule", che in pratica divide il lavoro in un numero maggiore di parti che sono poi assegnate ai vari processori attraverso un meccanismo simile a quello dei thread pool. E' interessante il bilanciamento progressivo ottenibile con
schedule( guided ... )
che è più "dinamico" rispetto al
schedule (dynamic ...)
che invece decide a priori la divisione del ciclo in parti uguali prima di cominciare (il nome confonde parecchio... ma lo speaker di Intel mi ha detto che è lo standard non l'hanno definito loro...).
Tutte le informazioni su OpenMP si trovano sul sito www.openmp.org.