https://blog.csdn.net/gengshenghong/java/article/details/7000979
-
parallel for后面是不需要{}
-
parallel如果忘记跟for就不是COUNT个任务分配给8个线程而是每个线程COUNT个任务,如下
(1)静态调度static:
对于schedule(static,size)的含义,OpenMP会给每个线程分配size次迭代计算。这个分配是静态的,“静态”体现在这个分配过程跟实际的运行是无关的,可以从逻辑上推断出哪几次迭代会在哪几个线程上运行。具体而言,对一个threadnum*size次的for循环迭代,使用threadnum个线程,那么,[0,size-1]的size次的迭代是在第一个线程上运行,[size, size + size -1]是在第二个线程上运行,依次类推。不会因为线程启动的快慢而改变执行的位置。
#include<stdio.h>
#include <omp.h>
#define COUNT 4*3
int main()
{
#pragma omp parallel for schedule(static,4)
for(int i = 0;i < COUNT; i++)
{
printf("Thread: %d, Iteration: %d\n", omp_get_thread_num(), i);
}
return 0;
}
# g++ -fopenmp OMP.cpp -o a.out
# fopenmp是cpp的库,所以要g++
# ./a.out
Thread: 1, Iteration: 4
Thread: 1, Iteration: 5
Thread: 1, Iteration: 6
Thread: 1, Iteration: 7
Thread: 0, Iteration: 0
Thread: 0, Iteration: 1
Thread: 0, Iteration: 2
Thread: 0, Iteration: 3
Thread: 2, Iteration: 8
Thread: 2, Iteration: 9
Thread: 2, Iteration: 10
Thread: 2, Iteration: 11
(2)动态调度dynamic
对于dynamic,没有size参数的情况下,每个线程按先执行完先分配的方式执行1次循环,比如,刚开始,线程1先启动,那么会为线程1分配一次循环开始去执行(i=0的迭代),然后,可能线程2启动了,那么为线程2分配一次循环去执行(i=1的迭代),假设这时候线程0和线程3没有启动,而线程1的迭代已经执行完,可能会继续为线程1分配一次迭代,如果线程0或3先启动了,可能会为之分配一次迭代,直到把所有的迭代分配完。所以,动态分配的结果是无法事先知道的,因为我们无法知道哪一个线程会先启动,哪一个线程执行某一个迭代需要多久等等,这些都是取决于系统的资源、线程的调度等等。
dynamic也可以有一个size参数,size表示,每次线程执行完(空闲)的时候给其一次分配的迭代的数量,如果没有知道size(上面的分析),那么每次就分配一个迭代。有了前面的理解,这个size的含义是很容易理解的了。
#include<stdio.h>
#include <omp.h>
#define COUNT 4*3
int main()
{
#pragma omp parallel for schedule(dynamic)
for(int i = 0;i < COUNT; i++)
{
printf("Thread: %d, Iteration: %d\n", omp_get_thread_num(), i);
}
return 0;
}
# g++ -fopenmp OMP.cpp -o a.out
# 因为i5-8代是四核八线程,所以分配了8个线程
Thread: 4, Iteration: 6
Thread: 4, Iteration: 8
Thread: 4, Iteration: 9
Thread: 4, Iteration: 10
Thread: 4, Iteration: 11
Thread: 6, Iteration: 4
Thread: 2, Iteration: 3
Thread: 3, Iteration: 7
Thread: 5, Iteration: 5
Thread: 0, Iteration: 2
Thread: 7, Iteration: 0
Thread: 1, Iteration: 1
(3)guided调度
类似于动态调度,但每次分配的循环次数不同,开始比较大,以后逐渐减小。size表示每次分配的迭代次数的最小值,由于每次分配的迭代次数会逐渐减少,较少到size时,将不再减少。如果不知道size的大小,那么默认size为1,即一直减少到1。
(4)runtime
runtime表示根据环境变量确定上述调度策略中的某一种,默认也是静态的(static)。
控制schedule环境变量的是OMP_SCHEDULE环境变量,其值和上面的三中类型一样了,比如:
setenv OMP_SCHEDULE “dynamic, 5”
就是schedule(dynamic,5)的含义了。
网友评论