第十三章共享存储系统并行编程 习题例题: 1、试分析下列循环嵌套中各语句间的相关关系 ①DOI=1,N DO J=2.N S1:A(I,J)=A(I,J-1)+B(,J) S2, C(,JFA(,JD(+1, D(IJ=0.1 Enddo Enddo ②DOI=1N S AFB S2: CFA(+B) S3:D()=C(I+1) Enddo ③DOI=1N DO J=2.N S1: A(,J)=B(J)+ C(J) S2:C(I,J)=D(2 S3:E(I,J=A(1J-1)*2+E(I,-1) Ende Enddo 2、令N=105和N=108,试编写计算x的SPMD并行程序,并在您现有的共享存 储的平台上调试之同时应执行在1,2,3,4,5,6,7和8个处理器上 3、试用X3H5模型,写出计算丌的并行程序 4、下面是使用 Pthreads方法计算的一种并行代码段:
第十三章 共享存储系统并行编程 习题例题: 1、试分析下列循环嵌套中各语句间的相关关系: ①DO I=1,N DO J=2,N S1: A(I,J)=A(I,J-1)+B(I,J) S2; C(I,J)=A(I,J)+D(I+1,J) S3 D(I,J)=0.1 Enddo Enddo ②DO I= 1,N S1: A(I)=B(I) S2: C(I)=A(I)+B(I) S3: D(l) =C(I+1) Enddo ③DO I=1,N DO J=2,N S1: A(I,J) = B(I,J) + C(I,J) S2: C(I, J)=D(I,J)/2 S3: E(I,J)=A(I,J-1) **2+E(I,J-1) Enddo Enddo 2、令 N= 5 10 和 N= 8 10 ,试编写计算 的 SPMD 并行程序,并在您现有的共享存 储的平台上调试之;同时应执行在 1,2,3,4,5,6,7 和 8 个处理器上。 3、试用 X3H5 模型,写出计算 的并行程序。 4、下面是使用 Pthreads 方法计算 的一种并行代码段:
/“计算 t Pthreads编程代码段*∥/ # include/#线程控制所需的头文件# # include/“同步操作所需的头文件* extern unsigned microtime 系统计时变量* msigned int fin, start; semaphore- t semaphore: barrier-spin- t barrier;/*同步信号量说明“ double delta, pi: typedef struct/*定义参数结构“/ Int low int high /*定义线程执行的函数并f old child(arg) g蜂arg int low=arg→lw int high=arg→high; double x, part=0.0 for(i=low; i< = high; i++) x=(i+0.5)“ delta; prt+=1.0/(1.0+x“x); psema(& emaphore);/*利用信号量进行互斥累加“/ p+=4.0dlta“pat semaphore - barrier-spin(& barrier);/*线程在完成计算后需bari同步# pthread-exi();/*线程终止蓍/ main\argc, argy int argc char argv[〕 of threads, segments,1i pLhread-t thread Arg“arg
if(argc!=3)f printf("usage: pi\n); exit(1); no-of-threads=atoi(argv〔1〕); delta=1.0. =0.0 sema-inir(& semaphore,1);/#初始化同步变量* barrier-spin-init(& barrier, no_of_ threads+1) start mIcro- timer: 餐线程开始计时兼 for(i=0;i< no of- threads;i++)/“启动线程“ arg=(Arg*)malloc(size of (Ang)); aglow =i* segments/no_of threads; arg-high=(i+1)* segments/no- of- threads-1: pthread- create( &thread, pthread-attr-default, child, arg); barrier-spin(& barrier);/“主进程等待所有子线程结束*/ fin=* micro. timer;/#线程结束记时兼 printf( %u\n, fin-start) printf("\ npit \ t%15 14f \n, pi); ①试解释上述代码段的工作流程。 ②通过三种模型X3H5 Pthreads和 Open MP上计算的代码段,比较它们的编程风格 的异同和优峡点。 5、下面是使用经理员工模型(即主从模型)求解N-皇后问题的并行代码段: ∥/*求解N皇后经理员工编程代码段*∥ /* Manager程序段W ir(!iam){/*如果我是节点0*
5、下面是使用经理员工模型(即主从模型)求解 N-皇后问题的并行代码段:
printf("\n STARTING.\n); while(get- board( board)=!DONE) crecv(READY, NULL, 0) miscount++;/*计数多少节点准备好 csend ( TASK, board, sizeof(two, two D), nodenbr, 0); /等待所有员工空闲, while(msgcount: -nodes-1) crecv(READY, NULL, 0); count+ 发送 FINISHED消息给所有节点,并遇出 board[OJ[0]-FINISHED csend (TasK, board, sizeof(two D),-1,0); goodbye () ee/员工程序段龄 ror(;;){ csend( ready, 0, 0, 0, 0) crecv(TASK, board, sizeof ( board)) if(board(0J(0]==FINISHED if(chk-board(board)) move to- right(board, 0, MCOLS); 试解释上述代码段的计算过程
试解释上述代码段的计算过程