Date: 2016-02-22
Author: kagula
Environment:
[1]Core i7-4790K
[2]Win10-64bits
[3]VS2013 Update5
[4]GCC 4.4.7(CentOS 6.5自带)
Prologue:
OpenMP适合单机多核cpu,使用非常方便。 多种主流编译器中VS2013支持的OpenMP版本最低,
虽然VS只支持到2.0,不过已经能满足需要。
一个“#pragma omp”statement指示随后的一个code block由OpenMP管理。
第一个OpenMP程序
第一步:
[S1]
新建新的Win32 Console project with empty。
[S2]修改编译器选项
[Property Pages dialog box]->[Configuration Properties]->[C/C++]->
[Language property page]->[OpenMP Support]
[S3]源代码清单
#include
#include
using namespace std;
int main()
{
cout << "处理器个数(含逻辑处理器)=>" << omp_get_num_procs() << endl;
//omp关键词,表示随后的代码块由OpenMP负责管理。
//paragma中的for,表示对for循环并行化.
#pragma omp parallel for
for (int i = 0; i < 10; i++)
{
//core i7-4790k下可以看到for中的block被分配到0~7号不同的线程中分别运行。
//这里共有8根线程,因为我们的core i7-4790k CPU有8个逻辑处理器。
cout << "线程ID: " << omp_get_thread_num() << endl;
}
std::cout << "press any key to continue show next demo." << std::endl;
cin.get();
int sum = 0;
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//对for代码块中的sum变量进行线程保护
//reduction关键词 只支持 +,-,*,&,|,&&,|| 这些运算符号
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < 10; i++)
{
sum = sum + a[i];
}
std::cout << "sum: " << sum << std::endl;
cin.get();
return 0;
}
第二个OpenMP程序
对代码块进行线程保护
源代码清单如下:
#include
using namespace std;
int main(){
int max = 0;
int a[10] = { 11, 2, 33, 49, 113, 20, 321, 250, 689, 16 };
#pragma omp parallel for
for (int i = 0; i < 10; i++)
{
//多根线程会同时调用下面的代码行。
int temp = a[i];
//critical关键词让下面的代码块受到了线程保护。
//即下面的代码块,只有在一根线程执行完毕后,另一根线程才能运行。
#pragma omp critical
{
if (temp > max)
max = temp;
}
}
cout << "max: " << max << std::endl;
cin.get();
return 0;
}
第三个OpenMP程序
omp block中有“并行、串行、并行...”。
源代码清单如下
#include
#include
using namespace std;
int main()
{
int a[5], i;
#pragma omp parallel
{
// Perform some computation.
#pragma omp for
for (i = 0; i < 5; i++)
a[i] = i * i;
// Print intermediate results.
// specifies a structured block that is executed by the master thread of the team
// Other threads in the team do not execute the associated structured block.
#pragma omp master
for (i = 0; i < 5; i++)
cout << "a[" << i << "]=" << a[i] << endl;;
// Wait all OpenMP threads done.
#pragma omp barrier
// Continue with the computation.
#pragma omp for
for (i = 0; i < 5; i++)
a[i] += i;
}
cout << endl << endl;
for (i = 0; i < 5;i++)
{
cout << "a[" << i << "]=" << a[i] << endl;
}
cin.get();
}
第四个OpenMP程序
多个不同内容的代码段同时运行
#include
#include
using namespace std;
int main(){
#pragma omp parallel sections
{
#pragma omp section
{
cout << "fucntion 1" << endl;
}
#pragma omp section
{
cout << "fucntion 2" << endl;
}
#pragma omp section
{
cout << "fucntion 3" << endl;
}
#pragma omp section
{
cout << "fucntion 4" << endl;
}
}
cin.get();
return 0;
}
在CentOS下编译和运行
g++
-fopenmp main.cpp
./a.out
参考资料
[1]OpenMP Compilers支持情况
http://openmp.org/wp/openmp-compilers/
[2]OpenMP in Visual C++
里面介绍了OpenMP其它关键词
https://msdn.microsoft.com/en-us/library/tt15eb9t(v=vs.120).aspx