代码优化:
属性->配置属性->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函数的配对 *** 作函数,关闭一个锁
在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:
1. if子句的结果
2. num_threads的设置
3. omp_set_num_threads()库函数的设置
4. OMP_NUM_THREADS环境变量的设置
5. 编译器默认实现(一般而言,默认实现的是总线程数等于处理器的核心数)
(http://blog.csdn.net/gengshenghong/article/details/6956878查看更多信息)
2、3、4优先级依次降低的,也就是前面的设置可以覆盖后面的设置,当然也是相对而言,num_threads子句只会影响当前的并行区域,而omp_set_num_threads对OMP_NUM_THREADS环境变量的覆盖是在整个程序运行期间全局的。
(2)几个容易混淆的OpenMP函数
1. omp_get_thread_num
获取线程的num,即ID。这里的ID是OpenMP的team内的ID,在OpenMP中,一个team内的线程的ID是俺顺序排列的,0、1、2...
说明:此函数在并行区域外或者并行区域内都可以调用。在并行区域外,获取的是master线程的ID,即为0。在并行区域内,每次执行到此函数,获取的是当前执行线程的ID。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)