[转]OpenMP并行程序设计(一)

flowersmokes122 2007-06-20 10:21:29
OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。

在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“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的具体指令和用法。
...全文
798 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhang_1985_2004 2009-03-03
  • 打赏
  • 举报
回复
跟着学习了!
behappy373 2009-02-27
  • 打赏
  • 举报
回复
学习。。
intel_jeff 2009-01-07
  • 打赏
  • 举报
回复
可以参考我写的文章:
【系列讲座】OpenMP 入门
attop 2009-01-02
  • 打赏
  • 举报
回复
很好啊,需要的就是这种简单的例子!
noon1252 2008-12-20
  • 打赏
  • 举报
回复
学习啦,3ks
redex 2007-07-27
  • 打赏
  • 举报
回复
up.
Simore 2007-07-24
  • 打赏
  • 举报
回复
OpenMP并行程序设计(二)
参见:http://community.csdn.net/Expert/topic/5610/5610292.xml?temp=.1807978
是是非非 2007-07-24
  • 打赏
  • 举报
回复
to superyys

楼主只是举个例子而已……
superyys 2007-07-24
  • 打赏
  • 举报
回复
i = 0
i = 5
i = 1
i = 6
i = 2
i = 7
i = 3
i = 8
i = 4
i = 9
这样的运行结果还正确吗?这样的结果让我无法接受.
我觉得
for (int i = 0; i < 100000000; i++)
{
a = i+1;
}
是一个原子的,不可分割的
jtg98g3 2007-07-24
  • 打赏
  • 举报
回复
学习。

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧