编译制导函数
for
加大并行力度,尽量并行外层循环
在外层循环上用parallel,内层用for,并同时注意同步
#prapma omp parallel
{
#pragma omp for
for(){
// 循环体内不能使用break语句
}
}
#pragma omp parallel for
for 后可以用 nowait 取消结束的隐式同步
simd
#pragma omp parallel for simd reduction(+:ret)
for(int i=0; i<num; i++){
ret += a[i]*a[i];
}
task
解决递归问题
eg.并行化处理Fibonacci数
taskwait 用于 task 构造之后,用于等待前面一个or多个task执行完成
#pragma omp task
#pragma omp taskwait
#pragma omp taskyield
sections / section
划分段,每段由一个线程执行
section后可以用 nowait 取消结束的隐式同步
#pragam omp parallel sections
{
#pragma omp section
{
}
#pragma omp section
{
}
}
single
#pragam omp single
{
}
barrier
#pragma omp barrier
critical
临界区
#pragma omp critical
{
}
atomic
原子操作
只作用到在 ±*/ &^| >> <<
#pragme omp atomic
常用子句
collapse
一般用于同时线程化两层循环(外层easy)
#pragam omp parallel for callapse(2)
for( )
for( )
reduction
归约
#pragma omp parallel for reduction(+:PI)
schedule
指定采用的负载均衡策略及每次分发数据大小
#pragma omp parallel for schedule(dynamic, 2)
if
确定是否并行
普通函数
总线程数
int omp_get_num_threads(void);
设置线程数
void omp_set_threads(int num);
上限线程
int omp_get_max_threads(void);
线程索引
int omp_get_thread_num(void);
是否并行
int omp_in_parallel();
锁函数
环境变量
export OMP_PROC_BIND = true