由于项目需要,这两天在捣鼓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是串行的