编译制导是对程序设计语言的扩展。通过对串行程序添加制导语句实现并行化。
编译制导语句由下列几部分组成:
- 制导标识符 ( #pragma omp )
- 制导名称(parallel,for,section等)
- 子句(private, shared, reduction, copyin等)
并行域制导
一个并行域就是一个能被多个线程并行执行的程序段。在并行域结尾有一个隐式同步(barrier)。
for循环制导
#include <iostream>
#include <omp.h>
using namespace std;
int main(int argc, char* argv[]){
int max_threads = omp_get_max_threads();
int num_procs = omp_get_num_procs();
cout << "max threads: " << max_threads << " num procs: " << num_procs << endl;
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
int num = omp_get_num_threads();
int id = omp_get_thread_num();
cout << "thread " << id << " --> " << i << endl;
}
return 0;
}
注:#pragma omp parallel for
指令,它的创建线程的数量并不是由循环的迭代次数决定的,而是由OpenMP根据当前系统的配置和设置来确定的。一般来说,OpenMP会根据可用的CPU核心数量和其他因素来决定创建多少个线程来执行循环。线程和迭代之间可能并不是一一对应的,即一个线程可能执行多个迭代,或者多个线程可能合作执行一个迭代(这取决于循环的划分方式)。
要指明节点的进程数salloc -p com -N 1 -n 32,否则默认为1,并且n要小于等于节点cpu核心数. ---》omp_get_max_threads() ---》32
调度子句schedule
schedule
子句用于指定在并行循环中如何分配迭代给不同的线程。schedule
指令允许你控制迭代的分配方式,以优化性能或者满足特定需求。该子句给出迭代循环划分后的块大小和线程执行的块范围
标签:迭代,int,编译,omp,线程,子句,OpenMP,制导 From: https://www.cnblogs.com/tao-gak567/p/18064696