运行命令:g++ -fopenmp xx.cpp -lgomp -lpthread -o xx.out
用例一:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void test (int n) {
for(int i = 0; i < 100000; ++i) {
}
printf("%d, ", n);
}
int main(int argc,char* argv[])
{
omp_set_num_threads(4); //设置线程数
#pragma omp parallel for
for(int i = 0; i < 100; ++i)
test( i );
}
用例二(转):
#include<iostream>
#include<omp.h>
#include<ctime>
using namespace std;
void test_omp(int times);
int main()
{
cout << omp_get_num_procs() << endl;
test_omp(1);
test_omp(2);
test_omp(4);
test_omp(9);
test_omp(17);
}
void test_omp(int times)
{
omp_set_num_threads(times);
printf("test get_num_threads result1: %d
", omp_get_num_threads());
printf("test get_num_procs result1: %d
", omp_get_num_procs());
clock_t start = clock();
#pragma omp parallel for
for (int i = 0; i < 20; i++)
{
if(i==0)
{
printf("test get_num_threads result2: %d
", omp_get_num_threads());
printf("test get_num_procs result1: %d
", omp_get_num_procs());
}
printf( "Hello from thread: No.%d
", omp_get_thread_num());
for (int j = 0; j < 1000000; j++)
{
double a = 1585876.058578545361;
for (int k = 0;k < 10;k++)
a *= a;
}
}
clock_t end = clock();
printf("%d threads para use time: %fs
", times, double((end - start)) / CLOCKS_PER_SEC);
}
OpenMP的环境变量:
环境变量
|
描述
|
示例
|
OMP_SCHEDULE
|
控制for循环任务分配结构的调度
|
OMP_SCHEDULE="guided,2"
|
OMP_NUM_THREADS
|
设置默认线程的个数
|
OMP_SCHEDULE=4
|
OpenMP的库函数
函数名称
|
描述
|
int omp_get_num_threads(void)
|
返回当前使用的线程个数,如果在并行区域外则返回1
|
int omp_set_num_threads(int i)
|
设置要使用的线程个数,它可以覆盖OMP_NUM_THREADS
|
int omp_get_thread_num(void)
|
返回当前线程号,0代表主线程
|
int omp_get_num_procs(void)
|
返回可用的处理核(处理器)个数,对于支持超线程技术的处理器被算作两个处理核
|
OpenMP的调度方案
调度类型
|
描述
|
static
|
将所有循环迭代划分成相等大小的块
|
dynamic
|
使用一个内部队列,当某线程可用时,为其分配由块大小所制定的一定数量的循环迭代
|
guided
|
与dynamic策略类似,但是块大小开始较大,后来逐步减小。可选参数chunk指定块大小的最小值,默认为1
|
runtime
|
运行时由OMP_SCHEDULE决定使用上面三种的哪种策略
|
OpenMP的编译
平台和编译器
|
命令
|
windows平台 intel C++编译器
|
icl /Qopenmp
|
linux平台 intel C++编译器
|
icl -openmp
|
gcc
|
gcc -fopenmp
|
_OPENMP宏可以用来判断OpenMP是否被支持,通过它可以写出任何C语言编译器(即使不支持OpenMP)都可以编译的代码。代码如下所示:
#ifdef _OPENMP
#include <omp.h>
#else
#define omp_get_thread_num() 0
#endif