多核编程与并行计算实验报告 (2)

2025-10-21

多核编程与并行计算

重庆邮电大学

多核编程与并行计算

实验报告

姓名:

多核编程与并行计算

一 实验目的和要求

用求函数4/(1+x2)在区间[0,1]的定积分的方法来计算pi的值。建立4个线程,依次计算区间[0,0.25],[0.25,0.5],[0.5,0.75],[0.75,1]的积分。分别存储每个线程的返回值,待全部线程计算完毕后,将所有线程的返回值相加即为pi的值。

二 实验内容

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <pthread.h>

#define N 10000000 //每一区间分成的块数

#define THREAD_NUMBER 4 //线程数目

double d = 1.0/(N*THREAD_NUMBER); //一小块的宽度

double temp[THREAD_NUMBER]; //用来存储每一线程的返回值

void *thread(void *arg)

{

int *start = (int *)arg;//起始点依次为0/THREAD_NUMBER,

1/THREAD_NUMBER....THREAD_NUMBER-1/THREAD_NUMBER

for(double i=(double)*start/THREAD_NUMBER; i<(double)*start/THREAD_NUMBER+1.0/THREAD_NUMBER; i=i+d)

temp[*start]=temp[*start]+4.0*d/(1+i*i);

return (void *)&temp[*start];

}

int main(int argc, char *argv[])

{

int ret_val;

double *retval_pi[THREAD_NUMBER];

int arg[THREAD_NUMBER];

double pi=0;

pthread_t pt[THREAD_NUMBER];

//创建线程

for(int i=0;i<THREAD_NUMBER;i++)

{

arg[i]=i;

ret_val = pthread_create(&pt[i], NULL, thread, (void *)&arg[i]);

if (ret_val != 0 ) {

printf("pthread_create error!\n");

exit(1);

}

}

多核编程与并行计算

//等待每个线程计算完毕

printf("Begin to wait for threads...\n");

for(int i = 0; i < THREAD_NUMBER; i++) {

ret_val = pthread_join(pt[i], (void *)&retval_pi[i]);

pi=pi+*retval_pi[i]; //将每个线程的返回值累加

if (ret_val != 0) {

printf("pthread_join error!\n");

exit(1);

} else {

printf("Thread %d return value is %0.15f\n", i,*retval_pi[i]);

}

}

printf("The value of Pi is %0.15f\n", pi);//输出pi的值

return 0;

}

三、实验结果

四、程序改进

由于程序1用数组retval_pi[THREAD_NUMBER] 分别存储每个线程的返回值,线程在运行时不相互影响,所以不必考虑互斥的问题。本程序只设置一个全局变量pi,每个线程都对pi进行计算。如果在某一时刻,几个线程同时对pi 进行修改,就有可能出现数据不一致的情况,因此必须考虑线程互斥的问题。程序通过设置信号量的方法来实现线程互斥。建立一个初始值为1的信号量sem,当线程要修改pi的值时调用一次sem_wait(&sem)(若sem>0,则

sem=sem--=0,线程可以执行;若sem=0,则已有线程在修改pi的值,线程陷入等待状态),修改完毕后再调用sem_post(&sem)(sem++),从而确保每次只能有一个线程修改pi的值。待线程全部执行完毕后,输出pi的值。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <unistd.h>

#include <pthread.h>

#include <semaphore.h>

#define N 10000000

#define THREAD_NUMBER 4

多核编程与并行计算

double d = 1.0/(N*THREAD_NUMBER);

double pi=0; //存储pi的值

sem_t sem; //信号量

void *thread(void *arg)

{

int *start = (int *)arg;

sem_wait(&sem); //若sem>0,sem--,线程往下执行;若sem<=0,线程将进入等待状态

for(double i=(double)*start/THREAD_NUMBER; i<(double)*start/THREAD_NUMBER+1.0/THREAD_NUMBER; i=i+d)

{

pi=pi+4.0*d/(1+i*i);

}

sem_post(&sem); //sem++

return NULL;

}

int main(int argc, char *argv[])

{

int ret_val;

int arg[THREAD_NUMBER];

sem_init(&sem, 0, 1); //初始化sem值为1

pthread_t pt[THREAD_NUMBER];

//创建线程

for(int i=0;i<THREAD_NUMBER;i++)

{

arg[i]=i;

ret_val = pthread_create(&pt[i], NULL, thread, (void *)&arg[i]);

if (ret_val != 0 ) {

printf("pthread_create error!\n");

exit(1);

}

}

//等待线程执行完毕

printf("Begin to wait for threads...\n");

for(int i = 0; i < THREAD_NUMBER; i++) {

ret_val = pthread_join(pt[i], NULL);

if (ret_val != 0) {

printf("pthread_join error!\n");

exit(1);

} else {

多核编程与并行计算

printf("Thread %d is end! \n", i); }

}

sem_destroy(&sem);

//输出pi的值

printf("The value of Pi is %0.15f!\n", pi);

return 0;

}

五、运行结果:


多核编程与并行计算实验报告 (2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2013年职称计算机考试中文WindowsXP操作系统五模拟题

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219