- 1、本文档共30页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6. 附录
6.1 基于OpenMP的并行程序设计
6.1.1 代码及注释#include stdafx.h
#include stdio.h
#include time.h
#include windows.h
#include omp.h
#include math.h
#define NUM_THREADS 2
#define SIZE 100
int xh_a[SIZE],xh_d[SIZE],xh_b[SIZE/2],xh_c[SIZE/2];
void quick_sort(int xh_s[], int l, int r)
{
if (l r)
{
int i = l, j = r, x = xh_s[l];
while (i j)
{
while(i j xh_s[j] = x) // 从右向左找第一个小于x的数
j--;
if(i j)
xh_s[i++] = xh_s[j];
while(i j xh_s[i] x) // 从左向右找第一个大于等于x的数
i++;
if(i j)
xh_s[j--] = xh_s[i];
}
xh_s[i] = x;
quick_sort(xh_s, l, i - 1); // 递归调用
quick_sort(xh_s, i + 1, r);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf(%d个随机数的排序\n,SIZE);
omp_set_num_threads(2);
int i=0,j=0,k=0,l=0;
long n=SIZE/2;
srand((unsigned)time(NULL)); //初始化随机数种子
for (i = 0; i SIZE; i++)
xh_a[i] = rand();
clock_t xh_t1,xh_t2;
#pragma omp parallel for private(i)
for(i=0;in;i++)
{
xh_b[i]=xh_a[i];
xh_c[i]=xh_a[i+n];
}
xh_t1=clock();
#pragma omp parallel sections //快速排序的并行,分两个线程
{
#pragma omp section
quick_sort(xh_b, 0, n-1);//对b[]排序
#pragma omp section
quick_sort(xh_c, 0, n-1);//对c[]排序
}
while(lnjn)
{
if(xh_b[l]xh_c[j])
{
xh_d[k]=xh_b[l];
l++;
k++;
}
else
{
xh_d[k]=xh_c[j];
j++;
k++;
}
}
while(ln)
{
xh_d[k]=xh_b[l];
l++;
k++;
}
while(jn)
{
xh_d[k]=xh_c[j];
j++;
k++;
}
xh_t2=clock();
printf(parallel time=%d\n,(xh_t2-xh_t1));
xh_t1=clock();
quick_sort(xh_a, 0, SIZE- 1);
xh_t2=clock();
printf(serial time=%d\n,(xh_t2-xh_t1));
system(pause);
return 0;
}
6.1.2 执行结果截图
图 1
图 2
图 3while(injn)
{
if(xh_b[i]xh_c[j])
{
xh_d[k]=xh_b[i];
i++;
k++;
}
……
}
while(in)
{
xh_d[k]=xh_b[i];
i++;k++;
}
正确代码
while(lnjn)
{ if(xh_b[l]xh_c[j])
{ xh_d[k]=xh_b[l];
l++; k++;
}
……
}
while(ln)
{ xh_d[k]=xh_b[l];
l++; k++;
}
分析
错误的使用了共享变量i,因为i的值在前面已经赋过值,值不是0,使得i的值不是从0开始,使得排序数组的靠后的几个随机数全变成了0,
解决方法:重新给i赋值为0,或替换变量,或将归并排序封装成函数,然后调用。
6.2 基于MPI的并行程序设计
6.1.1 代码及注释#include std
文档评论(0)