重新对比审视排序和哈希连接算法.ppt

重新对比审视排序和哈希连接算法.ppt

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

关于双调排序双调序列:所谓双调序列(BitonicSequence)是指由一个非严格增序列X和非严格减序列Y构成的序列,比如序列(23,10,8,3,5,7,11,78)对于一个双调序列我们定义一个它的0-1序列:当a[i]大于某一个值,它的f值为1,a[i]小于某一个值,它的f值为0,最后所有的f值就是它的0-1序列。所以双调序列的0-1序列一定是0..0011..10..00或者11..100..011..1这样的。上例的双调序列可以定义a[i]大于等于10时为1)半清洁器较小的值位于输出的上半部,较大的值位于输出的下半部两部分序列仍是双调的两部分序列中至少有一个是清洁的——全由0或1组成。(它的名称也是由此而来)构造双调排序网络通过递归地连接半清洁器,我们可以建立一个双调排序网络可以计算得到半双调排序网络的深度为log2n两种排序的对比由于independentsort可以减少当线程增多时,线程之间的资源争用以及线程之间的通信,所以在多线程时具有更好的性能进行归并排序SIMD同样适合归并排序的加速,这里我们使用的是双调合并网络以上三个排序阶段,每个阶段都是并行的,每个阶段需要2次SIMD指令调用,分别求max和min,共6次SIMD指令调用构造双调排序网络n=8时的具体构造对大规模数据使用双调合并使用核函数bitonic_merge4()进行双调合并排序左图算法的效率大约O(Nlog2N)尽管该排序算法公式上效率并不比现在大多数的排序算法效率高,但是该算法是适合并行的,并行时N可以同时计算,取N=1,该算法的实际效率为O(Log2N),快于普通排序算法对于排序数组的大小,通常认为取2P×k的值能得到最好的效率,在本文的硬件环境下,k取8有最好的性价比算法一:双调合并排序算法4.缓存敏感的排序连接不同层次的排序寄存器中排序(第3部分中的已讨论)高速缓存中排序(上述算法一中已讨论)高速缓存外排序(如何合并的数据超过高速缓存的大小,就需要继续到内存中排序)平衡计算和带宽(in-cachesort)算法一中讨论的双调排序可以对8个8bytes(每个64位)64bytes数据进行排序,使用36条汇编指令通过IntelArchitectureCodeAnalyzer工具可以计算出对于本文的CPU,64bytes数据需要29个CPU周期(不考虑内存带宽或延迟)得益于SIMD,我们在缓存内的排序使用多级两路归并排序,如下图每次排序,本文中使得排序的FIFO队列填满整个缓冲区,以减少内存读写平衡计算和带宽(out-cachesort)2.4GHz的CPU单线程内存读写速度可达2×5.3Gb/s(read/write)这超出了当前接口带宽的限制,考虑到目前的CPU的多核和多线程,这个差距会更大为了减少内存读写,本文使用了多路归并,避免了两路归并的时候频繁读写内存并且每次的排序块能够填满CPU缓存,以避免频繁的任务切换带来的开销后面的实验中本文演示了如何调整归并来避免内存瓶颈5.基于哈希的连接哈希连接基本问题哈希结果随机访问内存,会引起缓存命中问题如果哈希表大于缓存大小,几乎每次访问hash表都会产生缓冲区未命中解决的方案是分区哈希连接该算法的连接性能很大程度上取决于分区阶段两种分区方法基数分区(RadixPartitioning)程序管理缓冲区(Software-ManagedBuffers)6.连接算法分析m-way高度并行的排序连接算法针对NUMA的优化算法的结构如图分块,AVX排序多路归并排序扫描,连接m-passm-pass和m-way的区别仅在于之前的步骤②m-pass在步骤②进行连续的双调归并分块,AVX排序连续双调归并扫描,连接mpsm(MassivelyParallelSort-Merge)使用soft-managedbuffers对关系R进行划分将R按不同范围分配到不同的NUMA区域/线程每个线程对自己区域内的数据进行排序,即可得到全局有序的R对关系S直接进行划分每个线程对自己区域内的S进行排序最后由多个线程分别将R和每个分区的S进行连接Radix(RadixHashJoin)本文利用分区将输入划分到不同的分区,并且使每个分区适应缓存的大小,这样可以将对应的分区装载到缓存中进行连接操作N-part(No-partitioningHashJoin)将输入的关系R和S分成大小相等的部分分配

您可能关注的文档

文档评论(0)

优美的文学 + 关注
实名认证
内容提供者

优美的文学优美的文学优美的文学优美的文学优美的文学

1亿VIP精品文档

相关文档