OpenMP是帮助程序人员能够方便编写并行程序的一种解决方案,程序编写人员主要的任务还是放在问题的空间结构与逻辑结构上。如何能够使程序并行运行,是OpenMP解决的问题(算法问题)。
OpenMP是通过将任务分配到不同的线程上完成的。
1. 设置线程数目omp_set_num_threads() API。可以设置OpenMP能够控制的并行线程数目。一般情况下,该数目等于处理器核数。当然可以不等于。在使用OpenMP时,可以最先调用该API。如果不调用该API,可以使用num_threads() clause。
2. 最基本的并行处理:
2.1. #pragma omp parallel
#include <stdio.h>
#include <omp.h>
int main()
{
#pragma omp parallel
printf("OpenMP parallel threads test/n");
}
运行该代码,可以看见,"OpenMP parallel threads test“ 被输出的次数等于设置的thread的数目,也就是说,#pragma omp parallel之后的第一个代码块,将会分配给各个核去执行。可以改写上面的代码为:
#include <stdio.h>
#include <omp.h>
int main()
{
#pragma omp parallel
{
printf("OpenMP parallel threads test/n");
printf("OpenMP PARALLEL THREADS TEST/n");
}
}
虽然这个例子很简单,但它能够帮助理解OpenMP核心思想:将代码最终分配到不同的核(线程)上去运行。
2.2. #pragma omp parallel for
当在#pragma omp parallel 后增加for时,不再是将后面的代码段简单的交给不同的核去执行(这样的话,就没有必要这么多此一举),而是将for 循环这个整体循环任务交给不同的核去做。也就是说,每个核负责运行一部分循坏任务。这样,就可以加速循环处理,从而使得程序提高了时间方面的性能。OpenMP负责拆分for循环然后分配,有好几种不同的拆分算法。由于循环变量是由各个线程共享的,所以在多重循坏中,环变量如何保持同步,结果如何保持正确,是掌握for的关键。