ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:61.32KB ,
资源ID:18790832      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18790832.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(燕山大学多核程序设计实验报告Word文档下载推荐.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

燕山大学多核程序设计实验报告Word文档下载推荐.docx

1、This is kjj ThreadFrunc2int main() int i=0; _beginthread(ThreadFrunc1,0,NULL); _beginthread(ThreadFrunc2,0,NULL); Sleep(3000); cout#include /#include HANDLE evFinish;long cs=0; /总循环次数long count=0; /主线程有效次数long count_thread=0; /thread线程有效次数time_t start, finish; /定义开始结束时间/thread线程计算量为总数的一半DWORD WINAPI

2、 thread(LPVOID param) int i=0; double x,y; for(i=0;ics/2;i+) x=(long double)rand()/(long double)RAND_MAX; y=(long double)rand()/(long double)RAND_MAX; if(x*x+y*y)=1) count_thread+;/printf(副%d ,i);SetEvent(evFinish);return 0;/主线程计算量为总数的一半int main (void) evFinish=CreateEvent(NULL,FALSE,FALSE,NULL); pr

3、intf(请输入总循环次数: scanf(%d,&cs); cs*=; srand( (unsigned)time( NULL ) );/用时间作随机数种子 start=time(NULL); /记录开始时间 HANDLE id=CreateThread(NULL,0,thread,NULL,0,NULL); /创建thread线程 count+; / printf(主%dcount%d,count);WaitForSingleObject(evFinish,INFINITE);/两线程同步 count+=count_thread; finish=time(NULL); /记录结束时间 pri

4、ntf(并行情况:nn用时=%f 秒n,difftime(finish,start); /计算时间差 printf(总共的循环次数=%d次n,cs); 线程有效次数=%d次npi= %f n,4*(double)count/(double)cs);串行行情况:ncount=0;cs; return(0);实验结果:测试数据集合:由随机数函数产生的数据集合 实验三 并行排序1、实验目的与要求在单核计算环境中,排序算法关注的核心问题是怎样减少要排序数据之间的比较次数或算法所需要的内存空间。在多核计算环境中,每个核以线程为执行单元,排序程序可以通过生成相互协作的线程来完成排序。与单核计算环境不同的是

5、,在多核计算环境中更关注数据集的合理划分,更致力于识别可并行执行的任务。一旦完成这些工作,程序设计上就可以生成对应的线程去执行任务。理论上,基于相同的串行算法和相同的cache命中率,多核计算速度可以无限接近单核计算速度的P倍,其中P为核的数目。多核上的并行排序算法所面临的问题在于:1. 未排序的数据集合理划分到每个线程后,最后怎么汇合,形成完整的排好序的数据集呢?2. 怎么保证可并行执行的线程的数目和核的数目相等或稍微多于核的数目,同时也保证这些线程之间的工作量也尽可能的相同呢?在这个实验中,串行的算法采用标准C语言库中的快速排序函数。并行算法中,先将要处理的数据集均等的分到每个线程中,并使

6、用C语言库中的快速排序函数各自排序。然后所有线程开始根据相同的数对自己的数据集进行划分,这个数是依据一定的方法选出来的(详见并行算法描述)。每个线程的数据集都会被分成K份,(其中P= K P2 ,P为核的数目),每份将被称为一桶。很显然这个过程选出了K个数,这些数将被成为bound_value, 记为 X1, X2, X3 XK 。最后每个线程中小于或等于X1的数会被一个独立的线程去归并排序,同样小于或等于X2的数也会被另外一个独立的线程去归并排序,依次类推,直到排好序。需要指出的是:这个并行版本最消耗时间的部分是一开始每个线程各自的排序,时间为:O();不过其数据划分和线程生成也相对简单。最

7、后的归并排序所需时间是线性增长的,即:O(),因此即使在最后归并部分线程执行的任务已经是不均衡的,也不会对整个程序的性能产生很大的影响。3、实验内容3.1 并行算法描述算法:将原始待排序的数据分成P等份,每个处理器上对N0个数据进行排序,称每个被排序后的子集为B0,Bp-1Remain_data=N,设定第0组归并起始位置全部为0, i=0,设置第0组在目标数组中的起始位置为0循环直至remian_data#ifndef _BASIC_SORT_H#define _BASIC_SORT_H#ifndef _SORT_P#define _SORT_Pvoid* sort(void* parame

8、ter);void generate_data(int *a,int n);void sort_s(int *a, int n);void view_data(int *a, int n);int check_data_sort(int *a,int n);int compare( const void *arg1, const void *arg2 );#define MILLION L #define P 2#define N0 /#define N0 #define N N0*P#define L N0/Pvoid sort_p(int*d, int * b);struct merge

9、/归并结构 int beginP; /数组begin int countP; /数组count int merge_size; /归并大小 int global_pos; /全局位置 int merged; /归并是否完成;struct arg_merge_data /归并数据结构 int *d; /数组的指针 struct merge* mp; /归并结构 int *b; /整数b int k;struct arg_merge_data *tmp2;struct forsort int *d; int k;struct forsort forsortaP;int find_bound_val

10、ue(int *d,struct merge *mp,int *bucket);int find_min(int *d,struct merge *mp,int *bucket);void find_bound(int *d,struct merge *mp,int bucket,int bound_value);void do_last_merge_block(struct merge *mp);void merge_data(void* arg);void view_merge(int *d,struct merge *mp,int last_merge_block);int start_

11、time();int diff_time();#endifint k;HANDLE SwaitP;HANDLE PwaitP;HANDLE pthreadP;HANDLE qthreadP;extern int *dP;/void generate_data(int *a, int n) /产生数据 int i;n;i+) ai=rand()%10000; /产生数组a 有n个元素P; di=&(ai*N0); /产生数组d 对应ai中每个n0块的第i个元素/void sort_s(int *a, int n) /快排ai qsort(void *)a,n,sizeof(int),compar

12、e);void* sort( void *parameter) /快排参数(数组)的前N0个元素 struct forsort *forsortb = (struct forsort *)parameter;/ printf(nSetEvent(Swait%d) ,forsortb-k);/= int kk=forsortb-k; qsort(/*(void*)*/forsortb-d, N0, sizeof(int), compare); SetEvent(Swaitkk);n%d,kk); return (void*)0;void view_data(int *a, int n) int

13、i=n,j; int index=0; while(iN0) for(j=0;j0;i-) /输出ai中N0后面的个数/int check_data_sort(int *a,int n) /找出不服和大小顺序的位置n-1; if(aiai+1) break; return i;int compare( const void *arg1, const void *arg2 ) /返回arg1与arg2的差 int a=*(int *)arg1,b=*(int *)arg2; return a-b;int aN;/data for parallel sortint bN;/ the result

14、of parallel sortint *dP;/ for parallel sortint sN;/data for serial sortstruct merge m_listP*P;/record of partitionint merge_block; / the number of partitionDWORD thr_idP*P;long timedif;/ for estimate the exection time/struct timeval end; / ./struct timeval start;/ .void inite()int i;/forsorta=(struc

15、t forsort *) calloc(P, sizeof (struct forsort); Swaiti=CreateEvent(NULL,FALSE,FALSE,NULL); Pwaiti=CreateEvent(NULL,FALSE,FALSE,NULL);/* for(int j=0;j+) forsortai.dj=dj;forsorta%d.d%d=%dn,i,j,forsortai.dj); */void main()int data;generate_data(a, N); /产生数组anN;i+) /数组s=a si=ai; inite();请稍等.n/start_time

16、(); sort_p(d,b);/diff_time();start_time(); sort_s(s,N);单线程快排所用时间ndiff_time(); if(data=check_data_sort(b,N)=N-1)printf(Sort is OKn elseb%db%dn,data,data+1);/int start_time() /记录开始时间函数start=time(NULL);/int diff_time() /记录结束时间并算时间差函数finish=time(NULL);printf(用时=%f 秒 n /输出结果/void sort_p(int *d, int *b) /tmp2=(arg_merge_data *) calloc(merge_block + l, sizeof (struct arg_merge_data); int i; int remain_data=N; /剩余数据初始化 merge_block=0;/归并块=0i+) /m_list0中的两个数组

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

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