liunx 下OpenMP

  由于项目需要,这两天在捣鼓OpenMP的加速,现总结下:

含OpenMP的Cmakelist.txt

find_package(OpenMP REQUIRED)                                                    # configure
if (OpenMP_FOUND)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    SET(CMAKE_C_FLAGS "${CMAKE__FLAGS} ${OpenMP__FLAGS}")
    MESSAGE("OpenMP FOUND")
endif ()

add_executable(project_name main.cpp)                                         # 在可执行文件中添加OpenMP 库
target_link_libraries( project_name ${OpenMP_LIBS} -fopenmp )

基本API的尝试

        OpenMP 的指令分两种: 编译指导指令, 如  #pragma omp parallel for
                           运行时库函数, 如  #omp_get_thread_num() 

parallel

# pragma omp parallel [clause . . .] newline 
                    if (scalar_expression)
                     private (list)
                     shared (list)
                     default (shared | none)
                     firstprivate (list)
                     reduction (operator: list)
                     copyin (list)
                     num_threads(integer-expression)
structured_block

# parallel 指定一块并行区域;
# parallel 是否并行由 if()来决定
# 对该并行区域分配的线程数 由一下指令来决定:
            1. num_thread              # pragma omp parallel num_threads(4)
            2. omp_set_num_thread(4)   #   omp_set_num_thread(4)    我的程序中12线程比4线程要慢很多,看到有的文章说 最佳线程是4~8之间.多个线程之间存在数据之间的倒腾,浪费时间.
                                           pragma omp parallel
            3. OMP_NUM_THREADS  (环境变量设置)
            
            级别依次降低

for

形式一:

# pragma omp parallel for 
 for()                                          #只能一个for

形式二:

# pragma omp parallel 
{
  # pragma omp for 
    for ()                                      # 可以有多个for
}
参数功能示例
signal对于parallel标识的并行块,通过需要多个线程进行处理,若需将该并行块内部某段代码用单个线程运行# pragma omp parallel for { # pragma omp signal {} }
master对于parallel标识的并行块,通过需要多个线程进行处理,若需将该并行块内部某段代码用主线程运行# pragma omp parallel for { # pragma omp master {} }
critical对操作共享变量的代码段做同步标识# pragma omp parallel for { # pragma omp critical {} }

sections

# pragma omp [parallel] sections [子句]
{
  #pragma omp sections
  {
  "
     代码块
  "
  }
  
  #pragma omp sections
  {
  "
     代码块
  "
  }

  ........
}
1.sections 之间是串行的: 主线程把第一个sections 之间的section 都执行完了,再执行下一个sections
2.没加 parallel 的sections里面的section是串行的 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值