先确认你的编译环境有没有装好。依我所知,vs2008下OpenMP应该不是很麻烦,看看编译选知吵拆项对不对。可以写hello world检查是否可以多线搭枣程。
如果并行后时间不减反增,这说明其中有些变量被多个线程竞争访问碰陪,即可能对那个变量存在着写 *** 作,线程之间要互相等待访问;或者并行的程序做了一些额外的 *** 作,调用了与串行不符的函数,导致时间增加。
以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算,都是些很基本的提升程序速度的方法,只要稍微修改下代码和设置,就可使程序加速。配合多线程,经过clock()函数验证,我的程序运行可提高60%的速度,详细如下:代码优化:
属性->配置属性->C/C++->代码生成:启用增强指令集,可选用 流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2)、流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2) 进行加速浮点模型,可选用 快速 (/fp:fast) 进行浮点数据运算的加速
属性->配置属性->C/C++->优化:可选用 使速度最大化 (/O2) 进行优化。全程序优化选择是(/GL),在debug版本下不能这样设置,必须在release版本
openmp并行计算:
在vs2012下,项目属性-》C/C++-》语言,openmp支持,选是,包含头文件“omp.h”,对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。
OpenMP常用指令
parallel:用在一个代码段之前,表示这段握键代码将被多个线程并行执行
for:用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性
parallel for:parallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行
sections:用在可能会被并行执行的代码段之前
parallel sections:parallel和sections两个语句的结合
critical:用在一段代码临界区之前
single:用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行
barrier:用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续册手往下执行
atomic:用于指定一块内存区域被制动更新
master:用于指定一段代码块由主线程执行
ordered:用于指定并行区域的循环按顺序执行
threadprivate:用于指定一个变量是线程私有的
OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数:
omp_get_num_procs:返回运行本线程的多处理机的处理器个数
omp_get_num_threads:返回当前并行区域中的活动线程个数
omp_get_thread_num:返回线程号
omp_set_num_threads:设置并行执行代码时的线程个数
omp_init_lock:初始化一个简单锁
omp_set_lock:上锁 *** 作
omp_unset_lock:解锁 *** 作,要和段姿巧omp_set_lock函数配对使用
omp_destroy_lock:omp_init_lock函数的配对 *** 作函数,关闭一个锁
备忘:
教程: Parallel Programming in Fortran 95 using OpenMP
使用 OpenMP 应该算是一种比较简单的并行方式,用
将需要并行的部分放进去就行了。
gfortran 编译的话使用 -fopenmp 选项即可
如果不是侍如并行程序的话,仅仅会输出一次,但是这里输出了 4 次,因为有四个线程。而教程中也对这个做了解释:
Since the code enclosed between the two directives is executed by each thread, the message Hello appears in the screen as many times as threads are being used in the parallel region.
不知道那个控制台的图标为啥变成了四个红点,是不是点的个数表示线程数呢?
One of the aims of the OpenMP standard is to offer the possibility of using the same source code lines with an OpenMP-compliant compiler and with a normal compiler. This can only be achieved by hiding the OpenMP directives and commands in such a way, that a normal compiler is unable to see them. For that purpose the following two directive sentinels are introduced: !$OMP & !$
需要注意的是逗谈拍 !$OMP 前面不能出现非空字符,否则将会被认为是普通的注释。OMP的这种方式可以很巧妙地使得程序能够在所有的编译器上运行,如果不支持OMP的话就当作普通的注释,如果支持那么这些就会起作用。另外 指令后面有一个空格,这个主要是为了 指令山羡和后面的语句分隔开。这个空格是强制添加的,否则将作为普通注释来处理。
OMP 的指令行支持续行,和 fortran 没多大区别,只要记得每一行都有指令符号就行了。
暂时就学了这么点。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)