里仁多核程序设计实验报告 本文关键词:多核,程序设计,实验,报告
里仁多核程序设计实验报告 本文简介:多核程序设计实验报告Multi-coreProgrammingExperimentReport学生所在学院:里仁学院学生所在班级:学生姓名:学生学号:指导教师:教务处2014年4月实验一Windows多线程编程模块一:基础练习一.实验目的与要求二.实验环境及软件三.实验内容四.实验代码·#inclu
里仁多核程序设计实验报告 本文内容:
多核程序设计实验报告
Multi-core
Programming
Experiment
Report
学生所在学院:
里仁学院
学生所在班级:
学
生
姓
名
:
学
生
学
号
:
指
导
教
师
:
教
务
处
2014年
4
月
实验一
Windows多线程编程
模块一:基础练习
一.
实验目的与要求
二.
实验环境及软件
三.
实验内容
四.
实验代码
·
#include
·
#include
·
#include
·
#include
·
void
test(int
n)
·
{
·
for
(int
i
=
0;
i
#include
#include
#define
NN
2000
int
A[NN][NN],B[NN][NN];
long
long
C[NN][NN];
void
solve(int
n,int
num_thread){
int
i,j,t,k,paralleltime,serialtime;
clock_t
startTime,endTime;
long
long
sum;
omp_set_num_threads(num_thread);
//--------------对矩阵A和矩阵B进行初始化-------------
for
(i
=
0;
i
#include
#include
#include
using
namespace
std;
static
long
num_steps=1000000000;//定义所分的块数
#define
NUM_THREADS
2
//定义所开启的线程数
int
_tmain(int
argc,_TCHAR*
argv[])
{
int
i;
omp_set_num_threads(NUM_THREADS);//开启线程
double
x,sum=0.0,pi;
clock_t
start_time,end_time;
double
step=1.0/(double)num_steps;
//并行--------------------------------------
start_time=clock();
#pragma
omp
parallel
sections
reduction(+:sum)
private(x,i)
{
#pragma
omp
section
{
for
(i=omp_get_thread_num();i
#include
#include
#include
#include
“omp.h“using
namespace
std;
//int
count=0;
void
swap(int
tmp
=
a;
a
=
b;
b
=
tmp;
}
void
quicksort(intA,int
l,int
u)
{
int
i,m,k;
if
(l
>=
u)
return;
m
=
l;
for
(i
=
l
+
1;
i
<=
u;
i++)
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);
}
void
main(int
argc,charargv)
{
omp_set_num_threads(2);//----------------设置线程数为2,因为是双核的CPU
int
k
=
0,i
=
0;
int
m
=
0,n
=
0;
double
cost
=
0;
int
len
=
10000;
int
short_len
=
len
/
2;
int
B[10000],C[10000],D[5000],E[5000];//--------将B[]分为两个小的数组,并行的对他们调用快速排序算法
#pragma
omp
parallel
default(none)
shared(B,C,len)
private(i)//---这个for循环是并行的
{
int
j
=
50000;
#pragma
omp
for
for
(i
=
0;
i i++) { B[i] = j--; C[i] = j--; //初始化B[],C[]数组 } } clock_t begin = clock();//----------------计时开始点 #pragma omp parallel default(none) shared(B,D,E,short_len) private(i)//---这个for循环是并行的 { #pragma omp for for (i = 0; i i++)//---这个for循环是并行的 { D[i] = B[i];//将B[]的前5000个数放入D[] E[i] = B[i + 5000];//将B[]的后5000个数放入E[] } } #pragma omp parallel default(none) shared(E,D,short_len) //private(i)------快速排序的并行region { #pragma omp parallel sections { #pragma omp section quicksort(D,0,short_len - 1);//对D[]排序 #pragma omp section quicksort(E,0,short_len - 1);//对E[]排序 } } for (; k k++)//----------将D[]和E[]进行归并排序放入B[]里面 { if (m n++; } else { B[k] = E[m]; m++; } } if (m == short_len || n == short_len) { if (m == short_len) B[k] = E[m]; else B[k] = D[n - 1]; k += 1; break; } } if (/*m==short_len for (int p = 0; p p++) { B[k] = D[n]; n++; k++; } } else if (/*n==short_len for (int q = 0; q q++) { B[k] = E[m]; m++; k++; } }//----------------------------归并算法结束 clock_t end = clock();//----------------计时结束点 cost = (double)(end - begin); cout << “并行时间“<< cost << endl; //串行开始 begin = clock(); quicksort(C,0,len - 1); end = clock(); cost = (double)(end - begin); cout << “串行时间“<< cost << endl; system(“pause“); 实验结果: 封面设计: 贾丽 地 址:中国河北省秦皇岛市河北大街438号 邮 编:066004 电 话:0335-8057068 传 真:0335-8057068 网 址:http://jwc.ysu.edu.cn - 10 -