摘要: 线程的调度优化1. 引言 通过前边的介绍,知道了并行区域,默认情况下会自动生成与CPU个数相等的线程,然后并行执行并行区域中的代码。对于并行区域中的for循环有特殊的声明方式,这样不同的线程可以分别运行for循环变量的不同部分。通过锁同步(atomic、critical、mutex函数)或事件同步(nowait、single、section、master)来实现并行区域的同步控制。 那么系统是如何对线程进行调度的呢?具体的调度策略均有底层完成,本节介绍几种for可以在上层对for循环进行控制的调度策略。2. 调度策略 调度策略 功能 适用场合static循环变量区域分为n等份,每个线程平分n. 阅读全文
posted @ 2011-09-01 17:11 西风残照 阅读(834) 评论(0) 推荐(0) 编辑
摘要: 线程同步之互斥锁函数前文介绍了互斥锁同步的两种方法:atomic和critical,本章介绍OpenMP提供的互斥锁函数。互斥锁函数类似于Windows、Linux下的mutex。1. 互斥锁函数 函数声明 功能 void omp_init_lock(omp_lock*) 初始化互斥器 void omp_destroy_lock(omp_lock*) 销毁互斥器 void omp_set_lock(omp_lock*) 获得互斥器 void omp_unset_lock(omp_lock*) 释放互斥器 void omp_test_lock(omp_lock*) 试图获得互斥器,如果获得成功则 阅读全文
posted @ 2011-09-01 17:10 西风残照 阅读(5034) 评论(0) 推荐(0) 编辑
摘要: OpenMP --- 线程同步1. 引言在OpenMP中,线程同步机制包括互斥锁同步机制和事件同步机制。2. 互斥锁同步 互斥锁同步的概念类似于Windows中的临界区(CriticalSection)以及Windows和Linux中的Mutex以及VxWorks中的SemTake和SemGive(初始化时信号量为满),即对某一块代码操作进行保护,以保证同时只能有一个线程执行该段代码。3. atomic(原子)同步语法 #pragma omp atomic x < + or * or - or * or / or & or | or << or >> &g 阅读全文
posted @ 2011-09-01 16:59 西风残照 阅读(1159) 评论(0) 推荐(0) 编辑
摘要: 数据的共享和私有化 1. 引言 在并行区域内,若多个线程共同访问同一个存储单元,并且至少会有一个线程更新数据单元中的内容时,会发生数据竞争。本节的数据共享和私有化对数据竞争做一个初步探讨,后续会涉及同步、互斥的内容。2. 并行区域内的变量的共享和私有 除了以下三种情况外,并行区域中的所有变量都是共享的: > 并行区域中定义的变量 > 多个线程用来完成循环的循环变量 > private、firstprivate、lastprivate、reduction修饰的变量 例如, view plaincopy to clipboardprint?···&# 阅读全文
posted @ 2011-09-01 16:56 西风残照 阅读(1726) 评论(0) 推荐(0) 编辑
摘要: 项目背景: 为了提升项目的运行效率,考虑多线程技术。最近OpenMP技术很热,咱也凑凑热闹,也为了充分发挥电脑硬件的能力。硬件: 酷睿2双核 2.2GHz 3G 内存软件: Visual Studio 2010 旗舰版 Windows 7 旗舰版 32bit难点: 由于多个线程操作同一个文件,很有可能存在线程冲突。OpenMP: 1. 必须的头文件 <omp.h> 2. #pragma omp 预处理指示符指定要采用OpenMP。 例如通过 #pragma om parallel for 来指定下方的for循环采用多线程执行,此时编译器会根据CPU的个数来创建线程数。对于双核系统, 阅读全文
posted @ 2011-09-01 09:58 西风残照 阅读(1481) 评论(0) 推荐(2) 编辑