next up previous contents
Next: Dodeljevanje naslednje naloge Up: B.1 Upravitelj Previous: B.1.3 Razposiljanje naloge delavcem Vsebina: contents

B.1.4 Upodabljanje

Dodeljevanje dela in nadzor delavcev je sestavljeno iz vec podprogramov. Zaradi razlike med procesorskimi mocmi posameznih vozlisc je bilo potrebno uvesti algoritem, ki ucinkovito uravnava delo med delavci. Algoritem je zasnovan na dejstvu, da lahko celoten problem (rastrsko sliko) razdelimo na mnozico neodvisnih podproblemov, ki so jih nekateri delavci sposobni resiti hitreje od ostalih. Ce je teh nalog vec, potem hitrejsi delavci opravijo vec nalog kot drugi. Vsi delavci pa so pri tem polno zaposleni.

Zaradi omejenega stevila odprtih povezav se v sistemu PVM raje uporablja paketni prenos sporocil s protokolom UDP/IP. Velikost enega paketa je omejena, zato je ugodno, ce dolocimo velikost sporocil v obsegu enega paketa, saj tako sistemu PVM ni potrebno skrbeti za razbijanje sporocil na vec delov. Najvecja sporocila, ki se bodo vracala kot rezultat delavcev, bodo izracunane vrstice, katerih velikost je zacetno ocenjena glede na normalno sirino slike.

static int
* render_scene ()
* {
* int tile_height = 5; /* Zacetna velikost enega pasu */

Na zacetku se izracuna celotno stevilo nalog in dolocijo prosti delavci.

njobs = height/tile_height + 1;
* jobstogo = njobs;
* jobnext = njobs;

Alocira se matrika za pomnjenje rezultatov, saj le ti lahko prihajajo v neurejenem vrstnem redu. Naloga upravitelja je, da pravilno zlaga prispele rezultate.

image = (char **) malloc(njobs * sizeof(char *));

if (verbose)
* puts("Claiming tiles [job@serverto:first-last] from workers...");

Na zacetku razposlejmo delo vsem prostim delavcem.

while (servfree >= 0 && jobnext)
* send_nextjob ();

Po razposiljanju cakamo na rezultate delavcev. Takoj, ko delavec konca z enim delom, dobi drugo se neobdelano nalogo. S takim pristopom je zagotovljeno uravnotezeno racunanje, ki se lahko dinamicno spreminja, tudi ce se zaradi drugih procesov spreminjajo obremenitve v racunalniku.

if (verbose)
* {
* printf("\nReceiving tiles <job>...");
* fflush(stdout);
* }
* while (jobstogo)
* claim_tile ();

Po koncanem delu izpisemo statistiko celotnega dela navideznega racunalnika.

if (verbose)
* {
* int i;
* printf("\nServer statistics:\n");
* puts("NUM HOST DTID TID ARCH TILES [ \% ]\n");
* for (i = 0; i < nserv; i++)
* {
* int s;
* int dtid;

dtid = pvm_tidtohost(servtids[i]);

for(s = nhost; s-- > 0; )
* if (hostp[s].hi_tid == dtid)
* break;
* if (s < 0)
* {
* fprintf(stderr, "unknown host #%d\n", i);
* continue;
* }

printf("%3d %28s %8x %8x %8s %5d %5.1f\n",
* i, hostp[s].hi_name, dtid, servtids[i],
* hostp[s].hi_arch, servtiles[i],
* (float)servtiles[i]/(float)njobs*100.0);

}
* }
* return 0;
* }




Copyright © 1995 Leon Kos, Univerza v Ljubljani