文本情感分析方法研究小结

1. 文本情感分析简介

何谓文本情感分析,其实很简单,利用算法来分析提取文本中表达的情感。例如分析一个句子表达的好、中、坏等判断,高兴、悲伤、愤怒等情绪。如果能将这种文字转为情感的操作让计算机自动完成,就节省了大量的时间。对于目前的海量文本数据来说,这是很有必要的。

2. 文本情感分析分类

文本情感分析主要有三大任务,即文本情感特征提取、文本情感特征分类以及文本情感特征检索与归纳。而关于文本情感分析的方法主要分为两类:

一、基于情感词典的方法:人工构建情感词典、自动构建情感词典

二、基于机器学习的方法:朴素贝叶斯、最大熵、SVM分类器

2.1 基于词典的文本情感分析方法

情感词典是文本分析的基础,利用文本情感词典,可以对情感词典进行极性和强度标注,进而进行文本情感分类。

下图示基于词典的文本情感分析过程:

举个例子:

这个游戏不是太好玩。

先进行分词:这个/游戏/不是/太好玩,一共分为四个词,这个,游戏,不是,太好玩。

遍历每个单词,“太好玩”在情感词典中的pos词典中出现,所以pos_score得分为1,然后往前遍历是否出现程度词,无程度词,在搜索否定词,出现了“不是”为-1,相乘最终得分为-1。然后用pos_score减去neg_score的值为最终得分为-1分,大于0则为pos,小于0为neg。

上述例子中每一个情感词的得分需要按照情感词典来计算,而情感词典的构建是则分为人工构建情感词典和自动构建情感词典。

2.1.1 人工构建情感词典

人工构建词典是抓取数据之后多次进行人工标注,根据情感表达将词语进行正负向和强弱程度区分。比较典型的中文情感词典是王勇等对微博中的句子构建的极性词典。台湾大学的中文情感极性词典(NTUSD)、知网情感词典 HowNet等。

人工构建词典在扩充词条信息和便利性方面有一定的优势,但是大大增加了人工开销,并且设计的范围有限,不适合跨领域研究。

2.1.2 自动构建情感词典

第一种是基于知识库的方法,是对上面的人工构建情感词典进行的拓展,加入名词动词副词,使情感词更加全面。

完备的语义知识库, 能够快速构建通用性较强的情感词典, 对词典的精度要求不高的情况下, 这种方法较为实用。中文语义知识库的不足以及领域的限制使得该方法在构建面向单一领域的情感词典中表现不佳。

第二种是基于语料库的方法,利用相关领域的大量语料和相关度的计算规则,结合机器学习的方法,自动统计情感词的情感极性,自动构建情感词典。

语料库相对于语义知识库而言, 其优点是容易获得且数量充足, 构建的词典在语料所属的领域内表现较好, 但是构建的成本较高, 需要对语料进行预处理, 另外, 所构建的词典的准确率相对不高。

第三种是知识库和语料库结合的方法,通过将扩充的情感知识库和特定领域的语料库结合,使构成的情感词典更加丰富。

基于词典的文本情感分析技术由于构建的词典往往只针对某个领域,对于跨领域情感分析的效果不够好,而且词典中的情感词可能不够丰富,对于短文本和特定领域文本进行情感分析的效果更好。因此,对于长文本来说,更好的解决方法是利用机器学习方法。

2.2基于机器学习的文本情感分析方法

先将文本信息进行特征处理,然后对模型进行有监督学习训练,训练好的模型用于预测新的文本信息的情感极性。工作方式如图所示:

根据分类算法不同,可分为朴素贝叶斯、最大熵和支持向量机三种方法。而其中支持向量机的效果最好。

2.2.1 朴素贝叶斯

基于朴素贝叶斯的方法是通过计算概率来对文本情感进行分类,适合增量式训练,而且算法比较简单。

对于给定的数据x,有贝叶斯公式:

根据公式可以得出数据x归为情感类型C的概率。

将x分词为x1,x2,x3,x4,则:

朴素贝叶斯在贝叶斯公式的基础上做了独立同分布假设,所以简化p(x)的计算为:

但该方法对输入数据的表达形式很敏感,而且需要计算先验概率,因此会在分类决策方面存在错误率。

2.2.2 最大熵

最大熵分类器属于指数模型类的概率分类器。基于最大熵原理,并且从适合训练数据的所有模型中,选择具 有最大熵的模型。近年部分学者基于最大熵构建情感分析模型,对文本情感进行了分析。

基于最大熵的文本情感分析只要得到一些训练数据,然后进行迭代,就可以得到所需模型,进行自收敛,方法简 单。但是由于最大熵往往只能得到局部最佳解而非全局最优解,因此运用该方法进行情感分析准确率有待提高。且约束函数数量和样本数目有关系,导致迭代过程计算量巨大,实际应用比较难。

2.2.3 支持向量机

支持向量机最初 由vapnik提 出,它通过寻求结构化风险最小以提高学习机泛化能力,实现经验风险和置信范围的最小 化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的。

结果表明,基于Boosting算法的SVM混合情绪分析模型,性能显著优于单独的SVM模型。

基于SVM的文本情感分析方法被认为是最好的情感分析方法,该方法泛化错误率低,计算开销不大,而且对于训练样本较小的文本可以得到很好的情感分析效果,对高维数据的处理效果良好,能够得到较低的错误率,但该方法对参数调节和核函数的选择敏感。

3. 深度学习在文本情感分析领域中的发展

随着深度学习在图像处理的领域不断发展创新,深度学习技术也开始涉及文本情感分析领域。随着深度学习的快速发展, 词向量模型等的提出恰好为相关研究提供了契机。

同时结合知识库和语料库的优点, 并借助深度学习的方法将词语转换成为词向量, 同时利用神经网络构造情感极性分类器, 判断词语的情感极性, 从而避免分类不准确情况的产生, 最后提出一种自动化构建面向金融领域情感词典的方法。

在深度学习中,可以应用于情感分析的技术有很多,比如:

前馈神经网络(FNN)

Word2Vec词嵌入技术

卷积神经网络(CNN)

循环神经网络(RNN)

LSTM网络

时至今日,深度学习对各个领域的影响在日益扩增。

4.结语

信息技术的快速发展带来了电子商务的发展热潮和网络平台的急剧增加,对这些平台上的大量言论信息进行情感分析所得到的结果可以用于网络平台评论分类、产品分析推荐、消费预测等方面, 具有极高的商业价值。

传统的文本情感分析方法耗费大量人力资源,然而人工提取的特征覆盖面有限且人工的非理性行为会影响结果的正确性,因此传统方法不具有普适性。

随着深度学习能自动提取特征、学习修正输出、可以处理非线性复杂数据 等优势凸显,深度学习的方法在自然语言处理方面 正受到众多学者的关注,可以预测深度学习的方法将成为文本情感分析研究的重要趋势

本文出自:https://www.jianshu.com/p/18eefad6a125

情感分析综述

前面几节我们详细的研究了文本分析的相关算法,本节将简单介绍一下基于文本的情感分析方面的内容,本节更多是论述方面的内容,这个方向的算法基本都是我们前面学过的,原理就不详细的讲解了,如果有感兴趣的朋友可以自行查阅资料进行研究,这里就不在详细的讲解了,以后如果工作中遇到相关的在详细的研究一下,下面正式开始本节的内容:

情感分析简述
文本情感分析(Sentiment Analysis)是指利用自然语言处理和文本挖掘技术,对带有情感色彩的主观性文本进行分析、处理和抽取的过程[1]。目前,文本情感分析研究涵盖了包括自然语言处理、文本挖掘、信息检索、信息抽取、机器学习和本体学等多个领域,得到了许多学者以及研究机构的关注,近几年持续成为自然语言处理和文本挖掘领域研究的热点问题之一。情感分析任务按其分析的粒度可以分为篇章级,句子级,词或短语级;按其处理文本的类别可分为基于产品评论的情感分析和基于新闻评论的情感分析;按其研究的任务类型,可分为情感分类,情感检索和情感抽取等子问题[2]。文本情感分析的基本流程如图 1 所示,包括从原始文本爬取,文本预处理,语料库和情感词库构建以及情感分析结果等全流程。由于文本原始素材爬取,分词等预处理技术已比较成熟,本文接下来将通过情感分析的主要任务情感分类,情感检索,情感抽取问题来分析和阐述已有的相关研究工作。

情感分类
情感分类又称情感倾向性分析,是指对给定的文本,识别其中主观性文本的倾向是肯定还是否定的,或者说是正面还是负面的,是情感分析领域研究最多的。通常网络文本存在大量的主观性文本和客观性文本。客观性文本是对事物的客观性描述,不带有感情色彩和情感倾向,主观性文本则是作者对各种事物的看法或想法,带有作者的喜好厌恶等情感倾向。情感分类的对象是带有情感倾向的主观性文本,因此情感分类首先要进行文本的主客观分类。文本的主客观分类主要以情感词识别为主,利用不同的文本特征表示方法和分类器进行识别分类,对网络文本事先进行主客观分类,能够提高情感分类的速度和准确度[3]。纵观目前主观性文本情感倾向性分析的研究工作,主要研究思路分为基于语义的情感词典方法和基于机器学习的方法。

基于语义的情感词典方法
(1) 构建词典

情感词典的构建是情感分类的前提和基础,目前在实际使用中,可将其归为 4 类:通用情感词、程度副词、否定词
、领域词。目前国内外,情感词典的构建方法主要是利用已有电子词典扩展生成情感词典。英文方面主要是基于对英文词典 的Word Net 的扩充,Hu 和 Liu[4]在已手工建立种子形容词词汇表的基础上,利用 World Net 中词间的同义和近义关系判断情感词的情感倾向,并以此来判断观点的情感极性。中文方面则主要是对知网 How net 的扩充,朱嫣岚[5]利用语义相似度计算方法计算词语与基准情感词集的语义相似度,以此推断该词语的情感倾向。此外,还可以建立专门的领域词典,以提高情感分类的准确性。

(2)构建倾向性计算算法

基于语义的情感词典的倾向性计算不同于所需大量训练数据集的机器学习算法,主要是利用情感词典及句式词库分析文本语句的特殊结构及情感倾向词,采用权值算法代替传统人工判别或仅利用简单统计的方法进行情感分类。给情感强度不同的情感词赋予不同权值,然后进行加权求和。文献[6]利用加权平均算法式(1)计算,可有效提高通用领域情感分类的效率和准确率

其中,分别代表表达正面情感和负面情感的词汇数目;分别代表正面情感词汇和负面情感词汇的权值。

(3)确定阈值来判断文本倾向性

一般情况下,加权计算结果为正是正面倾向,结果为负是负面倾向 ,得分为零无倾向。所得结果评价一般采用自然语言中
经常使用的正确率、召回率和 F 值来评判算法效果。
基于情感词典的方法和基于机器学习的分类算法相比,虽属于粗粒度的倾向性分类方法,但由于不依赖标注好的训练集,实现相对简单,对于普遍通用领域的网络文本可有效快速地进行情感分类。

基于机器学习的情感分类方法
文本情感倾向性分析与传统的基于主题的文本分类相似但有所不同,基于主题的文本分类是把文本分类到各个预定义的主题上,如军事,互联网,政治,体育等,而情感分类不是基于内容本身的,而是按照文本持有的情感、态度进行判断。现有任何机器学习的分类方法都可以用到情感分类中来。基于机器学习的情感分类,其大致流程如下:首先人工标注文本倾向性作为训练集,提取文本情感特征,通过机器学习的方法构造情感分类器,待分类的文本通过分类器进行倾向性分类。常用的情感分类特征包括情感词,词性,句法结构,否定表达模板,连接,语义话题等[7],研究者通过挖掘各种不同的特征以期望提高情感分类的能。常用的特征提取方法有信息增益( Information Gain,IG),CHI 统计量( Chi - square,CHI) 和文档频率( Document Frequency,DF) 等。常用的分类方法有中心向量分类方法、K - 近邻(K - Nearest - Neighbor,KNN) 分类方法、贝叶斯分类器、支持向量机、条件随机场、最大熵分类器等。
最早从事情感分析研究的 Pang 等人[8]使用词袋(Bag - of - Feature) 框架选定文本的 N 元语法( N -Gram) 和词性( POS) 等作为情感 uo 特征,使用有监督的机器学习的方法将电影评论分为正向和负向两类,分别使用朴素贝叶斯,最大熵模型和支持向量机作为有监督学习算法的分类器。结果显示支持向量机在几种分类方法中效果最好,分类准确率达到 80% 。文本情感分类的准确率难以达到普通文本分类的水平,主要是情感文本中复杂的情感表达和大量的情感歧义造成的。在基于机器学习的情感分类算法中,每篇文章被转换成一个对应的特征向量来表示。特征选择的好坏将直接影响情感分析任务的性能。在 Pang 等人的研究基础上,后续研究主要是把情感分类作为一个特征优化任务[9- 11]。随着语义特征信息的加入和训练语料库的发展,基于机器学习的分类将会有广阔的发展前景。

情感检索
情感检索是从海量文本中查询到观点信息,根据主题相关度和观点倾向性对结果排序。情感检索返回的结果要同时满足主题相关和带有情感倾向或指定的情感倾向,是比情感分类更为复杂的任务。主题相关度和观点倾向性对结果排序,随着人们网络检索需求的增高,在传统搜索中加入情感倾向成了搜索技术中一个新的研究热点。和传统的互联网搜索相似,情感检索有两个主要任务:(1) 检索和查询相关的文档或句子。(2)对检索的相关文档或句子进行排序。与传统搜索不同的是互联网搜索的任务只要求找到和查询相关的文档和句子,而情感检索还要确定文档和句子是否表达了观点,以及观点是正面的或是负面的。目前情感检索主要实现方法有两种:一是按传统信息检索模型进行主题相关的文档检索,对检索结果进行情感分类;另一种是同时计算主题相关值和情感倾向值进行检索。第一种方法一般使用传统的检索模型以及较为成熟的查询扩展技术,然后用情感分类方法进行倾向性计
算。文献[12 ~ 13]给出的情感检索系统是国际文本检索会议 TREC(Text Retrieval Evaluation Conference)博客观点搜索任务的优胜者,该系统分为两部分检索部分和观点分类部分。检索部分完成传统的信息检索任务,同时在处理用户查询时将用户查询中的概念进行识别和消歧义,对于每个搜索查询进行同义词扩展,使用概念和关键字针对扩展后的查询对每个文档计算一个相似度,查询的关键字和文档的相关度是这两种相似度的综合。观点分类部分使用监督学习的方法使用两个分类器将文档分为两个类别带观点和不带观点的,带观点的文档再分为正面,负面或者混合的观点。第一个分类器训练数据是从评价网站包括 rateilt-
all. com 和 epinion. com 收集大量带观点的数据和从维基百科等客观性网站收集不带观点的训练数据。第二个分类器训练数据来自评论网站包含打分的评论,低的打分表明负面观点,高的打分表明正面观点。这里两种监督学习的分类器都采用支持向量机。在 TREC博客检索数据集研究的基础上,研究者采用不同的情感分类方法开展了后续研究[14 - 16]。

上面的方法是将检索和情感分类独立计算的,实际中主题相关和情感匹配是有关联的,需要同时计算主题相关和情感匹配,这是因为不同的情感词在文档中对不同的查询词下可能有相反的情感倾向。第二种方法则是同时考虑主题相关和情感文档排序,选择排序策略时需要同时兼顾。很多学者[17 - 18]对排序策略进行了研究,一般是分别计算情感倾向值和查询相关度值,然后加权求和进行排序。Zhang 等人[19]提出一种融合文档情感得分和文档查询相关度得分的概率生成模型排序方法,取得了理想的效果。
情感信息检索是传统信息检索技术和情感分析技术的融合,如何更好的融合二者得到理想的情感检索结果是未来要重点关注的。

情感抽取
情感抽取是指抽取情感文本中有价值的情感信息,其要判断一个单词或词组在情感表达中扮演的角色,包括情感表达者识别,评价对象识别,情感观点词识别等任务。情感表达者识别又称观点持有者抽取,其是观点、评论的隶属者。在社交媒体和产品评论中,观点持有者通常是文本的作者或者评论员,其的登录账号是可见的,观点持有者抽取比较简单。而对于新闻文章和其他一些表达观点的任务或者组织显式的出现在文档时,观点持有者一般则是由机构名或人名组成,所以可采用命名实体识别方法进行抽取。Kim[20]等人借助语义角色标注来完成观点持有者的抽取。然而这些处理方法会导致较低的语言覆盖现象和较差的领域适应性,可以通过基于模式识别的信息抽取 ( Information Extraction) 和 机 器 学 习 ( Machine Learning )技 术 来解决[21]。评价对象和情感词抽取在情感分析中具有重要作用。利用评价对象和情感词的抽取,可以构建领域相关的主题词表和情感词表,情感词表的构建在情感分类部分已做阐述。评价对象是指某段评论中的主题,是评论文本中评价词语修饰的对象,现有的研究大多
将评价对象限定在名词或名词短语的范畴内,一般使用基于模板和规则的方法抽取评价对象。规则的制定通常基于一系列的语言分析和预处理过程,命名实体识别,词性标注和句法分析等方法[22 - 25]都被用来进行评价对象抽取。文献[26]便是使用 3 条限制等级逐渐渐进的词性规则从评价对象集中抽取评价对象,取得了较好的结果。
情感抽取是情感分析的基础任务,通过对大量的情感文本分析,有价值的情感信息抽取对于情感分析的上层任务情感检索和情感分类有直接帮助,如何准确抽取情感信息一直都是研究者关注的重点。

文本情感分析评测

近年来,情感分析得到了越来越多研究机构和学者的关注,在 SIGIR、ACL、WWW、CIKM、WSDM 等著名国际会议上,针对这一问题的研究成果层出不穷[27],国内外研究机构组织了众多相关评测来推动情感分析技术的发展。

由国际文本检索会议 TREC 针对英文文本观点检索任务的博客检索任务(Blog Track),篇章情感分类任务,以及其他一些有趣的情感分析任务;由日本国立信息学研究所主办的搜索引擎评价国际会议 NTCIR(NIITest Collection for IR Systems) 针对日、韩、英、中文文本的情感分类以及观点持有者抽取任务。由中文信息学会信息检索委员会主办的每年一次的中文倾向性分析评测 C
OAE(Chinese Opinion Analysis Evaluation) 已举办了 5 届,在关注情感词语和观点句子的抽取以及倾向性识别的基础上重点对于否定句、比较句以及微博观点句进行评测[28]。众多研究机构的评测推动了情感分析研究的发展,出现了很多有代表性的情感分析语料库资源,文献[29 ~ 30]对语料库构建进行了详细阐述,如康奈尔影评数据集(Cornell Movie - Review Datasets),多视角问答( Multiple - Perspective Question Answering,MPQA)语料库,TREC 测试集,NTCIR 多语言语料库(
NTCIRmultilingual corpus),中文 COAE 语料库等。

参考文献

[1] PANG B,LEE L. Opinion mining and sentiment analysis[J].Foundations and Trends in InformationRetrieval,2008,2 (1 -2) :130 - 135.
[2] 赵妍妍,秦兵,刘挺,等. 文本倾向性分析[J]. 软件学报,2010,21(8) :1834 - 1848.
[3] 厉小军,戴霖,施寒潇,等. 文本倾向性分析综述[J]. 浙江大学学报,2011,45(7):1167 - 1175.
[4] HU M,LIU B. Mining and summarizing customer reviews[C]. NY,USA:Proceedings of Knowledge Discoveryand Da-ta Mining,2004:168 - 177.
[5] 朱嫣岚,闵锦,周雅倩,等. 基于 How Net 的词汇语义倾向计算[J]. 中文信息学报,2006,20(1):14 - 20.
[6] 张昊旻,石博莹,刘栩宏. 基于权值算法的中文情感分析系统研究与实现[J]. 计算机应用研究,201229 (12):4571 - 4573.

[7] 李方涛. 基于产品评论的情感分析研究[D]. 北京:清华大学,2011.

[8] PANG B,LEE L,VAITHYANATHAN S. Thumbs up:senti-ment classification using machine learning techniques [
C].PA,USA:Proceedings of the ACL - 02 Conference on Empir-ical methods in natural language processing - Volume 10,Stroudsburg,Association for Computational Linguistics,2002:79 - 86.
[9] MELVILLE P,GRYC W,LAWRENCE. Sentiment analysis ofblogs by combining lexical knowledge with text classification[C]. New York:Proceedings of SIGKDD,ACM,2009.
[10] LI S,HUANG C,ZHOU G. Employing personal impersonal viewsin supervised and semisupervised sentiment classification [C].New York:Proceedings of ACL,ACM,2010:414 - 423.
[11] KUMAR A,SEBASTIAN T M. Sentiment analysis on twitter[J]. International Journal of Computer ScienceIssues,2012,9(4) :628 - 633.
[12] ZHANG W,YU C,MENG W. Opinion retrieval from blogs[C]. Proceedings of the Sixteenth ACM Conferenceon Con-ference on Information and Knowledge Management,ACM,2007:831 - 840.
[13] ZHANG W,JIA L,YU C,et al. Improve the effectiveness ofthe opinion retrieval and opinion polarity classification [C].MA USA:Proceedings of the 17th ACM Conference on Infor-mation and Knowledge Management,ACM,2008:1415 - 1416.

主要参考了:文本情感分析研究综述 马 力1,宫玉龙2
————————————————
版权声明:本文为CSDN博主「zsffuture」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42398658/article/details/85222547

本文出自:https://blog.csdn.net/weixin_42398658/article/details/85222547

OpenMP简介

1.OpenMP并行计算

  • OpenMP概述

OpenMP是由OpenMP Architecture Review Board牵头提出的,用于共享内存并行系统的多线程程序设计的一套指导性注释,目前已被各界广泛接受,OpenMP并不是一种独立的并行编程语言,而是为了多处理器上编写并行程序而设计的、指导共享内存多线程并行的编译制导指令和应用程序编译接口,支持C、C++、Fortran等编程语言,并且在源代码中以编译器可识别的注释的形式出现。为了支持大规模的工程项目以及保证该方法的兼容性,一些具有国际影响力的软件和硬件厂商共同定义并提出了OpenMP标准,该标准是一种在共享存储体系结构上的可移植编程模型,并且广泛应用于UNIX、Linux、Windows等多种平台上。

OpenMP可以将串行执行的程序转化成并行执行,并且可以加入一些相关的同步或者互斥的操作,在该方法下,编译器将根据代码进行自动并行优化,如果该编译器不支持该类方法,相关代码仍然可以正常运作,但是无法实现多线程的并行计算。OpenMP提供的这种对于并行描述的高层抽象降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMP中,OpenMP库从程序员手中接管了这两方面的部分工作,提高程序员们的开发效率。

  • OpenMP原理
    2.1 OpenMP执行原理

OpenMP主要采用Fork-Join并行执行模型。其中,fork代表着主程序创建新的线程或者唤醒已有进程的操作,join代表着多个线程会合的操作,即在该模型中,程序开始于一个单独的主线程,主线程会一直串行地执行,遇到第一个并行域,通过如下过程完成并行操作:

(1)Fork: 主线程创建一系列并行的线程,由这些线程来完成并行域的代码。

(2)当所有并行线程完成代码的执行后,它们或被同步或被中断,最后只剩下主线程在执行。

使用OpenMP的程序在运行时会维护一个相应的线程池,线程池中的线程用作并行区域中的从线程。当某个线程遇到并行结构并且需要创建包含多个线程的线程组时,该线程将检查线程池并且从中获取空闲线程,将其作为组的从线程。如果线程池中没有足够的空闲线程,那么主线程将获取比所需的要少的从线程。当组完成执行并行区域时,从线程就会返回到该线程池中。

在OpenMP编程的过程中,需要特别注意数据之间是否存在依赖性,因为数据之间的这一性质可能会导致结果出错。此外,OpenMP要求循环过程必须为有限次并且不能使用break,return,exit,goto等退出循环。

1.2.2 OpenMP编译原理

程序的编译过程是将源语言翻译成一个等价的目标程序,对于带有OpenMP制导指令的C语言或者Fortran语言来说,编译后的目标程序是由处理器硬件直接执行的程序,本次报告主要讨论以C语言为基础的OpenMP编译。目前,常见的OpenMP编译方案主要分为从OpenMP/C代码直接编译成目标语言以及先将带有OpenMP指令的C语言转化成标准C语言,然后对C语言进行编译生成目标语言,前者可以有效地降低优化的难度并且提高代码优化的效果,而后者可以有效地简化编译过程降低编译难度,同时也更好地理解OpenMP实现过程。

以GCC编译器为例,GCC编译器具备OpenMP编译的能力,采用的方法是后者方案,即OpenMP的目标语言为标准C语言,然后再对这些标准C语言进行编译最终生成可执行文件,并且在编译过程中需要相应运行库的支持。由于OpenMP指令中使用了一些标准C语言没有的关键字和注释方法,因此在编译过程中,需要对传统的词法分析、语法分析、语义分析等过程进行一定的补充和修改,不仅需要增加关键字的识别,还要增加相关文法和语法生成树相关节点的定义等。

  • OpenMP指导语句

OpenMP编译制导指令以#pragma omp开始,并且在该句后面跟具体的功能指令,具体格式为#pragma omp指令[子句[子句]…]。OpenMP编译制导指令种类丰富,具体分为线程创建、负载均衡、数据特性、线程同步、用户层面的函数、环境变量等功能。

  • 线程创建

#pragma omp parallel用来创建额外的线程完成并行块的计算。原始的进程一般被称作主线程,并设定它的线程序号为0。#pragma omp parallel是语句中最为简单的、基础的指令,在parallel之前,程序只使用一个线程,而当程序到达parallel的时候,当前环境下的其他线程被启动,当该代码执行后,系统会自动生成一个“隐式路障”,用于等待线程组中的其他线程执行结束。只有当线程组中所有的线程均执行了并行代码块,从线程才会终止,然后主线程继续执行之后的语句。此外,环境中每个线程都有自己的堆栈,在执行上述并行代码块时,在堆栈中线程将创建自己函数里定义的私有变量。

  • 负载均衡

在该功能下,OpenMP提供了如下几种方法:

omp for 或omp do:用来将for/do循环的单步计算任务分配给不同的线程。

sections:用来将连续的、但相互独立的代码块分配到不同线程

single:指定一个代码块由一个线程执行,暗含了位于此代码块后的一个同步操作,即只有此代码块执行完后,所有线程才开始下面的计算。

master:与single类似,只是该代码块由主线程执行,而且此代码块后不暗含同步操作。

  • 数据特性

OpenMP将数据分成了不同种类用于控制数据的作用域及相关的使用情况,具体分为以下三类:

共享(shared):并行区域内的数据被所有线程共享,能为各线程读写。默认的,并行区域内除了循环计数器外的所有变量都是共享变量。

私有(private):并行区域内的数据为各线程私有,其数据不能为其他线程读写。私有变量只在并行区域存在,它不会被初始化。默认的,循环计数器变量是私有变量。

reduce,用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的运算。

  • 线程同步

OpenMP为并行域中的代码提供了多种线程同步的制导指令,以保证必要的执行顺序和特殊要求。具体有以下几种指令:

critical:指定的代码块将串行执行,即各线程只能采用分时的方式执行该代码块。一般用来避免数据竞争(datarace)。

atomic:指定一块内存在下一个指令时将被更新。它仅限定内存更新是属于原子性操作。用此子句后,编译器有可能根据特定的硬件指令来以更高效的方式实现critical子句。

ordered:用于指定并行区域的循环按顺序执行

barrier:用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行。

nowait:忽略指定中暗含的同步操作

  • 用户层面的函数、环境变量

OpenMP设置了多种函数接口和宏定义数据,用于获取或者设置环境中线程信息,在本报告中只列举部分常用的函数或者变量:

omp_get_num_procs,返回运行本线程的多处理机的处理器个数

omp_get_num_threads,返回当前并行区域中的活动线程个数

omp_get_thread_num,返回线程号

omp_set_num_threads,设置并行执行代码时的线程个数

OMP_NUM_THREADS,用来指定创建线程的个数

OMP_SCHEDULE用来指定任务调度的方式

本文为原创文章,转载请注明出处!