1.OpenMP 基本概念OpenMP是一种用于共享内存并行系统的多线程程序设计方案支持的编程语言包括C、C和Fortran。OpenMP提供了对并行算法的高层抽象描述特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令自动将程序并行处理使用OpenMP降低了并行编程的难度和复杂度。当编译器不支持OpenMP时程序会退化成普通串行程序。程序中已有的OpenMP指令不会影响程序的正常编译运行。2. OpenMP 执行模式OpenMP采用fork-join的执行模式。开始的时候只存在一个主线程当需要进行并行计算的时候派生出若干个分支线程来执行并行任务。当并行代码执行完成之后分支线程会合并把控制流程交给单独的主线程。一个典型的fork-join执行模型的示意图如下3. OpenMP的指令OpenMP的指令有以下一些常用的已标黑parallel用在一个代码段之前表示这段代码将被多个线程并行执行for用于for循环之前将循环分配到多个线程中并行执行必须保证每次循环之间无相关性。parallel forparallel和for语句的结合也是用在一个for循环之前表示for循环的代码将被多个线程并行执行sections用在可能会被并行执行的代码段之前parallel sectionsparallel和sections两个语句的结合critical用在一段代码临界区之前single用在一段只被单个线程执行的代码段之前表示后面的代码段将被单线程执行flush用以标记一个同步点用以确保所有的线程看到一致的存储器视图barrier用于并行区内代码的线程同步所有线程执行到barrier时要停止直到所有线程都执行到barrier时才继续往下执行atomic用于指定一块内存区域被制动更新master用于指定一段代码块由主线程执行ordered用于指定并行区域的循环按顺序执行threadprivate用于指定一个变量是线程私有的4. 安装安装libgomp1包sudo apt install libgomp1安装libomp-dev包sudo apt install libomp-dev5. CMakeLists.txt编写find_package(OpenMP REQUIRED) target_link_libraries({project_name} OpenMP::OpenMP_CXX)6. 使用6.1. parallel#include iostream #include omp.h using namespace std; int main(int argc, char **argv) { //设置线程数一般设置的线程数不超过CPU核心数这里开4个线程执行并行代码段 omp_set_num_threads(4); #pragma omp parallel { cout Hello , I am Thread omp_get_thread_num() endl; } }输出Hello, I am Thread 1Hello, I am Thread 0Hello, I am Thread 2Hello, I am Thread 3可以看到OpenMP自动用4个线程调用了代码。6.2. parallel用于for循环#include iostream #include omp.h using namespace std; int main() { omp_set_num_threads(4); #pragma omp parallel for (int i 0; i 3; i) { printf(i %d, I am Thread %d\n, i, omp_get_thread_num()); } getchar(); }输出i 0, I am Thread 0i 1, I am Thread 0i 2, I am Thread 0i 0, I am Thread 0i 0, I am Thread 0i 0, I am Thread 0i 1, I am Thread 0i 2, I am Thread 0i 1, I am Thread 0i 2, I am Thread 0i 1, I am Thread 0i 2, I am Thread 06.2. parallel for用于for循环#include iostream #include omp.h using namespace std; int main() { omp_set_num_threads(4); #pragma omp parallel for for (int i 0; i 3; i) { printf(i %d, I am Thread %d\n, i, omp_get_thread_num()); } getchar(); }输出i 0, I am Thread 0i 1, I am Thread 1i 2, I am Thread 2参考文献OpenMP并行开发C - 知乎OpenMP简介_copenmp_longji的博客-CSDN博客OpenMP用法大全个人整理版-CSDN博客