# openMP settings
FIND_PACKAGE(OpenMP REQUIRED)
if (OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif ()
parallel制导命令表示接下来由花括号括起来的区域将创建多个线程并行执行。可以用num_threads子句来控制线程的个数,如下:
#include <iostream>
#include <stdio.h>
#include "omp.h"
static omp_lock_t lock_use;
int main()
{
omp_init_lock(&lock_use); // 初始化互斥锁
omp_set_lock(&lock_use); //获得互斥器
#pragma omp parallel num_threads(4)
for (int i = 0; i < 3; i++)
printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
omp_unset_lock(&lock_use); //释放互斥器
omp_destroy_lock(&lock_use); //销毁互斥器
return -1;
}
i = 0, I am Thread 0
i = 1, I am Thread 0
i = 0, I am Thread 3
i = 1, I am Thread 3
i = 2, I am Thread 3
i = 0, I am Thread 2
i = 1, I am Thread 2
i = 2, I am Thread 2
i = 0, I am Thread 1
i = 1, I am Thread 1
i = 2, I am Thread 1
i = 2, I am Thread 0
接下来将解锁一个常用的制导命令 for,直接将你的for循环体提升n倍!在并行域里面用以下命令,在这条语句之后的一个for循环语句中每一个要循环的任务将被分配给不同的线程去执行。
#pragma omp for
例如:
#include<omp.h>
#include<iostream>
using namespace std;
int main()
{
omp_set_num_threads(4);
#pragma omp parallel
{
#pragma omp for
for(int i=0;i < 4;i++)
cout << omp_get_thread_num() << endl;
}
}