以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算,都是些很基本的提升程序速度的方法,只要稍微修改下代码和设置,就可使程序加速。配合多线程,经过clock()函数验证,我的程序运行可提高60%的速度,详细如下:
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><pre name="code" class="cpp">#pragma omp parallel num_threads(8){printf(“Hello, World!, ThreadId=%d\n”, omp_get_thread_num() );}
printf函数被创建出的8个线程来执行,每一个线程执行的先后次序并不确定。和传统的创建线程函数比起来,OpenMP相当于为一个线程入口函数重复调用创建线程函数来创建线程并等待线程执行完。如果在上面的代码中去掉num_threads(8)来指定线程数目,那么将根据实际CPU核心数目来创建线程数。
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><pre name="code" class="cpp">#pragma omp parallel forfor ( int j = 0; j < 4; j++ ){printf("j = %d, ThreadId = %d\n", j);}
for循环的语句被分配到不同的线程中分开执行了。需要注意的是,如果不添加parallel关键字,那么四次循环将会在同一个线程里执行,必须循环之间无相关性,变量最好都定义在循环内。
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;"><pre name="code" class="cpp">#pragma omp parallel sections{#pragma omp section<span style="white-space:pre"> </span>printf("section 1 ThreadId = %d\n", omp_get_thread_num());#pragma omp section<span style="white-space:pre"> </span>printf("section 2 ThreadId = %d\n", omp_get_thread_num());#pragma omp section<span style="white-space:pre"> </span>printf("section 3 ThreadId = %d\n", omp_get_thread_num());#pragma omp section<span style="white-space:pre"> </span>printf("section 4 ThreadId = %d\n", omp_get_thread_num());}
每一个section内部的代码都是(分配到不同的线程中)并行执行的。使用section语句时,需要注意的是这种方式需要保证各个section里的代码执行时间相差不大,否则某个section执行时间比其他section长太多就达不到并行执行的效果了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
如何利用VS的代码优化和openmp并行计算提高程序运行速度
原文地址:http://blog.csdn.net/tmshasha/article/details/46900181