并行编程实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告课程名称:并行编程
专业班级:
学号:
姓名:
指导教师:
报告日期:
计算机科学与技术学院
目录
实验一 (3)
1. 实验目的与要求 (3)
2. 实验内容 (3)
3. 实验结果 (3)
实验二 (4)
1. 实验目的与要求 (4)
2. 算法描述 (4)
3. 实验方案 (4)
4. 实验结果与分析 (6)
实验三 (7)
1. 实验目的与要求 (7)
2. 算法描述 (7)
3. 实验方案 (7)
4. 实验结果与分析 (8)
实验四 (9)
1. 实验目的与要求 (9)
2. 算法描述 (9)
3. 实验方案 (9)
4. 实验结果与分析 (12)
实验五 (13)
1.实验目的与要求 (13)
2.算法描述 (13)
3.实验方案 (13)
4.实验结果与分析 (15)
PROJECT2 (17)
AIM: (17)
HYPOTHESIS: (17)
METHODS: (17)
RESULT: (17)
DICUSSION&CONCLUSION (18)
REFERENCE (19)
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.实验内容
熟悉并行开发环境,掌握并行编程用到的工具如线程、OpenMP,、MPI等。
3.实验结果
通过上机操作熟悉了各种命令,编写了简单的程序熟悉开发环境。
1.实验目的与要求
a)master the basic principles and methods of parallel
programming design and performance optimization using pthread
b)understand the basic method for data partition and task
decomposition in parallel programming
c)implement the parallel algorithm of calculating the value of pi
using pthread
d)then carries on the simple analysis and summary of the
program execution results
2.算法描述
采用蒙特卡洛方法计算圆周率,利用单位圆与边长为1的正方形面积之比计算圆周率的近似值。
比值的计算采用蒙特卡罗方法的随即投点思想,在正方形中随机投入很多点,使所投点在正方形中每一个位置的机会均等,然后考察有多少个点落在扇形内,落在扇形内的点的个数与投点总数之比就是该比例的近似值。
每一个线程完成一次投点,n个线程同时计算。
3.实验方案
开发与运行环境:使用笔记本电脑登录实验室服务器。
实验代码如下:
#include
#include
#include
#define MaxThreadNum 100
#define kSamplePoints 10000000
#define kSpace 1
void *compute_pi(void *);
int total_hits, hits[MaxThreadNum][kSpace];
int sample_points_per_thread, num_threads;
int main(void)
{
int i;
pthread_t p_threads[MaxThreadNum];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
printf("Enter num_threads\n");
scanf("%d", &num_threads);
total_hits = 0;
sample_points_per_thread = kSamplePoints / num_threads;
for(i=0; i { hits[i][0] = i; pthread_create(&p_threads[i], &attr, compute_pi, (void *)&hits[i]); } for(i=0; i { pthread_join(p_threads[i], NULL); total_hits += hits[i][0]; } double pi = 4.0 * (double)total_hits / kSamplePoints; printf(" Pi: %lf\n", pi); return 0; } void *compute_pi(void * s) { unsigned int seed; int i; int *hit_pointer; double rand_no_x, rand_no_y; hit_pointer = (int *)s; seed = *hit_pointer; // int local_hits = 0; for(i=0; i { rand_no_x = (double)(rand_r(&seed))/(double)(RAND_MAX);