Embarrassingly Parallel Computations processes …….. Input data results Each process requires different data and produces results from its input without any results from other processes
Embarrassingly Parallel Computations …….. Collect results send initial data slaves recv() send() spawn() send() recv() Master
Geometrical Transformations of images (a)Shift (b) Scaling © Rotation (d) Clipping
Geometrical Transformations of images process map
Geometrical Transformations of images process 10
Geometrical Transformations of images Master for(i=0, row; i<48 ; i++, row = row +10) send(row, Pi); for(i=0 ; i<480 ; i++) for(j=0 ; j<640 ; j++) temp_map[i][j] = 0; for(i=0 ; I<(640*480) ; i++){ recv(oldrow, oldcol, newcol, Pany); if(!((newrow =480)||(new =640))) temp_map[newrow][newcol]=map[oldrow][oldcol]; } for(i=0 ; i<480 ; i++) for(j=0 ; j<640 ; j++) map[i][j] = temp_map[i][j];
Geometrical Transformations of images Slave recv(row, Pmaster); for(oldrow = row ; oldrow<(row+10) ; oldrow++) for(oldcol=0 ; oldcol<640 ; oldcol++){ newrow = oldrow + delta_x; newcol = newcol + delta_y; send(oldrow, oldcol, newrow, newcol, Pmaster); }
Geometrical Transformations of images Analysis communication computation
Mandelbrot Set
int cal_pixel(complex c) { int count, max; complex z; float temp, lengthsq; max = 256; z.real = 0; z.imag = 0; count = 0; do{ temp = z.real *z.real - z.imag * z.imag; z.real = temp; lengthsq = z.real * z.real + z.imag * z.imag; count++; }while((length<4.0)&&(count<max)); return count; } struct complex{ float real; float imag; }; Sequential code
Mandelbrot Set Sequential code c.real = real_min + x * (real_max - real_min) / disp_height; c.imag = imag_min + y * (imag_max - imag_min) / disp_width; scale_real = (real_max - real_min) / disp_height; scale_imag = (imag_max - imag_min) / disp_width; for(x=0 ; x < disp_width ; x++) for(y=0 ; y < disp_height ; y++){ c.real = real_min + ((float) x * scale_real); c.imag = imag_min + ((float) y * scale_imag); color = cal_pixel(c); display(x, y, color); }
Mandelbrot Set Static Task Assignment Master : for(i=0, row=0 ; i<48 ; i++, row = row + 10) sned(&row, Pi) for(i=0 ; i < (480*640) ; i++){ recv(&c, &color, Pany); display(c, color); } Slave recv(&row, Pmaster); for( x=0 ; x< disp_width ; x++) for(y=0 ; y < (row+10) ; y++){ c.real = min_real + ((float)x*scale_real); c.imag = min_imag + ((float)y*scale_imag); color = cal_pixel(c); send(&c, &color, Pmaster); }
Mandelbrot Set Dynamic Task Assignment Work pool.(x a, y a ).(x b, y b ).(x c, y c ).(x d, y d ).(x e, y e ) ………….
Mandelbrot Set Dynamic Task Assignment Master: recv(&slave, &r, color, Pany, result_tag) count--; if( row<disp_height ){ sned(&row, Pslave, data_tag); row++; count++; }else send(&row, Pslave, terminator_tag); row_recv++; disply(r, color); }while(count>0); Slave: recv(y, Pmaster, ANYTAG, source_tag); while( source_tag == data_tag){ c.imag = imag_min + ((float)y*scale_imag); for(x=0 ; x<width ; x++){ c.real = real_min + ((float)x*scale_real); color[x] = cal_pixel(c); } send(&i, &y, color, Pmaster, result_tag); recv(y, Pmaster, source_tag); };
Mandelbrot Set Dynamic Task Assignment terminate Row returned decrement Row sent increment disp_height
Mandelbrot Set Phase I Phase II Phase III
Monte Carlo Methods 2 2
1 1 x
sum=0; for(i=0; i<N ; i++) xr = rand_v(x1, x2); sum = sum + xr * xr – 3 * xr; } Area = sum / N; Sequential Code
Monte Carlo Methods Parallel Code Master Slaves Partial sum random number process Master for(i=0 ; i<N/n ; i++){ for(j=0 ; j< n ; j++) xr[j] = rand(); recv(Pany, reg_tag, Psource); send(xr, &n, Psource, compute_tag); } for(i=0 ; i<slave_no ; i++){ recv(Pi, reg_tag); send(Pi, stop_tag); } sum=0; reduce_add(&sum, Pgroup);
Monte Carlo Methods Parallel Code Master Slaves Partial sum random number process Slave sum=0; send(Pmaster, reg_tag); recv(xr, &n, Pmaster, source_tag); while(source_tag == compute_tag){ for(i=0 ; i<n ; i++) sum = sum + xr[i] * xr[i] - 3 * xr[i]; send(Pmaster, reg_tag); recv(xr, &n, Pmaster, source_tag); }; reduce_add(&sum, Pgroup);