VS2010中进行OpenMP并行程序设计

OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。
 
在VS2010中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。
 
先看一个简单的使用了OpenMP程序
#include "stdafx.h"
#include<cstdlib>
int _tmain(int argc, _TCHAR* argv[])
{
 #pragma omp parallel for
     for (int i = 0; i < 10; i++ )
     {
         printf("i = %d\n", i);
     }
  system("pause");
 return 0;
}
这个程序执行后打印出以下结果:
i = 0
i = 1
i = 2
i = 8
i = 9
i = 3
i = 4
i = 5
i = 6
i = 7
请按任意键继续. . .
 
可见for 循环语句中的内容被并行执行了。(每次运行的打印结果可能会有区别)
这里要说明一下,#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。
 
有关#pragma omp parallel for 这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。
 
 将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。下面就写一个简单的测试程序来测试一下:
 
// openmp_test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<cstdlib>
#include <time.h>
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();
 system("pause");
 return 0;
}
在test()函数中,执行了1亿次循环,主要是用来执行一个长时间的操作。
在main()函数里,先在一个循环里调用test()函数,只循环2次,我们还是看一下在双核CPU上的运行结果吧:
Time = 237
Time = 239
Total time = 241
Time = 232
请按任意键继续. . .
 
可以看到在for循环里的两次test()函数调用都花费了~230ms, 但是打印出的总时间却只花费了~240ms,后面那个单独执行的test()函数花费的时间也是~230ms,可见使用并行计算后效率提高了整整一倍。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值