Platforme pentru dezvoltarea concurentă de prototipuri
Jun 2nd, 2012 | By Dumitru | Category: Educatie, Featured, Paralelism și concurențăPragmatismul unei metode moderne de dezvoltare se manifestă prin acordarea unui rol primar concurenței (specificației acesteia) în ghidarea arhitecturării unui sistem software, dar și prin verificarea și „animarea” cât mai timpurie a cerințelor întru determinarea fezabilității arhitecturii specificate. Cele menționate induc o dezvoltare bazată pe prototip, a cărei avantaje sunt recunoscute atât de industrie, cât și de mediul academic [1,2,3].
Dezvoltarea prototipului concurent este determinată de platforma concurentă țintă – software-ul care permite coordonarea, planificarea și gestiunea resurselor multiprocesor/multicore [4]. Platforma stabilind relația directă dintre potențialul hardware și performanța aplicațiilor, definește unitățile de procesare – firele de execuție.
Substratul pentru multithreading
Implementarea firelor de execuție diferă de la un sistem de operare la altul, dar în majoritatea cazurilor firul este inclus în proces. În sistemele cu un singur procesor multithreading-ul este atins prin tehnici de multiplexare în timp a procesorului, time-slicing-ul în acest caz efectuându-se suficient de rapid pentru a crea impresia execuției simultane. Un alt caz se prezintă în sistemele multiprocesor, în care execuția simultană are loc efectiv. Majoritatea sistemelor de operare moderne suportă ambele posibilități, dar la care se poate adăuga și tehnicile bazate pe operații asincrone de intrare/ieșire.
Planificarea (schedule – eng.) firelor de execuție în sistemele de operare poate avea loc în special în două modalități: cooperativ și preemtiv. Planificarea cooperativă presupune că firele de execuție să renunțe la control odată ce acestea sunt la un anumit punct de oprire. Planificarea preemtivă este definită de o altă strategie, în care sistemul de operare utilizează anumite criterii pentru a decide cum să aloce timpul sarcinilor. Un criteriu comun pentru schimbarea contextului (deci a taskului de executat) este, pur şi simplu, expirarea timpul alocat (de exemplu, sisteme cu time-sharing sau time-sclicing), dar există sisteme de operare, în care unor fire se poate acorda o prioritate mai mare (priority-based – eng.), prin alocarea acestora unor cuante de timp mai mari.
Modele pentru multithreading
Unitatea „grea” de planificare la nivelul nucleului (kernel – eng.) sistemului de operare este procesul, căruia se alocă resursele. Anume în cadrul proceselor se manifestă firele de execuție, care își partajează resursele disponibile. În cazul când firele de execuție sunt gestionate de sistemul de operare, acestea sunt considerate ca fire de execuție ale nivelului nucleu (kernel-level – eng.). Prioritățile acestor fire de execuție se transpun de la prioritățile proceselor din cadrul sistemului. Deși considerate unități „ușoare” de planificare aceste fire implică o procedură de trecere de la un fir la altul mai lentă decât în cazul firelor de execuție de nivelul spațiului utilizatorului (user-level – eng.). Cele menționate se datorează faptului că aceste fire de execuție sunt create și planificate fără implicarea nucleului de sistem. Cu toate acestea relația dintre firele de nivelul nucleului și spațiului utilizatorului este determinată de următoarele modele (figura 1):
- 1:1 (kernel-level threading – eng.), în care firele create de utilizator corespund firelor planificate de nucleu (implementat în Windows API, Native POSIX Thread Library, etc.);
- N:1 (user-level threading – eng.), în care firele create de aplicații se „execută” planificat în spațiul utilizatorului pe un singur fir de nivelul nucleului (implementat în GNU Portable Threads);
- N:M (hybrid threading – eng.), un compromis dintre precedentele două modele (întru valorificarea multiprocesării) în care librăriile sunt responsabile pentru planificarea „execuției” multiplelor fire de nivel utilizator pe firele disponibile de nivel nucleu (implementat în Windows 7, Tera/Cray MTA, etc.);
Platforme concurente
Astfel platforma de dezvoltare, până la urmă, și de execuție trebuie să ofere posibilitatea de exploatare a beneficiilor oferite de concurență (ca formă abstractă a paralelismului și distribuirii) ce poate fi reprezentată în codul sursă în mod explicit sau implicit prin diversele instrumente:
- Limbaje cu multithreading-ul inclus: C#, Java, C++0x, etc.;
- Extensii ale limbajelor și platformelor existente: Scala (bazat Java) [5], Cilk plus (bazat C++) [6];
- Librării ce facilitează programarea paralelă de nivel înalt: Intel Threading Building Blocks (TBB) [7], Microsoft Task Parallel Library (TPL) [8];
- Limbaje/platforme specifice ce implementează diverse modele de programare paralelă:
- Mesagerie (message-passing – eng.), model implementat cu ajutorul librăriilor MPI (de exemplu MPI.NET [9]);
- Data-paralelism, model implementat în limbajul NESL [10];
- Memorie partajată distribuită, model implementat în OpenMP [11];
- Modelul Actor, implementat în Erlang [12], Scala [5];
- Limbaje și platforme de exploatare a unităților grafice de procesare (GPU, Graphics Processing Unit – eng.):
- CUDA (Compute Unified Device Architecture), platformă de calcul paralel inventată de Nvidia întru mărirea performanțelor de calcul prin utilizarea procesoarelor grafice [13];
- DirectCompute, o interfață program de aplicații implementat de Microsoft în DirectX 11 pentru procesare grafică, inclusiv utilizând platforma CUDA [14];
- OpenCL (Open Computing Language), cadrul preluat de consorțiul Khronos Group (inițial propus de Apple Inc.) oferă o modalitate de calcul paralel (pe taskuri și pe date) independent de platformă (CPU/GPU); ultimele modificării fiind anunțate în noiembrie 2011 măresc esențial performanța de calcul [15].
Platforma concurentă este esențială în procesul de dezvoltare a prototipurilor pentru care există două strategii distincte: a) fie se animă structurile de limbaj obținute în urma unei analize obiect-orientate tradiționale; b) fie se optează pentru abordarea orientată pe proces, în care unitățile de limbaj reprezintă deja unități active de execuție – procese.

Figura 1 - Platforme pentru concurență
Referințe
2. Jalote, Pankaj. An integrated approach to software engineering. 3rd Edition Texts in computer science. New York, USA : Springer Science, Business Media Inc, 2005. p. 566. http://books.google.md/books?id=-Tf2y2NsPgAC. ISBN 978-0387-20881-7.
3. Rodrigues, Nuno. Prototyping Concurrent Systems in C omega. International Conference of Innovative Views of .NET Technologies. Porto, Portugal : Instituto Superior de Engenharia do Porto, June 2005. http://w2ks.dei.isep.ipp.pt/labdotnet/files/IVNET/PCSCw_p.pdf.
4. Gebali, Fayez. Algorithms and parallel computing. s.l. : John Wiley & Sons, Inc., 2011. p. 364. http://books.google.md/books/about/Algorithms_and_Parallel_Computing.html?id=3g6lrxrd4wsC&redir_esc=y. ISBN 978-0-470-90210-3.
5. Odersky, Martin. The Scala Language Specification. Version 2.9. s.l. : Programming Methods Laboratory of EPFL, 2011. p. 191. http://www.scala-lang.org/docu/files/ScalaReference.pdf.
6. Intel Corporation. Intel Cilk Plus: A quick, easy and reliable way to improve threaded performance. Intel (R) Software Development Products. [Interactiv] 14 September 2010. [Citat: 17 March 2012.] http://software.intel.com/en-us/articles/intel-cilk-plus/.
7. —. Intel(R) Threading Building Blocks. Reference Manual. 2012. p. 387. http://threadingbuildingblocks.org/uploads/81/91/Latest%20Open%20Source%20Documentation/Reference.pdf. DN 315415-016US.
8. Microsoft Corporation. Task Parallel Library. Parallel Programming in the .NET Framework. [Online] 2011. http://msdn.microsoft.com/en-us/library/dd460717.aspx.
9. Gregor, Douglas. MPI.NET: API Reference. MPI.NET: High-Performance C# Library for Message Passing. [Online] Open System Lab, Indiana University, October 6, 2008. [Cited: March 16, 2012.] http://www.osl.iu.edu/research/mpi.net/documentation/reference/.
10. Blelloch, Guy E. Programming Parallel Algorithms. NESL: A Parallel Programming Language. [Online] Computer Science Department, Carnegie Mellon University, March 1996. [Cited: March 16, 2012.] http://www.cs.cmu.edu/~scandal/cacm.html.
11. OpenMP Architecture Review Board. OpenMP Application Program Interface. 2011. p. 354. http://www.openmp.org/mp-documents/OpenMP3.1.pdf.
12. Armstrong, Joe, et al. Concurrent Programming in ERLANG. Second Edition. Englewood Cliffs : Prentice Hall, 1996. p. 205. http://www.erlang.org/download/erlang-book-part1.pdf. ISBN 0-13-508301-X.
13. NVIDIA Corporation. CUDA parallel programming and computing platform. [Online] NVIDIA Corporation, January 26, 2012. [Cited: March 16, 2012.] http://www.nvidia.com/object/cuda_home_new.html.
14. Boyd, Chas. DirectX 11 DirectCompute – A Teraflop for Everyone. Games for Windows and the DirectX SDK. [Interactiv] Microsoft Corporation, 2010. [Citat: 16 March 2012.] http://blogs.msdn.com/b/chuckw/archive/2010/07/14/directcompute.aspx.
15. Khronos Group. Khronos Releases OpenCL 1.2 Specification. The Khronos Group – Connecting Software to Silicon. [Interactiv] 15 November 2011. [Citat: 16 March 2012.] http://www.khronos.org/news/press/khronos-releases-opencl-1.2-specification.