Acest conținut face parte din seria: Distributed Computing
Aveți grijă de articole noi din această serie.
1. Introducere
Interoperabilitate API
Pentru platforma BOINC, dezvoltatorii furnizează API-uri documentate pentru interacțiunea cu aplicațiile și site-urile web. Funcțiile oferite de aceste interfețe includ:
- controlul local și la distanță al GUI clientului BOINC;
- furnizarea de informații cu privire la creditele colectate (în general pentru proiect, pentru un utilizator, o echipă sau o țară);
- Gestionarea conturilor mai multor proiecte printr-o singură interfață web;
- Statistici totale privind împrumuturile pentru gazdele, echipele și utilizatorii care participă la mai multe proiecte;
- mecanisme care permit programelor locale să editeze setările clientului BOINC.
2. Cel mai simplu exemplu de aplicație distribuită
Primul exemplu pe care îl vom examina poate fi găsit printre codurile sursă Boinc din directorul samples / example_app. Acest exemplu este o aplicație simplă BOINC cu un singur filet. Programul efectuează o muncă simplă (de exemplu, verificarea), care poate fi finalizată fie cu succes, fie fără succes. Un exemplu poate fi folosit ca bază pentru propriile aplicații - trebuie doar să înlocuiți implementarea propriului algoritm cu partea care se referă la calcule.
Codul sursă eșantion este împărțit într-un fișier antet, două fișiere de cod și un makefile pentru construirea proiectului (nu se iau în calcul fișierele care conțin sufixul "mac"):
Apoi vom studia mai detaliat codul sursă al programului de probă. Cu toate acestea, este mai bine să avem în fața ochilor fișierului sursă original - fragmente separate și blocuri de cod nesemnificative în scopul studierii BOINC, vom sări sau vom examina într-o ordine diferită. Printre altele, acele părți care sunt asociate cu interacțiunea proceselor într-un singur computer și întreaga producție de grafică vor fi ignorate. Nici unul, nici celălalt nu are caracteristici legate de BOINC. În secțiunea 2.3 este prezentată tabelul de funcții al API BOINC utilizat în program. Acest tabel poate fi accesat pe măsură ce funcțiile corespunzătoare apar în codul sursă (vor fi italice în textul articolului).
2.1 Programul de exemplu UpperCase
Programe în alte limbi decât C / C ++
Există modalități mai mult sau mai puțin simple de a utiliza alte limbi de programare pe lângă cele de bază pentru aplicațiile BOINC C și C ++. Dezvoltatorii descriu "trucuri" pentru următoarele limbi:
Codul principal al aplicației este conținut în fișierul uc2.cpp, programul redă textul fișierului de intrare în majuscule. Pentru a demonstra capacitățile BOINC, dezvoltatorii programului au implementat procesarea următorilor parametri ai liniei de comandă:
- run_slow. Aplicația "adoarme" timp de 1 secundă după fiecare simbol procesat;
- cpu_time N. După terminarea procesării, programul folosește suplimentar N secunde de timp procesor;
- early_exit. forțarea terminată a programului după procesarea a 30 de caractere;
- early_crash. terminarea anormală a programului după procesarea a 30 de caractere;
- early_sleep. programul "adoarme" după procesarea a 30 de caractere.
Firește, codul sursă al programului începe cu conectarea fișierelor antet:
Apoi, sunt conectate diferite fișiere de antet de platformă care conțin definiții ale funcțiilor API BOINC.
Toate aceste fișiere antet (cu excepția standard C ++) într-un cod director sursă BOINC sunt în subdirectoare lib și api. Aici puteți găsi multe definiții (și implementări) ale altor funcții ale API-ului BOINC.
Programul funcționează cu trei fișiere: un fișier de intrare cu textul sursă, un fișier de ieșire la care rezultatul va fi scris și un fișier auxiliar pentru calcularea creditelor. Numele lor (logice) sunt definite în codul sursă:
Acum mergeți la funcția principală a aplicației.
Ca etapă pregătitoare, este necesară inițializarea subsistemului BOINC. În cazul nostru, programul cu un singur filet este inițializat:
O caracteristică importantă a dezvoltării aplicațiilor pentru platforma BOINC este lucrul cu fișiere. Așa cum am menționat mai devreme (vezi articolul 2 "Arhitectura de calcul de înaltă performanță la domiciliu"), aplicațiile BOINC lucrează cu nume de fișiere logice, iar funcțiile speciale sunt folosite pentru a converti un nume logic la un nume fizic. Mai departe, în codul sursă al exemplului nostru, se demonstrează lucrul cu fișierele.
Un fișier de intrare este deschis pentru citire. Funcția boinc_resolve_filename este utilizată pentru a determina calea fizică la fișierul specificat de numele logic INPUT_FILENAME:
Apoi, un fișier este deschis pentru citire, situat pe calea fizică clarificată timpuriu:
Același algoritm este folosit pentru a deschide fișierele de ieșire și auxiliare, totuși, logica programului necesită unele acțiuni suplimentare.
Necesitatea de a utiliza fișierul auxiliar este determinată chiar de esența "computerelor de voluntari". Programul (clientul BOINC) poate fi finalizat înainte de sfârșitul calculului locului de muncă. Cu toate acestea, ar fi nerezonabil în acest caz să începeți din nou toate lucrările (mai ales dacă finalizarea necesită mai multe ore de calcule continue). Fișierul auxiliar este utilizat pentru a restabili starea curentă:
Am citit din fișierul auxiliar numărul de caractere deja procesate:
Am sări peste toate caracterele procesate din fișierul de intrare:
„Taie“ fișierul de ieșire de numărul de simboluri prelucrate (altfel, în caz de oprire de urgență - de exemplu, atunci când alimentarea este oprită sau „înghețarea“ a sistemului de operare - în fișierul de ieșire poate fi simbol chiar nelistate prelucrate, ceea ce va duce la rezultate incorecte!):
Pentru a lucra cu fișierul de ieșire, dezvoltatorii au considerat că este mai convenabil să utilizeze clasa MFILE (care deține variabila) - este definită în fișierul lib / mfile.h.
În cele din urmă, când se fac toate lucrările pregătitoare, este timpul pentru ciclul principal al programului:
Dacă unul dintre parametri a fost specificat pe linia de comandă (vezi mai sus), programul modifică comportamentul său:
Starea curentă este salvată prin apelarea periodică a funcției BOINC API boinc_time_to_checkpoint (). Această funcție, verificând setările de utilizator ale clientului BOINC, determină dacă este timpul să reparăm rezultatele de lucru intermediare (atunci funcția do_checkpoint este apelată în programul nostru).
Funcția do_checkpoint scrie numărul de caractere procesate în fișierul helper.
Clientul este informat cu privire la finalizarea salvării de stat (rezultate intermediare) apelând funcția boinc_checkpoint_completed ():
Acum ne raportăm la progresul sarcinii - valoarea trimisă clientului va fi afișată ca procentaj din munca efectuată.
Conform setărilor (vezi mai sus, unde este scris despre parametrii liniei de comandă), vom petrece puțin timp de calculator "pierdut". Rețineți că nu uitați să actualizați procentajul de muncă efectuată!
Funcția do_a_giga_flop efectuează o operațiune de trilioane de puncte în virgulă mobilă (Gflop).
Alocarea este 100% completă
Finalizați aplicația BOINC
La terminarea lucrului clientul BOINC va contacta în mod independent serverul, îi va transfera rezultatele muncii și va solicita o nouă sarcină.
2.2 Structura programului BOINC
Acum înapoi la structura aplicației standard. Prima funcție API BOINC, care pot fi cauzate în program - l boinc_init () funcția de inițializare. În consecință, cererea trebuie să se încheie cu funcția boinc_finish (). In acest proces, este necesar să se actualizeze informațiile privind amploarea sarcinii (boinc_fraction_done funcția ()) și stoca rezultatele intermediare ale calculelor (boinc_time_to_checkpoint ligamentare () și boinc_checkpoint_completed ()).
Atunci când dezvoltați un program pentru platforma BOINC, trebuie să vă amintiți și particularitățile de lucru cu fișierele și exactitatea atunci când restaurați rezultatele intermediare ale calculelor.
2.3 Funcțiile API-ului BOINC
Această secțiune oferă o listă a funcțiilor BOINC API care se găsesc în programul de probă.
Tabelul 1. Lista funcțiilor API utilizate BOINC
int boinc_finish (starea int)
Funcția trebuie apelată la sfârșitul programului. Starea non-zero indică o eroare.
3. Concluzie
În acest articol, am analizat un exemplu simplu de aplicație distribuită concepută pentru a rula pe platforma BOINC. Exemplul vine cu codul sursă al proiectului BOINC și demonstrează arhitectura și funcțiile de bază. Acest proiect poate fi utilizat ca bază pentru crearea de aplicații distribuite care sunt simple algoritmice, dar necesită resurse de calcul mari.
După cum puteți vedea, nu este nimic dificil în crearea de aplicații care să poată utiliza structura distribuită a calculatoarelor. Platforma BOINC preia partea principală a lucrării: pe partea de server distribuie sarcini între clienți, iar clientul execută sarcinile de execuție și raportează serverului (și afișează, de asemenea, progresul lucrării). Cu toate acestea, până acum clientul nostru BOINC a efectuat o singură sarcină. Cum să faci un număr mare de sarcini? Următorul articol vă va arăta cum să automatizați procesul de generare a sarcinilor de lucru pentru aplicație.