并行编程实验报告_第1页
并行编程实验报告_第2页
并行编程实验报告_第3页
并行编程实验报告_第4页
并行编程实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、课 程 实 验 报 告课程名称: 并 行 编 程 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 计算机科学与技术学院目录实验一21. 实验目的与要求22. 实验内容23. 实验结果2实验二31. 实验目的与要求32. 算法描述33. 实验方案34. 实验结果与分析5实验三61. 实验目的与要求62. 算法描述63. 实验方案64. 实验结果与分析7实验四81. 实验目的与要求82. 算法描述83. 实验方案84. 实验结果与分析11实验五121实验目的与要求122.算法描述123.实验方案124.实验结果与分析14PROJECT216AIM:16HYPOTHESIS:16METHOD

2、S:16RESULT:16DICUSSION&CONCLUSION17REFERENCE18实验一1. 实验目的与要求become familiar with the parallel development environments, and the basic principles and methods of parallel programming and performance optimization by using tools and frameworks like pthread, OpenMP, MPI under Linux system.2. 实验内容熟悉并行开发环境,

3、掌握并行编程用到的工具如线程、OpenMP,、MPI等。3. 实验结果通过上机操作熟悉了各种命令,编写了简单的程序熟悉开发环境。实验二1. 实验目的与要求a) master the basic principles and methods of parallel programming design and performance optimization using pthreadb) understand the basic method for data partition and task decomposition in parallel programmingc) implemen

4、t the parallel algorithm of calculating the value of pi using pthreadd) then carries on the simple analysis and summary of the program execution results2. 算法描述采用蒙特卡洛方法计算圆周率,利用单位圆与边长为1的正方形面积之比计算圆周率的近似值。比值的计算采用蒙特卡罗方法的随即投点思想,在正方形中随机投入很多点,使所投点在正方形中每一个位置的机会均等,然后考察有多少个点落在扇形内,落在扇形内的点的个数与投点总数之比就是该比例的近似值。每一个

5、线程完成一次投点,n个线程同时计算。3. 实验方案开发与运行环境:使用笔记本电脑登录实验室服务器。实验代码如下:#include #include #include #define MaxThreadNum 100 #define kSamplePoints #define kSpace 1 void *compute_pi(void *); int total_hits, hitsMaxThreadNumkSpace; int sample_points_per_thread, num_threads; int main(void) int i; pthread_t p_threadsMax

6、ThreadNum; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); printf(Enter num_threadsn); scanf(%d, &num_threads); total_hits = 0; sample_points_per_thread = kSamplePoints / num_threads; for(i=0; inum_threads; i+) hitsi0 = i; pthread_create(&p_threadsi

7、, &attr, compute_pi, (void *)&hitsi); for(i=0; inum_threads; i+) pthread_join(p_threadsi, NULL); total_hits += hitsi0; double pi = 4.0 * (double)total_hits / kSamplePoints; printf( Pi: %lfn, pi); return 0; void *compute_pi(void * s) unsigned int seed; int i; int *hit_pointer; double rand_no_x, rand_

8、no_y; hit_pointer = (int *)s; seed = *hit_pointer; / int local_hits = 0; for(i=0; isample_points_per_thread; i+) rand_no_x = (double)(rand_r(&seed)/(double)(RAND_MAX); rand_no_y = (double)(rand_r(&seed)/(double)(RAND_MAX); if(rand_no_x - 0.5)*(rand_no_x - 0.5) + (rand_no_y - 0.5) * (rand_no_y - 0.5)

9、 0.25) (*hit_pointer)+; seed *= i; pthread_exit(0); 4. 实验结果与分析实验结果符合预期:实验三1. 实验目的与要求a) master the basic principles and methods of parallel programming design and performance optimization using OpenMPb) implement the parallel algorithm of calculating the value of pi using OpenMPc) carries on the simp

10、le analysis and summary of the program execution resultsd) compare it with the results of Lab22. 算法描述与实验二相似,同样采用蒙特卡罗方法计算pi值,算法不再详细描述。3. 实验方案实验环境:使用笔记本电脑登录实验室服务器。实验代码如下:#include #include #include #include #define SEED main(int argc, char* argv) int numiter=0;/loop times double x,y,z,pi; int i,count;

11、/* # of points in the 1st quadrant of unit circle */ printf(Enter the number of iterations used to estimate pi: ); scanf(%d,&niter);/* initialize random numbers */ srand(SEED); count=0; int chunk;/ size chunk = 1;#pragma omp parallel shared(chunk) private(i,x,y,z) reduction(+:count) #pragma omp for

12、schedule(dynamic,chunk) for ( i=0; initer; i+) x = (double)rand()/RAND_MAX; y = (double)rand()/RAND_MAX; z = x*x+y*y; if (z=1) count+; pi=(double)count/niter*4; printf(# loop times= %d , estimate of pi is %g n,niter,pi);Openmp自动将for循环分解成多个线程并行执行。4. 实验结果与分析实验结果如下:与实验二相比本实验是使用openmp自动分解多线程并行,精度并无明显区别,

13、与所选算法有关。循环次数越多,得到的结果就越精确。实验四1. 实验目的与要求a) master the basic principles and methods of parallel programming design and performance optimization using MPIb) implement the parallel algorithm of calculating the value of pi using MPIc) carries on the simple analysis and summary of the program execution res

14、ultsd) compare it with the results of Lab2 and Lab32. 算法描述本实验采用与实验一实验二相同的蒙特卡罗算法实现pi值得计算,即利用单位圆与边长为1的正方形面积之比计算圆周率的近似值。比值的计算采用蒙特卡罗方法的随即投点思想,在正方形中随机投入很多点,使所投点在正方形中每一个位置的机会均等,然后考察有多少个点落在扇形内,落在扇形内的点的个数与投点总数之比就是该比例的近似值。3. 实验方案Mpi是一种基于消息传递的并行编程技术,各个进程有独立的堆栈和代码段,进程之间的信息交互通过调用通信函数完成。基本的API如下:int MPI_Init(int

15、 *argc, char *argv)MPI_Init 是MPI程序的第一个调用,它完成MPI程序的所有初始化工作,启动MPI环境,标志并行代码的开始。 int MPI_Finalize(void) MPI_Finalize 是MPI程序的最后一个调用,它结束MPI程序的运行,标志并行代码的结束,结束除主进程外其它进程。其之后串行代码仍可在主进程(rank = 0)上继续运行。int MPI_Comm_size(MPI_Comm comm, int *size);获取进程个数p。 int MPI_Comm_rank(MPI_Comm comm, int *rank); MPI获取当前进程的RA

16、NK,rank值取址范围是0p-1,RANK值唯一 的表示了进程的ID,其中Rank=0的为主进程int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);发送函数:当前进程将以buf为初始地址,长度为count且元素类型为datatype的信息发动给rank值为dest的进程,这条消息的标识符为tag。其中datatype有MPI_INT, MPI_FLOAT等常用类型,Tag的作用是用于区分一对进程之间发送的不同信息int MPI_Recv(void* buf, i

17、nt count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status);接受函数:从rank值为source的进程接受标识符为tag的信息,存入以buf为初始地址,长度为count的存储区域中,类型为datatype.实验环境:使用笔记本电脑登录实验室服务器。具体代码如下:#include#include#include#include#includevoid read_num(long long int *num_point,int my_rank,MPI_Comm comm);void

18、 compute_pi(long long int num_point,long long int* num_in_cycle,long long int* local_num_point,int comm_sz,long long int *total_num_in_cycle,MPI_Comm comm,int my_rank);int main(int argc,char* argv) long long int num_in_cycle,num_point,total_num_in_cycle,local_num_point; int my_rank,comm_sz; MPI_Comm

19、 comm; MPI_Init(NULL,NULL);/初始化 comm=MPI_COMM_WORLD; MPI_Comm_size(comm,&comm_sz);/得到进程总数 MPI_Comm_rank(comm,&my_rank);/得到进程编号 read_num(&num_point,my_rank,comm);/读取输入数据 compute_pi(num_point,&num_in_cycle,&local_num_point,comm_sz,&total_num_in_cycle,comm,my_rank); MPI_Finalize(); return 0;void read_n

20、um(long long int* num_point,int my_rank,MPI_Comm comm) if(my_rank=0) printf(please input num in sqaure n); scanf(%lld,num_point); /* 广播函数 int MPI_Bcast( void* data_p /in/out int count /in MPI_Datatype datatype /in int source_proc /in MPI_Comm comm /in ) */ MPI_Bcast(num_point,1,MPI_LONG_LONG,0,comm)

21、;void compute_pi(long long int num_point,long long int* num_in_cycle,long long int* local_num_point,int comm_sz,long long int *total_num_in_cycle,MPI_Comm comm,int my_rank) *num_in_cycle=0; *local_num_point=num_point/comm_sz; double x,y,distance_squared; srand(time(NULL); for(long long int i=0;i *lo

22、cal_num_point;i+) x=(double)rand()/(double)RAND_MAX; x=x*2-1; y=(double)rand()/(double)RAND_MAX; y=y*2-1; distance_squared=x*x+y*y; if(distance_squared=1) *num_in_cycle=*num_in_cycle+1; /* 全局函数 MPI_Reduce( void* input_data_p /in void* output_data_p /out int count /in MPI_Datatype datatype /in MPI_Op

23、 oprtator /in int dest_process /in MPI_Comm comm /in ) */ MPI_Reduce(num_in_cycle,total_num_in_cycle,1,MPI_LONG_LONG,MPI_SUM,0,comm); if(my_rank=0) double pi=(double)*total_num_in_cycle/(double)num_point*4; printf(the estimate value of pi is %lfn,pi); 4. 实验结果与分析实验结果如下:由结果可知循环次数越多得到的pi值就越精确。与实验二和实验三相

24、比,相同循环次数下采用mpi运算速度更快。实验五1实验目的与要求1.understand deeply the architecture of GPGPU and master the CUDA programming model2.implement the parallel algorithm of calculating the value of pi using CUDA3.carries on the simple analysis and summary of the program execution pose optimization solution

25、based on the execution results and hardware pare it with the results of Lab2 ,Lab3 and Lab42.算法描述采用积分法计算pi值:积分法计算pi值的基本思想是利用1/(1+x2)的原函数为arctanx,再利用积分的基本步骤:分割,求和,取极限。将函数图形与Y轴和直线X=1围成的面积尽可能细分,然后求和,最后乘以相应常数,可以得到一个非常近似的pi值。3.实验方案CUDA在执行的时候是让host里面的一个一个的kernel按照线程网格的概念在显卡硬件(GPU)上执行。每一个线程

26、网格又可以包含多个线程块(block),每一个线程块中又可以包含多个线程(thread)。基本API如下: cudaError_tcudaMalloc(void*devPtr,size_tsize); 在设备端分配size大小的空间,起始地址为devPtrcudaError_t cudaMemcpy (void * dst, const void * src,size_t count,enum cudaMemcpyKind kind); 将以src为地址长度为count的数据赋值到dst为起始地址的内 存区域中,常用的kind有cudaMemcpyHostToDevice, cudaMemcp

27、yDeviceToHostcudaError_tcudaFree(void*devPtr);在设备端清理以devPtr为起始地址的内存空间 将任务合理的分配到grid和thread中,有助于提升程序的性能:grid of thread:具体实验代码如下:#include _global_ void kernel(double *gpu_p) int gpu_count = 0; for (int gpu_i = 1; gpu_i = 1000; gpu_i+) if (gpu_count % 2 = 0) gpu_pgpu_i= gpu_pgpu_i-1 - 4 / (double)(2*gp

28、u_i-1); else gpu_pgpu_i = gpu_pgpu_i-1 + 4 / (double)(2*gpu_i-1); gpu_count = gpu_count + 1; _syncthreads();int main(int argc, char *argv) int i; int count=0; double p100;double *g_p; int block_size = 32; const int N = 1000; int n_blocks = N/block_size + (N%block_size = 0 ? 0:1); p0 = 0; g_p= (doubl

29、e *)malloc(1000 *sizeof(double); cudaMalloc(void *) &g_p,1000 * sizeof(double); cudaMemcpy(g_p, p,1000 * sizeof(double), cudaMemcpyHostToDevice); kernel ( g_p); cudaMemcpy(p, g_p,1000 * sizeof(double), cudaMemcpyDeviceToHost); cudaFree(g_p); for (i = 1; i = 1000; i+) printf( %2.4ft, pi); printf( blocks = %d block size= %dt,n_blocks, block_size ); system(pause); return 0; 4.实验结果与分析实验结果如下:与前三次实验采用的蒙特卡罗法相比,积分法的精度更高,使用cuda计算pi值,速度更快。PROJECT2AIM:master the two typical par

温馨提示

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

评论

0/150

提交评论