多核软件设计实验指导并行排序.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多核软件设计一 并行排序 实验指导 开发者: 开发时间: 版木号: 一、问题描述 在单核计算环境中,排序算法关注的核心问题是怎样减少要排序数据之间的比较次数或算法所需要 的内存空间。 在多核计算环境屮,每个核以线程为执行单元,排序程序可以通过生成相互协作的线程来完成排序。 与单核计算环境不同的是,在多核计算环境中更关注数据集的合理划分,更致力于识别nJ并行执行的任务。 一旦完成这些工作,程序设计上就可以生成对应的线程去执行任务。理论上,基于相同的串行算法和相同 的cache命中率,多核计算速度可以无限接近单核计算速度的P倍,其中P为核的数目。 多核上的并行排序算法所面临的问题在于: 未排序的数据集合理划分到每个线程后,最后怎么汇合,形成完整的排好序的数据集呢? 怎么保证可并行执行的线程的数目和核的数目相等或稍微多于核的数目,同时也保证这些线程之 间的工作量也尽可能的相同呢? 在这个实验屮,串行的算法采用标准C语言库屮的快速排序函数。 并行算法屮,先将要处理的数据集均等的分到每个线程小,并使用c语言库屮的快速排序函数各H排 序。然后所有线程开始根据相同的数对白己的数据集进行划分,这个数是依据一定的方法选出来的(详见 并行算法描述)。每个线程的数据集都会被分成K份,(其中P=KP2, P为核的数冃),每份将被称为 一桶。很显然这个过程选出了 K个数,这些数将被成为bound.value, ii!为Xh X2, X3……XK。最后每个 线程中小于或等于X,的数会被一个独立的线程去归并排序,同样小于或等于X2的数也会被另外-?个独立 的线程去归并排序,依次类推,直到排好序。 需要指出的是:这个并行版木最消耗吋间的部分是一开始何个线程各自的排序,吋间为:O51ogQ; 不过其数据划分和线程生成也相对简单。最后的归并排序所需时间是线性增长的,BP: 0 5),因此即使 在最后归并部分线程执行的任务已经是不均衡的,也不会对整个程序的性能产生很大的影响。 二、串行算法描述 void本项目UI使用了标准c语言库屮的快速排序函数。该函数原型为: void void * base, size_t num^ size_t widths int (__cdecl * compare )(const void * elemi、const void ^elem2 )); 其中 base:待排序数据的数组基址; num:待排序数据的数冃; width:待排序数据元组的大小; compare:排序比较函数,当elemielem2吋返回值小于0,当elemi =elem2吋返回值等于0,当 elem 1 elem2时返冋值大于0; 三、并行算法 3.1并行算法描述 算法: 1、 将原始待排序的数据分成P等份,每个处理器上对NO个数据进行排序,称每个被排序后的子集为 BO,...,Bp-l 2、 Remain_data=N,设定第0组归并起始位置全部为0, i=0,设置第0组在目标数组中的起始位置为0 3、 循环直至 remian_dataL( L=NO/P) 3」选取所有子集中起始位置麻续L个元素的最小值bound_value,并获得bound_value的桶号bucket 3.2在所冇了集中从起始位置到后续L个元素中选取边界位置,使得边界位置的授后一个元素小于或 等于bound_value,而边界位置后的第一元素大于bound_valueo 3.3记录所有的边界位置,并设置所有第i+l组的起始位置为第i组的起始位置加上边界位置 3.4累积所有边界值,得到该归并组的人小 3.5根据归并组大小和本组起始位置计算第i+1组在目标数组中的起始位置。 4、 设置最后一个归并组的边界为NO 5、 对所有归并组进行并行P路归并抑芋。 说明: P和多核处理器的数日相同。比如是双核的,那么P = 2; Remain_data是每个线程处理的数据集中还没冇被Xh X2,X3……划分过的数据集的总数冃。比如,根 据X[每个线程划分出来的数据集为x, y, z ,那么Remain_data=n-x-y-z..... 3.2并行算法的一个例子 在这个实验中,采用Linux操作系统pthread接口來实现程序的并行化。这些接口函数和数据类空都在 头文件vpthread.h中声明。因为pthread并没有包含在C的标准库屮,编译的时候需要加匕Ipthread选项, 使程丿澀接到libpthread,才能编译成功。 例了详细参见附带的源程辰 basic_soil.c, basic_sort.h, sortp.c, sortp.ho 3.3并行算法正确性证明 算法的正确性证明 1、 任何一个原始待排序数据出现且仅出现在一个归并组中。 证明:这可以由算法3.2和3.3中的步骤保证 2、 归并组i

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档