文章分为两部分:
1. OpenMP的使用心得;
2. 两个算法;
个人理解,OpenMP就是面向对已有的串行逻辑的代码进行并行优化,完成代码应首先从串行可行性出发,然后进行并行优化;由于个人是在Pthread代码的基础上进行OpenMP的改写,首先直接照搬Pthread的逻辑,发现这样的效果并不是很好。
应该灵活使用 for /Master/section 等它已经提供的编译指导语句,进行并行优化。
Nopartition_hashjoin: 创建hash表,探测
创建hash表: hash表采用桶链法,在多线程创建hash表的过程中,在每个桶上加锁,实现互斥访问
探测: 对hash表进行探测的过程,顺序遍历另一个表,按得到的hash值进行探测,这里加个for编译指导语句,设一个match的+归约变量
Radix_Partition_hashjoin: 1.基数划分 2.按划分好的块进行Join
基数划分:实现过程中,基数划分分成两步,对于总共要进行Hash的位,分成两部分
1.按照一部分进行聚簇划分
2.对于聚好的簇创建工作任务,即,由于在连接列上已经按照Hash进行聚簇划分了,各个工作任务之间是互相独立的
3.进行2-pass的划分的原因是:贴合硬件的TLB和cache设计
4.采用工作队列的方式进行工作分配,体现在第二次划分(part_queue)和最后的join(join_queue)
5.在每个队列中设置锁,实现队列的互斥访问
本文探讨了如何使用OpenMP对Nopartition_hashjoin和Radix_Partition_hashjoin进行并行优化。首先介绍了OpenMP的基本思想,强调了从串行逻辑出发并灵活运用for、Master和section等指令的重要性。在Nopartition_hashjoin中,通过在桶链法的hash表上加锁来实现互斥访问,同时利用归约变量进行探测。而在Radix_Partition_hashjoin中,通过基数划分和两步聚簇划分,结合工作队列和锁机制,实现了高效的并行Join操作。
5

被折叠的 条评论
为什么被折叠?



