文章分为两部分:
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.在每个队列中设置锁,实现队列的互斥访问