OpenMP 框架是使用 C、C++ 和 Fortran 进行并发编程的一种强大方法。GNU Compiler Collection (GCC) V4.2 支持 OpenMP 2.5 标准,而 GCC 4.4 支持最新的 OpenMP 3 标准。包括 Microsoft? Visual Studio 在内的其他编译器也支持 OpenMP。在本文中,您可以学习使用 OpenMP 编译指示 (pragma),寻找对 OpenMP 提供的一些应用程序编程接口 (API) 的 支持,并使用一些并行算法对 OpenMP 进行测试。本文将使用 GCC 4.2 作为首选编译器。
入门
OpenMP 的 一大特点就是您只需完成标准的 GCC 安装即可。支持 OpenMP 的程序必须使用 -fopenmp 选项进行编译。
您的第一 个 OpenMP 程序
让我们先从一个 Hello, World! 打印应用程序开始,它包括一个额外的编译指示。清单 1 显示了 相关代码。
清单 1. 使用了 OpenMP 的 Hello World 程序
#include <iostream> int main() { #pragma omp parallel { std::cout << "Hello World!\n"; } }
在使用 g++ 编译和运行清单 1 中的代码时,控制台中应该会显示一个 Hello, World!。现在,使用 -fopenmp 选项重 新编译代码。清单 2 显示了输出。
清单 2. 使用 -fopenmp 命令编译并运行代码
tintin$ g++ test1.cpp -fopenmp tintin$ ./a.out Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World!
发生了什么?#pragma omp parallel 仅在您指定了 -fopenmp 编译器选项后才会发挥作用。在编译 期间,GCC 会根据硬件和操作系统配置在运行时生成代码,创建尽可能多的线程。每个线程的起始例程为代码块中位于指令 之后的代码。这种行为是 隐式的并行化,而 OpenMP 本质上由一组功能强大的编译指示组成,帮您省去了编写大量样本文 件的工作。(为了进行比较,您需要了解使用 Portable Operating System Interface (POSIX) 线程 [pthreads] 实现您 刚才的程序将会怎样)。我使用的计算机运行的是 Intel? Core i7 处理器,有四个物理核心,每个核心有两个逻辑核心, 因此清单 2 的输出看上去非常合理(8 个线程 = 8 个逻辑核心)。
接下来,让我们详细了解并行编译指示。
使用 OpenMP 实现并行处理的乐趣
使用编译命令的 num_threads 参数控制线程的数量非常简单。下面显示 了 清单 1 中的代码,可用线程的数量被指定为 5(如 清单 3 所示)。
清单 3. 使用 num_threads 控制线程的数 量
#include <iostream> int main() { #pragma omp parallel num_threads(5) { std::cout << "Hello World!\n"; } }
这里没有使用 num_threads 方法,而是使用另一种方法来修改运行代码的线程的数量。这还会将我们带到您将要使用的 第一个 OpenMP API:omp_set_num_threads。在 omp.h 头文件中定义该函数。不需要链接到额外的库就可以获得 清单 4 中的代码,只需使用 -fopenmp。
清单 4. 使用 omp_set_num_threads 对线程的创建进行调优
#include <omp.h> #include <iostream> int main() { omp_set_num_threads(5); #pragma omp parallel { std::cout << "Hello World!\n"; } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索编译
, 编译器
, 标准
, 程序
, fortran
, openmp
支持
openmp 入门、spring框架入门、restful框架案例入门、ssh框架入门教程、java spring框架 入门,以便于您获取更多的相关知识。