里仁多核程序设计实验报告文档格式.docx

上传人:b****5 文档编号:19839507 上传时间:2023-01-10 格式:DOCX 页数:13 大小:251.23KB
下载 相关 举报
里仁多核程序设计实验报告文档格式.docx_第1页
第1页 / 共13页
里仁多核程序设计实验报告文档格式.docx_第2页
第2页 / 共13页
里仁多核程序设计实验报告文档格式.docx_第3页
第3页 / 共13页
里仁多核程序设计实验报告文档格式.docx_第4页
第4页 / 共13页
里仁多核程序设计实验报告文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

里仁多核程序设计实验报告文档格式.docx

《里仁多核程序设计实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《里仁多核程序设计实验报告文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

里仁多核程序设计实验报告文档格式.docx

for 

(int 

0;

i<

10000;

i++) 

int 

main() 

double 

dResult;

long 

lBefore 

clock();

#pragma 

omp 

parallel 

test(i);

dResult 

(double)(clock() 

lBefore);

printf("

\nTotal 

Time:

%f 

ms.\n"

 

dResult);

system("

pause"

);

return 

五.结果分析

运行时间是串行的一半。

明显降低了时间的消耗。

实验二各种同步机制的性能比较

以矩阵乘进行并行串行比较

四.实验代码和结果

实验代码:

//juzhencheng.cpp:

定义控制台应用程序的入口点。

#include"

stdafx.h"

#include<

#defineNN2000

intA[NN][NN],B[NN][NN];

longlongC[NN][NN];

voidsolve(intn,intnum_thread){

inti,j,t,k,paralleltime,serialtime;

clock_tstartTime,endTime;

longlongsum;

omp_set_num_threads(num_thread);

//--------------对矩阵A和矩阵B进行初始化-------------

for(i=0;

i<

n;

i++){

t=i+1;

for(j=0;

j<

j++){

A[i][j]=t++;

B[i][j]=1;

}

}

//----------------矩阵乘法并行算法------------------

startTime=clock();

sum=0;

#pragmaompparallelshared(A,B,C)private(i,j,k)

{

#pragmaompforschedule(dynamic)

for(i=0;

for(j=0;

C[i][j]=0;

for(k=0;

k<

k++){

C[i][j]+=A[i][k]*B[k][j];

}

}

i++)

j++)

sum+=C[i][j];

endTime=clock();

paralleltime=endTime-startTime;

printf("

矩阵C所有元素和为sum=%lld并行计算时间time=%dms\n"

sum,paralleltime);

C[i][j]=0;

for(k=0;

C[i][j]+=A[i][k]*B[k][j];

serialtime=endTime-startTime;

矩阵C所有元素和为sum=%lld串行计算时间time=%dms\n"

sum,serialtime);

相对加速比为:

%d/%d\n"

serialtime,paralleltime);

int_tmain(intargc,_TCHAR*argv[]){

intn,num_thread;

请输入矩阵的节数(整数N<

=2000),再输入并行的线程数。

\n\n"

while(scanf("

%d%d"

&

n,&

num_thread)!

=EOF)

printf("

你输入的矩阵节数为:

%d并行线程数为:

%d\n"

n,num_thread);

solve(n,num_thread);

return0;

}

实验结果:

实验三蒙特卡洛法并行求解Pi值

代码:

//Pi.cpp:

//求圆周率PI

windows.h>

iostream>

usingnamespacestd;

staticlongnum_steps=1000000000;

//定义所分的块数

#defineNUM_THREADS2//定义所开启的线程数

int_tmain(intargc,_TCHAR*argv[]){

inti;

omp_set_num_threads(NUM_THREADS);

//开启线程

doublex,sum=0.0,pi;

clock_tstart_time,end_time;

doublestep=1.0/(double)num_steps;

//并行--------------------------------------

start_time=clock();

#pragmaompparallelsectionsreduction(+:

sum)private(x,i)

{

#pragmaompsection

for(i=omp_get_thread_num();

num_steps;

i=i+NUM_THREADS)

x=(i+0.5)*step;

sum=sum+4.0/(1.0+x*x);

}

pi=step*sum;

end_time=clock();

cout<

"

Pi="

pi<

endl;

并行time="

end_time-start_time<

//串行-----------------------------------

sum=0.0;

for(i=0;

i++)

串行time="

system("

结果:

实验四多核并行排序实验

1、熟悉快速排序的串行算法

2、熟悉快速排序的并行算法

3、实现快速排序的并行算法

硬件环境:

,OS:

,软件工具:

VC

1、快速排序的基本思想

2、快速排序算法的性能

3、快速排序算法并行化

//bingxingpaixu.cpp:

#include<

omp.h"

//intcount=0;

voidswap(int&

a,int&

b)//

{

inttmp;

tmp=a;

a=b;

b=tmp;

voidquicksort(int*A,intl,intu)

inti,m,k;

if(l>

=u)return;

m=l;

for(i=l+1;

i<

=u;

if(A[i]<

A[l])

/*不管是选第一个元素作为pivot还是最后一个作为pivot,假如我们想得到的是从小到大的序列,那么最坏的输入情况就是从大到小的;

如果我们想得到从大到小的序列,那个最坏的输入情况就是从小到大的序列*/

swap(A[++m],A[i]);

swap(A[l],A[m]);

quicksort(A,l,m-1);

quicksort(A,m+1,u);

voidmain(intargc,char*argv)

omp_set_num_threads

(2);

//----------------设置线程数为2,因为是双核的CPU

intk=0,i=0;

intm=0,n=0;

doublecost=0;

intlen=10000;

intshort_len=len/2;

intB[10000],C[10000],D[5000],E[5000];

//--------将B[]分为两个小的数组,并行的对他们调用快速排序算法

#pragmaompparalleldefault(none)shared(B,C,len)private(i)//---这个for循环是并行的

intj=50000;

#pragmaompfor

len;

{

B[i]=j--;

C[i]=j--;

//初始化B[],C[]数组

clock_tbegin=clock();

//----------------计时开始点

#pragmaompparalleldefault(none)shared(B,D,E,short_len)private(i)//---这个for循环是并行的

short_len;

i++)//---这个for循环是并行的

D[i]=B[i];

//将B[]的前5000个数放入D[]

E[i]=B[i+5000];

//将B[]的后5000个数放入E[]

#pragmaompparalleldefault(none)shared(E,D,short_len)//private(i)------快速排序的并行region

#pragmaompparallelsections

{

quicksort(D,0,short_len-1);

//对D[]排序

quicksort(E,0,short_len-1);

//对E[]排序

for(;

k++)//----------将D[]和E[]进行归并排序放入B[]里面

if(m<

short_len&

&

n<

short_len)

if(D[n]<

=E[m])

{

B[k]=D[n];

n++;

else

B[k]=E[m];

m++;

if(m==short_len||n==short_len)

if(m==short_len)

B[k]=D[n-1];

k+=1;

break;

if(/*m==short_len&

*/n<

short_len){

inttem=short_len-n;

for(intp=0;

p<

tem;

p++)

B[k]=D[n];

n++;

k++;

elseif(/*n==short_len&

*/m<

inttem=short_len-m;

for(intq=0;

q<

q++)

B[k]=E[m];

m++;

}//----------------------------归并算法结束

clock_tend=clock();

//----------------计时结束点

cost=(double)(end-begin);

cout<

"

并行时间"

<

cost<

endl;

//串行开始

begin=clock();

quicksort(C,0,len-1);

end=clock();

串行时间"

system("

封面设计:

贾丽

地址:

中国河北省秦皇岛市河北大街438号

邮编:

066004

电话:

0335-*******

传真:

网址:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1