`
yidongkaifa
  • 浏览: 4059956 次
文章分类
社区版块
存档分类
最新评论

OpenMP编程学习笔记二

 
阅读更多

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的关键。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics