里仁多核程序设计实验报告文档格式.docx
《里仁多核程序设计实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《里仁多核程序设计实验报告文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
for
(int
i
=
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-*******
传真:
网址: