多线程开发简易工具——OpenMP使用

最近有朋友问我tld感觉运行还是不够快,问我如何提升效率,我说用多线程,可是感觉很多编程人员认为这是个禁区,不敢涉足。但其实大家不用如此害怕,并行编程固然涉及很多系统运行机制的问题,搞不好可能会使程序崩溃,但OpenMP大大降低了并行开发的难度和复杂度。

具体使用也非常简单,不用安装任何辅助开发插件,只是在vs开发环境中简单配置一下,我这里使用的vs2008的中文版,只需如图设置,对应英文版应该是projects->properties->c++->language中的/OpenMP选项开启即可

多线程开发简易工具——OpenMP使用_第1张图片

接下来添加头文件#include <omp.h>,并在对应的并行代码前添加#pragma omp parallel for。一般需要并行运算的部分都是大量的循环操作。这里我试验选用for语句作为并行测试,所以#pragma omp parallel for语句都加在for语句的前面。这样就ok了,是不是真的很容易,神马,你还想要个例子,好吧,满足你,上一小段测试代码,测试一下程序的运行速度(由于出差,只能在自己的小本本测试一下,只有双核,很不给力,如果大家电脑配置够好,测试结果应该更暴力一些)

[cpp] view plain copy print ?
  1. #include <omp.h>   
  2. #include <stdio.h>   
  3. #include <stdlib.h>   
  4. #include <opencv2/core/core.hpp>   
  5.   
  6. using namespace cv;  
  7.   
  8. void Test (int n)  
  9. {  
  10.     for(int i = 0; i < 10000; i++)  
  11.     {  
  12.         for (int j=0; j<10000; j++)  
  13.         {  
  14.             //do nothing, just waste time   
  15.         }  
  16.     }  
  17.     printf("%d, ", n);  
  18. }  
  19.   
  20. void main(void)  
  21. {  
  22.     double t = (double)getTickCount();   
  23.   
  24.     for(int i = 0; i < 10; i++)  
  25.     {  
  26.         Test( i );  
  27.     }  
  28.   
  29.     t = ((double)getTickCount() - t)/getTickFrequency();  
  30.     printf("time without OpenMP: %.3fs\n", t);  
  31.   
  32.     t = (double)getTickCount();   
  33.   
  34. #pragma omp parallel for   
  35.   
  36.     for(int i = 0; i < 10; i++)  
  37.     {  
  38.         Test( i );  
  39.     }  
  40.   
  41.     t = ((double)getTickCount() - t)/getTickFrequency();  
  42.     printf("time with OpenMP: %.3fs\n", t);  
  43. }  
#include <omp.h> #include <stdio.h> #include <stdlib.h> #include <opencv2/core/core.hpp> using namespace cv; void Test (int n) { for(int i = 0; i < 10000; i++) { for (int j=0; j<10000; j++) { //do nothing, just waste time } } printf("%d, ", n); } void main(void) { double t = (double)getTickCount(); for(int i = 0; i < 10; i++) { Test( i ); } t = ((double)getTickCount() - t)/getTickFrequency(); printf("time without OpenMP: %.3fs\n", t); t = (double)getTickCount(); #pragma omp parallel for for(int i = 0; i < 10; i++) { Test( i ); } t = ((double)getTickCount() - t)/getTickFrequency(); printf("time with OpenMP: %.3fs\n", t); }
运行结果如图:

多线程开发简易工具——OpenMP使用_第2张图片

一方面,通过结果可以看到,添加OpenMP模块之后,程序运行顺序不再顺序执行,而是拆分成0~4,5~9两部分分开运行(是由于我只有两个核的原因么?如果用实验室的4核处理是否变成4个执行序分开执行呢,有待出差归来验证一下)。运行时间看,也可以轻易看出来,分成两个运行序运行后,执行时间大概也节约了一半。可见OpenMP可以简单实现并行提速哦,大家可以果断试用,谁用谁知道~~

 
 
这篇文章是转载的,但是我在使用的时候没有发现对性能有很大的提升,大家使用之后可以讨论一下

你可能感兴趣的:(多线程,编程,测试,工具,parallel)