openmp实现Nopartition_hashjoin与Radix_Partition_hashjoin

本文探讨了如何使用OpenMP对Nopartition_hashjoin和Radix_Partition_hashjoin进行并行优化。首先介绍了OpenMP的基本思想,强调了从串行逻辑出发并灵活运用for、Master和section等指令的重要性。在Nopartition_hashjoin中,通过在桶链法的hash表上加锁来实现互斥访问,同时利用归约变量进行探测。而在Radix_Partition_hashjoin中,通过基数划分和两步聚簇划分,结合工作队列和锁机制,实现了高效的并行Join操作。

文章分为两部分:

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.在每个队列中设置锁,实现队列的互斥访问

在使用 CMake 编译支持 OpenMP 的 C++ 项目时,如果出现 `undefined reference to OpenMP::OpenMP_CXX` 错误,通常是因为 `find_package(OpenMP)` 未能正确找到所需的 OpenMP 库,或者 CMake 版本较低导致对 OpenMP 的支持不完整。以下是解决此类问题的详细方法: ### CMake 版本兼容性 对于 CMake 3.9 及以上版本,推荐使用以下方式查找并链接 OpenMP: ```cmake find_package(OpenMP REQUIRED) target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX) ``` 如果 CMake 版本较低(低于 3.9),则需要手动模拟 `OpenMP::OpenMP_CXX` 接口库的行为。可以使用以下代码段替代: ```cmake if(NOT TARGET OpenMP::OpenMP_CXX) find_package(Threads REQUIRED) add_library(OpenMP::OpenMP_CXX IMPORTED INTERFACE) set_property(TARGET OpenMP::OpenMP_CXX PROPERTY INTERFACE_COMPILE_OPTIONS ${OpenMP_CXX_FLAGS}) set_property(TARGET OpenMP::OpenMP_CXX PROPERTY INTERFACE_LINK_LIBRARIES ${OpenMP_CXX_FLAGS} Threads::Threads) endif() target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX) ``` 上述代码首先检查是否已经存在 `OpenMP::OpenMP_CXX` 目标,如果不存在,则手动创建一个接口库,并设置编译选项和链接库[^1]。 ### 处理链接器错误 若在链接阶段仍然遇到 `undefined reference` 错误,可能是因为 OpenMP 的链接标志未正确传递给链接器。在这种情况下,可以尝试将 `${OpenMP_CXX_FLAGS}` 直接添加到 `target_link_libraries` 中: ```cmake target_link_libraries(MyTarget PUBLIC ${OpenMP_CXX_FLAGS} Threads::Threads) ``` 这种方式确保了 OpenMP 的编译和链接标志都被正确应用[^2]。 ### 其他常见问题 - **检查编译器支持**:确保使用的编译器支持 OpenMP,并且已启用相应的 OpenMP 标志(如 `-fopenmp`)。 - **安装 OpenMP 开发库**:在某些系统上,可能需要手动安装 OpenMP 的开发库,例如在 Ubuntu 上可以通过 `sudo apt-get install libomp-dev` 安装。 - **验证 CMake 输出**:查看 CMake 配置输出,确认是否成功找到 OpenMP。如果输出中显示 `Found OpenMP: TRUE`,则表示 OpenMP 已被正确识别[^3]。 ### 示例 CMakeLists.txt 以下是一个完整的 `CMakeLists.txt` 示例,适用于 CMake 3.9 及以上版本: ```cmake cmake_minimum_required(VERSION 3.9) project(MyOpenMPProject) find_package(OpenMP REQUIRED) add_executable(MyTarget main.cpp) target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX) ``` 对于 CMake 3.8 及以下版本,可以使用以下替代方案: ```cmake cmake_minimum_required(VERSION 3.5) project(MyOpenMPProject) find_package(Threads REQUIRED) if(NOT TARGET OpenMP::OpenMP_CXX) add_library(OpenMP::OpenMP_CXX IMPORTED INTERFACE) set_property(TARGET OpenMP::OpenMP_CXX PROPERTY INTERFACE_COMPILE_OPTIONS -fopenmp) set_property(TARGET OpenMP::OpenMP_CXX PROPERTY INTERFACE_LINK_LIBRARIES -fopenmp Threads::Threads) endif() add_executable(MyTarget main.cpp) target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值