3、;oldrow<(row+SIZE/1VUMNODES);oldrow++)for(oldcol二0;oldcol〈SIZE;oldcol++){newrow二o1drowm16*16;newcol二oldcolml6*16;/*m是整除運(yùn)算符*/newvalue=map[newrow][newcol];send(oldrow,oldcol,newvalue,Pmaster);}/*消息發(fā)送語句2,把一個(gè)象素點(diǎn)的變換結(jié)果返回主進(jìn)程*/程序中包含兩個(gè)消息發(fā)送語句和兩個(gè)消息接收語句,它們配成兩對(duì)。第一對(duì),主進(jìn)程里的消息發(fā)送語句1“sen
4、d(rov,Pi)”,把一個(gè)行號(hào)row發(fā)送給第i個(gè)子進(jìn)程(或稱“從進(jìn)程”)pio通過循環(huán)語句:for(1-0,row-0:KNUMNODES;I++,tov+二SIZE/NUMNODES)從0號(hào)進(jìn)程起,一直到NUMNODES-1號(hào)進(jìn)程止,NUMNODES個(gè)進(jìn)程無一遺漏。而交給它們的row并不相同:每當(dāng)i上調(diào)1,row皆要跳過SIZE/NUMNODES,實(shí)為分?jǐn)偨o一個(gè)進(jìn)程的工作量。結(jié)合子進(jìn)程里的循環(huán)語句:for(oldrow=row;oldrow<(row+SIZE/NUMNODES);oldrow++)我們得知:屏幕被橫向均分成
5、NUMNODES份,每個(gè)進(jìn)程承擔(dān)SIZE/NUMNODES個(gè)連行構(gòu)成的一等份。而子進(jìn)程里的消息接收語句1arecv(row,Pmaster)",則從主進(jìn)程Pmaster那里獲取一個(gè)行號(hào)作為起始行,計(jì)算它包含SIZE/NUMNODES個(gè)連行的那一份。第二對(duì),子進(jìn)程里的消息發(fā)送語句2“send(oldrow,oldcol,newvalue,Pmaster);}”,把一個(gè)由平面直角坐標(biāo)〈oldrow,oldcol>標(biāo)記的象素點(diǎn),連帶計(jì)算出的新圖像值newvalue,向主進(jìn)程Pmaster報(bào)告。通過雙重循環(huán)語句:for(oldrow=row
6、;oldrow<(row+STZE/NUMNODES);oldrow++)for(oldco1=0;oldcol,無論其原來的圖像值如何,都向它所在的小正方形左上角看齊
7、,即以左上角〈oldrowml6*16,oldcolml6*16>原來的圖像值map[oldrowml6*16][oldcolml6*16]作為它的新值newvalueo此即所謂的"馬賽克”效應(yīng)。程序中的臨時(shí)存儲(chǔ)temp_map,用來逐點(diǎn)收集新的圖像值;待全屏新值到齊,集屮地向顯示緩沖區(qū)轉(zhuǎn)移,』免變換過程的“不堪入目”。設(shè)map的初值:map[i][j]二(i+j)/(2*(SIZE-l));0Wi,j〈SIZE。于是全白點(diǎn)0與全黑點(diǎn)1,原圖各擁有一個(gè)。變換后:全白點(diǎn),16*16-1個(gè);全黑點(diǎn)消失。@例2.14.2在分辨率為SIZE
8、*SIZE(SIZE為2的幕)的顯示屏幕上,用NUMNODES(亦為2的幕,且o主進(jìn)程:for(I二O;I