2205-omp2tbb开发笔记
Version 0.0
omp2tbb
2022-05-04 开发测试
整理 OpenMP 5.2 导语
制作测试集合,用来测试各种导语的 LLVM-openmp 对应的导语。
首先位于上层的接口是:
LLVM OMP Stmt
| LLVM OPENMPIR | OMP CLAUSE | Care?(Y/N) |
|---|---|---|
| OMPParallelDirective | pragma omp parallel | Y |
| OMPSimdDirective | pragma omp simd | Y |
| OMPForDirective | pragma omp for | Y |
| OMPForSimdDirective | pragma omp for simd | |
| OMPSectionsDirective | pragma omp sections | Y |
| OMPSectionDirective | pragma omp section | Y |
| OMPSingleDirective | pragma omp single | Y |
| OMPMasterDirective | pragma omp master | Y |
| OMPCriticalDirective | pragma omp critical | Y |
| OMPParallelForDirective | pragma omp parallel for | |
| OMPParallelForSimdDirective | pragma omp parallel for simd | |
| OMPParallelMasterDirective | pragma omp parallel master | |
| OMPParallelSectionsDirective | pragma omp parallel sections | |
| OMPTaskDirective | pragma omp task | |
| OMPTaskyieldDirective | pragma omp taskyield | |
| OMPBarrierDirective | pragma omp barrier | |
| OMPTaskwaitDirective | pragma omp taskwait | |
| OMPTaskgroupDirective | pragma omp taskgroup | |
| OMPFlushDirective | pragma omp flush | |
| OMPDepobjDirective | pragma omp depobj | |
| OMPOrderedDirective | pragma omp ordered | |
| OMPAtomicDirective | pragma omp atomic | |
| OMPTargetDirective | pragma omp target | |
| OMPTargetDataDirective | pragma omp target data | |
| OMPTargetEnterDataDirective | pragma omp target enter data | |
| OMPTargetExitDataDirective | pragma omp target exit data | |
| OMPTargetParallelDirective | pragma omp target parallel | |
| OMPTargetParallelForDirective | pragma omp target parallel for | |
| OMPTeamsDirective | pragma omp teams | |
| OMPCancellationPointDirective | pragma omp cancellation point | |
| OMPCancelDirective | pragma omp cancel | |
| OMPTaskLoopDirective | pragma omp taskloop | |
| OMPTaskLoopSimdDirective | pragma omp taskloop simd | |
| OMPMasterTaskLoopDirective | pragma omp master taskloop | |
| OMPMasterTaskLoopSimdDirective | pragma omp master taskloop simd | |
| OMPParallelMasterTaskLoopDirective | pragma omp parallel master taskloop | |
| OMPParallelMasterTaskLoopSimdDirective | pragma omp parallel master taskloop simd | |
| OMPDistributeDirective | pragma omp distribute | |
| OMPTargetUpdateDirective | pragma omp target update | |
| OMPDistributeParallelForDirective | pragma omp distribute parallel for | |
| OMPDistributeParallelForSimdDirective | pragma omp distribute parallel for simd | |
| OMPDistributeSimdDirective | pragma omp distribute simd | |
| OMPTargetParallelForSimdDirective | pragma omp target parallel for simd | |
| OMPTargetSimdDirective | pragma omp target simd | |
| OMPTeamsDistributeDirective | pragma omp teams distribute | |
| OMPTeamsDistributeSimdDirective | pragma omp teams distribute simd | |
| OMPTeamsDistributeParallelForSimdDirective | pragma omp teams distribute parallel for simd | |
| OMPTeamsDistributeParallelForDirective | pragma omp teams distribute parallel for | |
| OMPTargetTeamsDirective | pragma omp target teams | |
| OMPTargetTeamsDistributeDirective | pragma omp target teams distribute | |
| OMPTargetTeamsDistributeParallelForDirective | pragma omp target teams distribute parallel for | |
| OMPTargetTeamsDistributeParallelForSimdDirective | pragma omp target teams distribute parallel for simd | |
| OMPTargetTeamsDistributeSimdDirective | pragma omp target teams distribute simd | |
| OMPTileDirective | pragma omp tile | |
| OMPUnrollDirective | pragma omp unroll | |
| OMPScanDirective | pragma omp scan | |
| OMPInteropDirective | pragma omp interop | |
| OMPDispatchDirective | pragma omp dispatch | |
| OMPMaskedDirective | pragma omp masked | |
| OMPMetaDirective | pragma omp metadirective | |
| OMPGenericLoopDirective | pragma omp loop | |
| OMPTeamsGenericLoopDirective | pragma omp teams loop | |
| OMPTargetTeamsGenericLoopDirective | pragma omp target teams loop | |
| OMPParallelGenericLoopDirective | pragma omp parallel loop | |
| OMPTargetParallelGenericLoopDirective | pragma omp target parallel loop |
作为最上层的识别层,之后下一层的是:
LLVM Decl
| LLVM OpenMP Decl | openmp decl | Care?(Y/N) |
|---|---|---|
| OMPAllocatorClause | allocator | |
| OMPAlignClause | align | |
| OMPAllocateClause | allocate | |
| OMPIfClause | if | |
| OMPFinalClause | final | |
| OMPNumThreadsClause | num_threads | |
| OMPSafelenClause | safelen | |
| OMPSimdlenClause | simdlen | |
| OMPSizesClause | sizes | |
| OMPCollapseClause | collapse | |
| OMPDefaultClause | default | |
| OMPProcBindClause | proc_bind | |
| OMPUnifiedAddressClause | unified_address | |
| OMPUnifiedSharedMemoryClause | unified_shared_memory | |
| OMPReverseOffloadClause | reverse_offload | |
| OMPDynamicAllocatorsClause | dynamic_allocators | |
| OMPAtomicDefaultMemOrderClause | atomic_default_mem_order | |
| OMPScheduleClause | schedule | |
| OMPOrderedClause | ordered | |
| OMPNowaitClause | nowait | |
| OMPUntiedClause | untied | |
| OMPMergeableClause | mergeable | |
| OMPReadClause | read | |
| OMPWriteClause | write | |
| OMPUpdateClause | update | |
| OMPCaptureClause | capture | |
| OMPCompareClause | compare | |
| OMPSeqCstClause | seq_cst | |
| OMPAcqRelClause | acq_rel | |
| OMPAcquireClause | acquire | |
| OMPReleaseClause | release | |
| OMPRelaxedClause | relaxed | |
| OMPPrivateClause | private | |
| OMPFirstprivateClause | firstprivate | |
| OMPLastprivateClause | lastprivate | |
| OMPSharedClause | shared | |
| OMPReductionClause | reduction | |
| OMPTaskReductionClause | task_reduction | |
| OMPInReductionClause | in_reduction | |
| OMPLinearClause | linear | |
| OMPAlignedClause | aligned | |
| OMPCopyinClause | copyin | |
| OMPCopyprivateClause | copyprivate | |
| OMPFlushClause | flush | |
| OMPDepobjClause | depobj | |
| OMPDependClause | depend | |
| OMPDeviceClause | device | |
| OMPThreadsClause | threads | |
| OMPSIMDClause | simd | |
| OMPMapClause | map | |
| OMPNumTeamsClause | num_teams | |
| OMPThreadLimitClause | thread_limit | |
| OMPPriorityClause | priority | |
| OMPGrainsizeClause | grainsize | |
| OMPNogroupClause | nogroup | |
| OMPNumTasksClause | num_tasks | |
| OMPHintClause | hint | |
| OMPDistScheduleClause | dist_schedule | |
| OMPDefaultmapClause | defaultmap | |
| OMPToClause | to | |
| OMPFromClause | from | |
| OMPUseDevicePtrClause | use_device_ptr | |
| OMPUseDeviceAddrClause | use_device_addr | |
| OMPIsDevicePtrClause | is_device_ptr | |
| OMPHasDeviceAddrClause | has_device_ptr | |
| OMPNontemporalClause | nontemporal | |
| OMPOrderClause | order | |
| OMPInitClause | init | |
| OMPUseClause | use | |
| OMPDestroyClause | destroy | |
| OMPNovariantsClause | novariants | |
| OMPNocontextClause | nocontext | |
| OMPDetachClause | detach | |
| OMPInclusiveClause | inclusive | |
| OMPExclusiveClause | exclusive | |
| OMPUsesAllocatorsClause | uses_allocators | |
| OMPAffinityClause | affinity | |
| OMPFilterClause | filter | |
| OMPBindClause | bind |
属实有点多,目前位置我们的目标是:
对于 OpenMP 的代码块,我们识别出”最上层的逻辑块”,之后将其提取成为新的函数。
对于包含了 OpenMP 的函数块,我们也将其提取成”新函数”。
我们给新的函数命名,之后进行我们的代码翻译工作。
首先第一步工作是将并行代码串行化。
Development Step 1
- [x] 构建可以识别 Stmt 的 Visitor
- [x] 构建可以识别 OpenMP Directive 的 Visitor ✅ 2022-05-05
- [x] 找出 OpenMP Directive 的范围,从而找出新的范围 ✅ 2022-05-05
记录:
这里遇到一个非常大的坑点,使用 libclang 开发的工具需要加 — -fopenmp 才能启用编译选项
- [x] 详细构建 Openmp 的树形结构
Development Step 0
OpenMP Examples Build
顺着 openmp 官方的 example 文档构建 openmp 的并行例子。从而方便我们做之后的优化分析。
例子构建
- [x] 测试时间工具部署 ✅ 2022-05-11
- [x] 阅读 Structured Programming Models
分为两类:
- 构建 bottom 类别
- 从底层方案出发
- 构建 top 类别
- 从上层方案出发
目标:
- 充分发挥 omp5.2 的特性
- 使用 omp task 、parallel、for 方便之后进行检测和转化
- 熟悉 intel tbb 的具体操作和语法
思路!!
产生了新的想法:
- 如果分析了数据访问的行为模式,分析一维/二维/三维的模式特征
- 整数泛函
- NLP 分析表达式特征
- 为函数/openmp 代码快称重
- 是否有必要 inline
- 是否有必要并行
- NLP?
- 试一试,生成这个模式的 inline/noinline 代码
- 针对多重循环
- 针对随机离散的应用
- ising model
- 2 维图片随机的处理
- SPH
- Conway 生命游戏
已经成功构建 bottom cases。位于
https://github.com/Chivier/ompfuns
Develop Step 1
测试代码重写。找到一个合适的例子:
upc2c
2205-omp2tbb开发笔记
http://blog.chivier.site/2022-07-01/2022/2205-omp2tbb开发笔记/