- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OpenMP应用基础
OpenMP基础
一、OpenMP简单实例
在VC中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。接下来看一个简单的使用了OpenMP程序
int main(int argc, char* argv[])
{
#pragma omp parallel for
???? for (int i = 0; i 10; i++ )
???? {
???????? printf(i = %d\n, i);
???? }
???? return 0;
}
这个程序执行后打印出以下结果:
i = 0
i = 5
i = 1
i = 6
i = 2
i = 7
i = 3
i = 8
i = 4
i = 9
可见for 循环语句中的内容被并行执行了。(每次运行的打印结果可能会有区别)
这里要说明一下,#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。
有关#pragma omp parallel for 这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。
将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。下面就一个简单的测试程序来:
void test()
{
???? int a = 0;
???? clock_t t1 = clock();
???? for (int i = 0; i 100000000; i++)
???? {
???????? a = i+1;
???? }
???? clock_t t2 = clock();
???? printf(Time = %d\n, t2-t1);
}int main(int argc, char* argv[]){
???? clock_t t1 = clock();
#pragma omp parallel for
???? for ( int j = 0; j 2; j++ ){
???????? test();
???? }
???? clock_t t2 = clock();
???? printf(Total time = %d\n, t2-t1);
???? test();
???? return 0;
}在test()函数中,执行了1亿次循环,主要是用来执行一个长时间的操作。
在main()函数里,先在一个循环里调用test()函数,只循环2次,看一下在双核CPU上的运行结果吧:
Time = 297
Time = 297
Total time = 297
Time = 297
可以看到在for循环里的两次test()函数调用都花费了297ms, 但是打印出的总时间却只花费了297ms,后面那个单独执行的test()函数花费的时间也是297ms,可见使用并行计算后效率提高了整整一倍。
二、OpenMP并行程序设计
1、fork/join并行执行模式的概念
OpenMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的。
从上中我们也可以发现OpenMP并行执行的程序要全部结束后才能执行后面的非并行部分的代码。这就是标准的并行模式 fork/join式并行模式,共享存储式并行程序就是使用fork/join式并行的。
标准并行模式执行代码的基本思想是程序开始时只有一个主线程,程序中的串行部分都由主线程执行,并行的部分是通过派生其他线程来执行,但是如果并行部分没有结束时是不会执行串行部分的,如上一篇文章中的以下代码:
int main(int argc, char* argv[])
{
???? clock_t t1 = clock();
#pragma omp parallel for
???? for ( int j = 0; j 2; j++ ){
???????? test();
???? }
???? clock_t t2 = clock();
???? printf(Total time = %d\n, t2-t1);
???? test();
???? return 0;
}
需要注意的是:在没有执行完for循环中的代码之前,后面的clock_t t2 = clock();这行代码是不会执行的,如果和调用线程创建函数相比,它相当于先创建线程,并等待线程执行完,所以这种并行模式中在主线程里创建的线程并没有和主线程并行运行。2、OpenMP指令和库函数介绍
下面来介绍Op
文档评论(0)