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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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的值
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,线程将进入等待状态
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的值。
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]; //将每个线程的返回值累加
二实验内容
#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); //一小块的宽度
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 {
printቤተ መጻሕፍቲ ባይዱ("Thread %d is end! \n", 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");
重庆邮电大学
多核编程与并行计算
实验报告
姓名:
一实验目的和要求
用求函数4/(1+x2)在区间[0,1]的定积分的方法来计算pi的值。建立4个线程,依次计算区间[0,0.25],[0.25,0.5],[0.5,0.75],[0.75,1]的积分。分别存储每个线程的返回值,待全部线程计算完毕后,将所有线程的返回值相加即为pi的值。
{
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);
}
}
//等待每个线程计算完毕
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;
}
}
sem_destroy(&sem);
//输出pi的值
printf("The value of Pi is %0.15f!\n", pi);
return 0;
}
五、运行结果:
#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 temp[THREAD_NUMBER]; //用来存储每一线程的返回值
void *thread(void *arg)
{
int *start = (int *)arg;//起始点依次为0/THREAD_NUMBER,1/THREAD_NUMBER....THREAD_NUMBER-1/THREAD_NUMBER
}
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++)
}
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++)
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];
相关文档
最新文档