高能计算实验报告.doc_第1页
高能计算实验报告.doc_第2页
高能计算实验报告.doc_第3页
高能计算实验报告.doc_第4页
高能计算实验报告.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高性能计算练习实验报告A组:一.问题描述A02. 从键盘输入一个无符号长整型数n,产生一个长度为n,取值在0,1之间的随机实数数组,计算其去掉一个最大值、去掉一个最小值,hy剩下n2个值的平均值。二.算法设计分为两个线程,每个线程负责查找一半的数中最小的和最大的,并且统计所有的数的和,然后由0号线程进行两个最小的(最大的)数的比较,找出整个数组中最大和最小的数,最后由0号线程取两个和,减去最大最小数,求平均值。三.重点及难点1. 线程之间的通信。2. 每个线程都要计算总和,并找出最大最小数。3. 0号线程完成最后的统筹工作。四.代码#include mpi.h#include #include using namespace std;double num100;void init(double num, int len)for (int i = 0; i 100; i+) numi = (double)(rand() % 100) / 100.0;MPI_Bcast(num, len, MPI_DOUBLE, 0, MPI_COMM_WORLD);void proc(int start, int end, double &Min, double &Max, double &Sum)for (int i = start; i numi ? Max : numi;Min = Min numi ? Min : numi;Sum += numi;int main(int argc, char* argv)int rank, np;MPI_Status status;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &np);init(num, 100);double Min = 1.1, Max = -0.1, Sum = 0.0;double tMin, tMax, tSum;if (rank = 0) proc(0, 50, Min, Max, Sum);tMin = Min, tMax = Max, tSum = Sum;MPI_Recv(&Min, 1, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &status);tMin = tMin Max ? tMax : Max;MPI_Recv(&Sum, 1, MPI_DOUBLE, 1, 20, MPI_COMM_WORLD, &status);tSum += Sum;printf(Cal: %lf, %lf, %lfn, tMin, tMax, (tSum - tMin - tMax) / 98.0); else proc(51, 100, Min, Max, Sum);MPI_Send(&Min, 1, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD);MPI_Send(&Max, 1, MPI_DOUBLE, 0, 10, MPI_COMM_WORLD);MPI_Send(&Sum, 1, MPI_DOUBLE, 0, 20, MPI_COMM_WORLD);MPI_Finalize();return 0;五.结果分析结果正确B组:一. 问题描述B08.(八皇后问题)在8*8格的棋盘上,放置8个皇后。要求每行每列放一个皇后,而且每一条对角线和每一条反对角线上最多只能有一个皇后,即对同时放置在棋盘的任意两个皇后和,不允许或者的情况出现。二.算法设计用一个一维数组完全可以标示整个棋盘。要注意的是,由于每一行每一列都不重复,即数组中存放的必是一个由0-7组成的全排列。采用一维数组的全排列,解决了同一行无重复棋子(一维数组来保证,因为数组每个下表只对应一个元素),同一列无重复棋子(全排列来保证,因为全排列每个元素在数组中只出现一次),这样先将八皇后问题转化成了求解一维数组全排列问题。三.重点及难点1. 当要判断第七行,即数组下标是6的行元素与其对角线上的棋子是否有冲突,仅仅需要判断其试探棋子向前做加(或减)操作,获得的值是否与相应位置相同即可。2. 在计算全排列的时候,增加一个flags数组,用来标记当前第n个元素是否被占用。四.关键代码#includestdafx.h#include#include#ifndefMPICH_SKIP_MPICXX#defineMPICH_SKIP_MPICXX#endif#includeusingstd:cout;usingstd:endl;usingstd:cerr;usingstd:ofstream;usingstd:ifstream;#defineN 8voidoutPut(constint& size,int*array,ofstream & file)for(inti = 0 ; i size ; i+)filearrayi;fileendl;boolisContact(constint&deep,constint*const&array)inttemp;for(inti = 1 ; i deep+1 ; i+)temp =arraydeep-i;if(arraydeep -i = temp |arraydeep + i = temp )returntrue;returnfalse;voidrange(constint& size,constint&deep,int*const&flags,int*&array,int&count, ofstream &file) for(inti = 0 ; i size ; i+)if(!flagsi)arraydeep = i;if(deep !=0)if(isContact(deep,array)continue;flagsi = 1;if(deep = size-1)outPut(size,array,file);count+;elserange(size,deep+1,flags,array,count,file);arraydeep = -1;flagsi = 0;voidmpi_range(constint& size,int*&flags,int*&array,constint&myId)ofstream file;file.open(temp.txt,std:ios:out | std:ios:app);flags =newintN;array=newintN;memset(flags,0,sizeof(int)*N);memset(array,-1,sizeof(int)*N);flagsmyId = 1;array0 = myId;intcount = 0 ;inttotalCount = 0;range(N,1,flags,array,count,file);MPI_Reduce(&count,&totalCount,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);if(myId = 0)cerrtotalCountendl;file.close();int_tmain(intargc,char* argv)intsize;intmyId;ofstream file;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论