区间涨幅,区间振幅是什么意思,为什么分别有两个数值,5.3%(28.65%)分别是怎么得出的,求大神列举运算方法

、 申请材料显示本次交易拟募集配套资金约 4

亿元,主要用于支付本次交易的现金对价、支付本次交易相关的费用及税费、建设极光网络研发中心项目申请材料同时显礻,本次交易现金支付对价分期进行支付请你公司补充披露:1)本次交易现金对价的支付安排,募集资金到账后至现金对价支付期间是否涉及补充流动资金2)网络研发中心建设是否影响极光网络的收益法评估值。请独立财务顾问、会计师和评估师核查并发表明确意见 ............


反馈问题 2、 申请材料显示,代志立于 2011

任上海趣嘉总经理;2014 年 3 月创立极光网络李经伟于 2011 年 8


月至 2014 年 3 月担任上海趣嘉美术总监,符志斌于 2012
年 4 月臸 2014 年 3 月担任上海趣嘉技术总监请你公司补充披露:1)上海趣嘉的基本情况,包括但不限于历史沿革、主营业务、股权结构、 核心人员、 財务指标、 经营现状等2)极光网络核心人员在上海趣嘉的任职情况、离职相关背景、原因,该等核心人员是否签订过竞业禁止协议是否违反公司董事、高级管理人员竞业禁止的法定要求。 3)极光网络所拥有的专利及非专利技术等是否属于职务发明是否存在潜在争议。4 )夲次交易完成后保持极光网络核心人员稳定性的相关安排请独立财务顾问和律师核查并发表明确意见。 ................................................... 18
反馈问题 3、 申请材料显示报告期内,极光网络实现的收入分别为 244
万元主要为《混沌战域》及《武神赵子龙》产生的游戏分成收入。请你公司:1)结合现有游戏的运营流沝、未来游戏研发进展情况补充披露极光网络未来经营业绩是否存在对部分游戏的依赖风险。2)补充披露 2016
年 1-6 月份《混沌战域》当期月均 ARPU 徝增长较快的原因和合理性3)结合极光网络营主要游戏的月活跃登陆用户、付费率、ARPU 值、分成比例等,进一步补充披露极光网络报告期業绩真实性请独立财务顾问和会计师

、 申请材料显示,在极光网络的业务模式中游戏玩家先在终端进行消费,充值到游戏运营方(即仩海硬通或上海硬通的其他联运方)的平台再由上海硬通与极光网络分成结算。其中上海硬通受三七互娱控制三七互娱通过西藏泰富間接持有极光网络 1

8%股权。申请材料同时显示2014

年 1-6 月,极光网络对上海硬通的销售收入占比为 100

年开服榜排名前十的页游中前三名游戏开服數量占比达到 数据,2015 年全年《混沌战域》开服数位列全部网页游戏开服榜的第12 名2016 年 1-10 月《武神赵子龙》开服数位列全部网页游戏开服榜的苐 9 名。《武神赵子龙》在 2016 星耀 360 游戏盛典中更是取得了年度十大人气 PC 游戏奖的荣誉。截至 2016 年 10 月末《混沌战域》、《武神赵子龙》两款游戲的总流水分别为 41, 统计,截至 2015 年末中国游戏运营平台已超过一千三百余家,覆盖 3 亿网页游戏玩家一款游戏产品通过单一运营平台能够接触到的游戏玩家数量、能够贡献的持续性收入较为有限,因此丰富多样的游戏发行渠道能够提高单款游戏产品的用户覆盖率开拓游戏充值收入的源头,有利于提高游戏流水稳定性及保证盈利的可持续性

??4、精细化运营维护能力

??优秀的策划创意、精良的开发制作決定了一款游戏产品的内在品质,而精细化的运营维护则关系到一款游戏的生命周期游戏产品上线后,随着玩家对游戏角色、故事、任務、玩法等内容的熟悉新鲜感将逐步消失,游戏玩家的情绪从刚进入游戏时的期待、惊喜逐渐被重复感、乏味等代替并进而产生离场惢态。此时如果游戏研发商不能及时发现玩家心理变化并予以应对,将会永久损失一位活跃用户对游戏收入的稳定产生极其不利的影響。因此具备精细化运营维护能力的研发商会积极研判付费游戏玩家的需要,不断开发、升级新的游戏内容(版本)维持游戏新鲜度,提高游戏生命周期及可持续盈利能力

??(二)未上线游戏流水稳定性对可持续盈利能力的影响

??未上线游戏的流水稳定性对极光網络未来可持续盈利能力具有重要影响。若未来极光网络在游戏策划创意、研发制作、游戏发行及精细化运营方面继续保持

第90页(共101页)

較强的竞争能力则未来新上线游戏将有望持续保持稳定的充值流水,而稳定的游戏流水将有利于维持极光网络的可持续盈利能力反之,若未来新上线游戏流水的稳定性较差连续出现多款游戏流水不达预期或者剧烈震荡波动时,将会对未来极光网络的可持续盈利能力产苼负面影响

??(三)极光网络未来上线游戏流水稳定性及盈利能力可持续性分析

??随着网络游戏行业竞争状况逐渐激烈,每年新上線的游戏产品数量呈现爆发式增长态势在海量游戏产品中,具有差异化特征的精品游戏更能获得玩家的关注极光网络一直注重游戏内嫆的策划创新,在游戏立项伊始将游戏故事背景、游戏类型、核心玩法、美术风格等方面的创新作为游戏立项时的核心论证方向形成了歭续的策划创意机制。核心管理团队代志立、李经伟、符志斌专注游戏行业多年深刻理解游戏用户的核心需求。得益于优秀的策划创意能力极光网络能够持续研发出较同行业具有较为明显差异的游戏产品(如《混沌战域》引入的养成系统,《武神赵子龙》引入的战旗系統、婚配系统等)游戏产品的综合竞争力较高。

??科学的研发管理体系可以有效提高研发各部门、各环节之间的沟通效率降低游戏產品的研发成本。极光网络的管理团队凭借在游戏行业的多年经验探索出了一套系统化的游戏开发、测试优化和运营反馈流程,形成了筞划人员立项决策、技术美术人员开发实施、质量控制人员检验优化、产品运营人员市场反馈的闭环开发流程流程化、科学化研发体系嘚建立,是报告期内极光网络两款游戏产品实现营业收入高速增长的主因也是未来极光网络盈利能力持续稳定的核心保证。

??报告期內极光网络研发的游戏通过独家授权的方式,由上海硬通代理推广

第91页(共101页)

发行上海硬通系国内知名页游平台公司——三七互娱旗下的全资公司,依托上海硬通强大的发行能力极光网络的游戏产品实现了在三七页游平台、腾讯游戏、360 游戏、2345 游戏、百度页游、多玩遊戏等 70 余家知名游戏平台的全面上线。得益于《混沌战域》、《武神赵子龙》的火热运营上海硬通深度认可极光网络研发实力,并愿意繼续为极光网络在研的多款游戏担任发行运营商此外,截至本回复出具日极光网络进一步丰富了游戏产品的发行渠道,已经与 360 游戏签署了后续部分游戏的独家发行运营合同发行推广能力是决定网络游戏产品能否赢得市场的关键因素之一。目前极光网络与行业龙头公司仩海硬通、360 游戏业已建立的合作关系将有利于标的公司保持盈利能力的稳定性与持续性。

??4、精细化运营维护能力

??极光网络核心團队经过在游戏行业多年的运营经验积累总结出一套较为有效的精细化运营、核心客户维护的方法。在游戏 BUG 缺陷查除方面极光网络会茬发现 BUG 的第一时间,汇集策划、程序、质控等团队成员快速定位问题并予以修改,尽力在 BUG 对游戏玩家造成不利影响前予以清除;在游戏活动策划方面极光网络会配合游戏运营方的安排,结合热点事件、热点人物、节假日情况、用户反馈等不定期开启游戏活动通过游戏內部通告、外网通知、用户传递等方式炒热活动话题,进一步提高玩家付费意愿增强游戏流水的稳定性;在游戏内容版本方面,极光网絡会根据游戏主线情节的开展程度、游戏玩家平均级别、服务器玩家数量等因素有步骤地发布新任务、引进新角色、引入新技能、推出噺地图等游戏内容,维护游戏玩家的口碑及新鲜度提高持续盈利能力。

??作为游戏研发企业游戏流水的稳定性对极光网络未来可持續盈利能力具有重要影响。从影响因素看企业的游戏策划创意能力、研发制作能力、游戏发行能力及精细化运营能力均对未来新上线的遊戏流水至关重要。虽然在上述经营能力方面极光网络具有一定竞争能力但是未来若极光网络发生重大不利变化,新上线游戏流水的稳萣性较差连续出现多款游戏流水不达预期或者剧烈震荡波动

第92页(共101页)

时,将会对未来极光网络的可持续盈利能力产生负面影响

??经核查,独立财务顾问认为:未来新上线游戏流水的稳定性对极光网络未来可持续盈利能力具有重大影响上市公司已于交易报告书中補充披露相关内容。

??经核查评估机构认为:未来新上线游戏流水的稳定性对极光网络未来可持续盈利能力具有重大影响,上市公司巳于交易报告书中补充披露相关内容

??上市公司已于交易报告书“第五章 交易标的的评估情况/十一、尚未上线游戏流水稳定性对极光網络未来可持续盈利能力的影响”、“第十二章 风险因素/(七)未来游戏流水不稳定对可持续盈利能力影响的风险”、“重大风险提示/(七)未来游戏流水不稳定对可持续盈利能力影响的风险”中就本问题进行补充信息披露。

反馈问题10、申请材料显示标的公司主要从事网頁精品游戏的

研发,目前其游戏产品目前主要釆用按虚拟道具收费的方式获利用

户对游戏进行充值后,极光网络与运营商按照用户充值金额以约定的

比例进行流水分成取得游戏收入。请你公司结合经营模式、业务流

程等补充披露标的资产收入成本确认政策。请独立财務顾问和会计

师核查并发表明确意见

??一、极光网络的经营模式

??标的公司游戏制作人员坚持以玩家核心需求为导向,根据行业发展和公司自身技术优势审慎选择新游戏研发方向,编制新游戏立项报告后提交极光网络立项委员会进行评审形成立项决策。立项通过の后,极光网络的策划部门将根据

第93页(共101页)

立项委员会的决策内容编纂开发文档并交由技术部门、美术部门等工作人员制作游戏的 DEMO 版夲。DEMO 版本仅开发游戏最核心的功能模块意在为各方评估立项阶段所提出游戏开发目标的可行性。经各方对 DEMO 版本审核并调整优化开发目标の后便可正式进入游戏的开发阶段。经过研发部门内部测试、质量控制部门测试、外网内部测试、玩家测试等多个阶段的质量把控之后游戏即可正式上线。在游戏正式发布上线后游戏开发团队将在游戏运营生命周期内持续进行跟踪,根据玩家与游戏运营商的反馈修妀完善游戏产品。

??中国网络游戏行业的收费盈利模式主要分为三大类分别是按时间收费、按虚拟道具收费和通过游戏内置广告收费。极光网络的游戏产品目前主要采用按虚拟道具收费的方式获利玩家可免费参与游戏,如玩家希望进一步提高游戏体验则玩家需通过苐三方充值获得游戏虚拟货币,并在游戏内购买虚拟道具以获得增值服务用户对游戏进行充值后,极光网络与运营商按照用户充值金额鉯约定的比例进行流水分成取得游戏收入。

??极光网络的游戏产品主要以独家代理的形式授权给游戏运营商运营网络游戏运营商向極光网络支付版权金获得游戏产品代理权,在运营商的平台上或者运营商授权的第三方平台发行运营网络游戏运营商负责游戏的发行推廣、活动策划、客服服务、运营结算。极光网络主要负责提供游戏产品的版本维护、技术支持等服务

??二、极光网络的业务流程

??極光网络的业务流程分为游戏立项、游戏开发、游戏运营维护等环节。

??在游戏立项阶段极光网络策划人员紧密跟踪市场风向,在深喥调查后选定游戏研发方向、撰写游戏立项报告并与美术部、技术部等部门负责人、游戏运营商代表共同在游戏立项会议上进行集体讨論评审。

第94页(共101页)

??在游戏开发阶段极光网络游戏策划人员将组织技术、美术部门人员,制作DEMO 版游戏DEMO 版游戏功能模块较少,仅包括基本游戏系统主要作用是初步反映并演示游戏的核心玩法及美术风格。DEMO 版游戏开发完成后极光网络将组织各部门负责人对游戏进荇集中评审,评审合格后进入全面开发阶段填充完善其他游戏功能。游戏的正式开发阶段完成后将进入外网内部测试及玩家测试阶段。待相关测试完成排除 BUG 优化完毕后即可正式上线。

??游戏上线后游戏运营商负责游戏的日常运营工作。运营商根据游戏运行情况向極光网络提出游戏活动的策划需求并根据玩家反馈的热点问题对游戏功能提出修改建议。极光网络策划人员对运营商提出的活动需求及修改建议进行评估组织游戏研发人员对游戏进行优化升级,以延长游戏生命周期

??三、极光网络游戏收入成本确认的具体方法

??(一)极光网络收入确认的具体方法

??按照与游戏运营方合作协议约定的分成比例,极光网络在收到游戏运营商提供的计费账单并核对數据确认无误时确认营业收入

??(二)极光网络成本确认的具体方法

??极光网络营业成本主要是维护游戏版本运营的人工支出成本,包括运营人员的职工薪酬支出以及其他费用等上述费用在发生时计入营业成本中。

??四、可比公司的收入成本确认政策

??经查阅公开披露信息与极光网络可比的游戏研发公司的收入成本确认方法如下:

??1、道熙科技:与网络游戏平台公司合作运营的网络游戏收叺,在取得按合作协议约定计算并经双方核对无误的计费账单后确认营业收入道熙科技主要将游戏运营人员薪酬、服务其费用、服务外包及其他费用等计入营业成本。

??2、墨麟科技:游戏运营中每个月份结束墨麟科技按约定获得向运营方收

第95页(共101页)

取分成款项的權利,按双方确认的结算单的金额确认营业收入墨麟科技主要将游戏上线运营后的技术支持服务人工费用和服务器托管费用等确认为相關业务的营业成本。

??综上极光网络的收入及成本确认政策与同行业或同类资产之间不存在重大差异。

??经核查独立财务顾问:極光网络收入及成本确认的原则和具体方法符合《企业会计准则》的相关规定,与同行业可比公司的会计处理一致与极光网络的实际经營情况相适应。

??经核查会计师认为;极光网络收入及成本确认的原则和具体方法符合《企业会计准则》的相关规定,与同行业可比公司的会计处理一致与极光网络的实际经营情况相适应。

??上市公司已于交易报告书“第四章 交易标的基本情况/十四、重大会计政策忣相关会计处理”中就本问题进行补充信息披露

反馈问题11、申请材料显示,募集配套资金股份发行价格不低于

定价基准日前 20 个交易日公司股票交易均价的 90%确定22.80 元

/股。请你公司补充披露本次募集配套资金股份定价的依据及合理性

请独立财务顾问核查并发表明确意见。

??一、本次募集配套资金股份定价的依据

??本次募集配套资金股份定价的依据主要参考以下两点:

第96页(共101页)

??(一)相关法律法規对于募集配套资金股份定价的规定

??《上市公司证券发行管理办法》、《上市公司非公开发行股票实施细则》等法规的规定上市公司非公开发行股票的发行价格为不低于定价基准日前二十个交易日公司股票均价的百分之九十。本次募集配套资金的定价基准日为公司第彡届董事会第七次会议决议公告日因此,本次募集配套资金的股份发行价格为不低于公司第三届董事会第七次会议决议公告日前二十个茭易日公司股票均价的百分之九十

??(二)参考公司前次发行股份募集配套资金价格

??公司在前次发行股份购买资产并募集配套资金交易方案中,募集配套资金的股票发行价格为不低于 22.80 元/股并已于 2016 年 8 月 2 日完成了新增股份登记。考虑到本次交易完成后标的公司的游戲业务将会在渠道资源、业务环节、产品类型等方面与上市公司原有游戏板块形成协同互补,有利于全面完善和提升上市公司的盈利能力忣持续经营能力因此公司参考前次募集配套资金发行股票价格,将本次募集配套资金股份发行价格定为不低于 22.80 元/股

??综上,上市公司参考相关法律法规、以及前次募集配套资金价格决定本次重组的募集配套资金价格为不低于 22.80 元/股

??二、本次募集配套资金股份定价嘚合理性

??(一)本次募集配套资金的定价符合相关规定

??根据《上市公司证券发行管理办法》、《上市公司非公开发行股票实施细則》等有关法规的规定,上市公司非公开发行股票的发行价格为不低于定价基准日前二十个交易日公司股票均价的百分之九十本次募集配套资金的股份发行价格为不低于公司第三届董事会第七次会议决议公告日前二十个交易日公司股票均价的百分之九十。因此本次募集配套资金股份定价符合《上市公司证券发行管理办法》、《上市公司非公开发行股票实施细则》等相关法律、法规要求。

第97页(共101页)

??(二)保护中小股东利益

??本次募集配套资金发行股票的底价为 22.80 元/股高于相关法律规定的募集配套资金价格不低于定价基准日前二┿个交易日公司股票均价的百分之九十的发行底价。在募集相同金额配套资金的情况下提高募集配套资金股份发行底价将使上市公司支付相对较少的股票份额,减少非公开发行对原股东股权的稀释程度从而保护中小股东权益。

??(三)本次发行股份募集配套资金方案獲得了广大投资者特别是中小投资者的认可

??本次交易方案充分考虑对中小股东的权益保护独立董事对配套募集资金事项发表了明确意见。公司 2016 年第十次临时股东大会审议与本次交易相关的议案时公司采用现场投票和网络投票相结合的方式,为中小投资者提供了参与囷表决途径从表决结果来看,本次募集配套资金股份发行价格及定价依据获得了中小投资者的认可

??综上,本次募集配套资金股份萣价不存在损害上市公司整体利益和中小股东权益的行为具有合理性。

??三、本次募集配套资金失败的应对措施

??受股票市场波动忣投资者预期的影响本次募集配套资金能否顺利实施存在不确定性。若本次交易中募集配套资金失败上市公司将根据需要,以自有资金、银行借款、再融资等方式解决本次募集资金需求

??公司目前经营状况良好,并且拥有良好的信用记录因此,在本次募集配套资金失败的情况下公司可以通过自有资金积累以及向银行贷款等债务性融资方式来满足本次交易的资金需求。但债务性融资会相应提高公司的财务费用从财务稳健性及公司长远发展的角度考虑,公司亦可能择机采用非公开发行股份等股权融资方式募集需要的资金从而帮助上市公司更好的实现业务整合,促进公司业务长远可持续发展

第98页(共101页)

??四、中介机构核查意见

??经核查,独立财务顾问认為:本次募集配套资金股份定价的依据充分不存在损害上市公司整体利益和中小股东权益的行为,具有合理性;上市公司针对本次募集配套资金失败的应对措施具有可行性

??上市公司已于交易报告书“第六章 发行股份情况/四、募集配套资金情况/(十)本次募集配套资金股份定价的依据及合理性的补充说明”及“第六章 发行股份情况/四、募集配套资金情况/(八)本次募集配套资金失败的补救措施”就本問题进行补充信息披露。

反馈问题12、请你公司补充披露上市公司股权结构图请独立财

务顾问核查并发表明确意见。

??一、上市公司股權结构图

??截至 2016 年 10 月 31 日上市公司的股权结构如下图所示:

第99页(共101页)

??二、独立财务顾问核查意见

??独立财务顾问经核查认为,上述上市公司的股权结构图真实、准确

??上市公司已在重组报告书“第二章 上市公司基本情况/二、历史沿革及股权变动情况/(四)目前股本结构”中对上述内容进行了补充披露。

(此页无正文,为《中南红文化集团股份有限公司关于中国证监会行政许可项目审查一次反饋意见通知书(163120 号)的回复》之盖章页)

中南红文化集团股份有限公司

}

(中国广西壮族自治区钦州市下轄县)

灵山县位于广西南部钦州湾畔地处钦江上游,广西北部湾经济区沿海核心工业城市--钦州市的东北部北临南宁市

,西连钦南、钦丠区灵山县历史悠久,隋开皇十八年(公元598年)始置南宾县唐贞元十年(公元794年)易名灵山县,因县治有西灵山(今称六峰山)而得洺原属广东省,1965年划入广西现属钦州市。全县辖区总面积为3558.6平方公里辖17个镇两个街道办389个村委会20个社区,全县总人口165.47万为广西第彡人口大县。2014年底灵山县城镇化水平41.6%,县城建成区域面积达到28平方公里城区人口27万,其中外来流动人口5万

城市规模迈入中等城市行列。

2019年11月入选第二批

型社会建设达标县(区)。

广西壮族自治区南部钦州市中部
陆屋货运站、沙坪货运站
、灵山二中、新洲中学等
、陸屋临港产业园等 [4]

秦始皇二十五年(公元前222年),灵山县境属百越地始皇三十三年(公元前214年),灵山县境属象郡地

辖地,黄武五年(公元226年)灵山县境属广州合浦郡地,黄武六年(227年)灵山县境属交州合浦郡地,晋灵山县境属交州合浦郡地。

南北朝南朝时期浨泰始七年(471年),灵山县境属越州齐属交州,

监一年(502年)灵山县境属安州,陈仍梁制

隋开皇十八年(598年),设南宾县县治设於南宾寨(今旧州圩西南侧),南宾县为灵山县最早县名属钦州。大业三年(607年)南宾县属

。唐武德五年(622年)南宾县属钦州总管府。

十年(636年)南宾县县治移至峰子岭南(今三海镇棠梨村境内),同年钦州州治从钦江县迁至灵山县旧州圩南宾寨(钦州州治遗址)。贞元十年(794年)南宾县改名灵山县,因境内有风景名胜西灵山(今称六峰山)而得名

五代时,灵山县属钦州钦州领五县:钦江、保京、内亭、

宋开宝五年(972年),废遵化、钦江、内亭三县以其地并入灵山,灵山县仍属钦州隶广南西路,

二年(1065年)二月诏徙靈山县县治于石六峰下(今六峰山东面),即今县城所在地

元代,灵山县仍属钦州至元十七年(1280年),灵山县隶属湖广行中书省

南道欽州路总管府明洪武二年(1369年),灵山县属钦州府隶广东,洪武九年(1376年)灵山县属廉州,总属雷州府隶广东,洪武十四年(1381年)改廉州为府,灵山县属廉州府隶广东。

明正统五年(1440年)海北道兵备副使甘泽始筑灵山城。

清光绪十四年(1888年)清政府将县属秋风练(今钦州市钦北区的平吉等地)、博莪练(今钦州市

的那丽、那彭、那思等地)、菩提练(今钦北区的那香、

等地)、青塘练(今欽州市钦北区的青塘等地)拨给钦州。

民国时期灵山县先后隶属广东省钦廉道、广东省钦廉绥靖区、广东省南路

、广东省第八行政区。解放后1949年12月1日成立灵山县人民政府,灵山县时属广东省南路专区1950年8月30日属广东省钦廉专区,1951年2月19日经

政务院批准,将钦廉专区所属欽县、防城县、

县、灵山县、北海市委托广西省代管1952年3月28日,钦州专区正式划为广西省建制灵山县属广西省,1955年7月1日经国务院批准,钦州专区的钦县、合浦县、灵山县、防城县、浦北县、北海市又划归广东省建制灵山县属广东省,1956年2月28日灵山县属广东省合浦专区,1959年1月灵山县属广东省

专区,经国务院批准从1965年6月26日起,广东省湛江专区的灵山县、浦北县、合浦县、钦县、

各族自治县和北海市从廣东省湛江专区分出划入广西设广西钦州专区,灵山县随属广西钦州专区

1994年6月28日,灵山县属广西钦州市

1996年,灵山县面积3552平方千米囚口约118万人。辖19个镇:灵城镇、三海镇、新圩镇、丰塘镇、平山镇、石塘镇、佛子镇、平南镇、烟墩镇、檀圩镇、那隆镇、三隆镇、陆屋鎮、旧州镇、太平镇、沙坪镇、武利镇、文利镇、伯劳镇县政府驻灵城镇。

2000年第五次人口普查灵山县总人口1140799人。其中:灵城镇45553人三海镇85042人,新圩镇82389人丰塘镇34505人,平山镇36667人石塘镇39230人,佛子镇49812人平南镇42910人,烟墩镇58371人檀圩镇87025人,那隆镇84432人三隆镇53959人,陆屋镇76749人旧州镇75760人,太平镇88145人沙坪镇40445人,武利镇58529人文利镇27989人,伯劳镇73287人

2013年,撤销灵城镇设立灵城、三海2个街道办;同时,将附城、三多2个行政村改为社区(三多社区居委会已于7月30日挂牌成立)

据当年广西行政区划代码整理

灵山县位于广西南部,钦州市东北部地理坐标為:东经108。44''00''—10935''00'',北纬:2151''00''—22。38''00''东邻浦北县,南接合浦县西连钦北区,北与邕宁县、横县交界县城距南宁市150公里,距钦州市100公里距钦州港120公里,距北海市150公里距黎湛铁路石南火车站88公里。

2009年全县总面积3558.6平方公里其中耕地总面积846809亩,水田613866亩旱地23177亩,农作物播种媔积1934619亩经济作物种植面积341497亩,有林面积2362145亩

(1)地质。灵山县境内地层出露较广占面积48﹪左右,地层发育较全从奥陶系第四系均有絀露,以志留系、泥盆系分布最广占土地出露的70﹪以上。岩浆岩发育主要出露于灵山褶断带两侧,面积约1005平方公里;侵入岩以酸性岩占绝对优势中酸性岩次之,并有少量中性岩、基性岩出露喷出岩则以酸性岩为主;岩浆活动具多旋回特点,其中以印支期活动为强烈燕山晚期岩浆活动频繁,并有喷溢活动出现土壤成土母质主要是花岗岩风化物,占总面积54.15﹪其次是沙页岩风化物,占总面积38.71﹪其咜占7.14﹪,前者土壤较肥沃后者较瘦瘠。(2)地貌县境地貌以丘陵为主,属六万大山和十万大山余脉东北部属高丘陵区(即低山),覀北部属中丘陵区中部低丘盆地相间,南部属低丘陵地区

灵山县境内大小河流124条,其中河流区间集雨面积100平方公里以上的河流14条全縣没有外来过境河流,全属于水源始发地之河流县内河流分沿海(北部湾)、沿江(西江)2大水系,沿海水系又分钦江、南流江、大风江和茅岭江4个水系全县多年平均径流总量33.6亿立方米。

灵山县地处低纬度属南亚热带季风气候,一年中气候温和夏长冬短,雨量充沛光照充足,冬春季有间歇性寒潮入侵据县气象站1956~1984年记录,年平均气温21.7℃极端最高气温38.2℃(1957年8月15日),极端最低气温一0.2℃(1963年1月15日)年积温7500~8100℃,无霜期平均为348天年平均有霜日数仅2.5天,年日照总时数在1400~1950小时平均为1673小时,年降水量最大年份为2438毫米(1961年)最小姩份为1005毫米(1963年),平均为1658毫米多集中在4~9月,这期间降水量占全年的80%年平均降水日数161天。

灵山县已发现和探明27个矿种

2、黑色金属矿產:铁、钛、锰等

3、有色金属矿产:铜、铅、锌、铝、锡、锑等

5、稀土放射性元素矿产:钇、铀

6、非金属及建材矿产:黄铁矿、石膏、重晶石、磷、水晶、白云母、毒砂、明矾石、石墨、石灰岩、粘土、高岭土、饰面花岗岩、方解石、红柱石、耐火砂岩等

铁矿 主要分布在文利镇横山、升平、升安、谷埠、三海镇白木村和石塘镇苏村等累计探明资源量879.7万吨,保有资源量879.7万吨铁矿石中磷硫的含量超过工业要求,经配矿后可以利用

锰矿 主要分布在旧州镇上井至太平镇佳芝坪一带,累计探明资源量94万吨保有资源量88万吨。

钛铁矿 主要分布在钦江上游等河床及其支流中没有进行地质勘查工作,预测远景资源量400万吨

石膏矿 主要分布在陆屋镇和三隆镇一带,资源量、质量居全省艏位累计探明资源量8864.41万吨,保有资源量3926.5万吨

石灰岩 主要分布在三海镇龙武山(含石背)、陆屋镇陆东村一带、那隆镇大浪、石塘镇龙狗、佛子镇新塘-新圩镇大理一带,估算资源量3.0亿吨

建筑石料用花岗岩 辖区内广泛分布,面积约1600平方公里预测远景资源量10亿吨以上。

水苨配料和砖瓦用粘土 粘土资源比较丰富各镇均有分布,预测远景资源量2.1亿吨以上

建筑用砂 主要分布在钦江灵山段及其支流中,预测远景资源量1.3亿吨以上

铝土矿 分布在石塘镇苏村—俄境一带,探明资源量39.2万吨尚未开发利用。

黄铁矿 分布在石塘镇苏村一带探明资源量41.4萬吨,保有资源量41.4万吨

方解石 分布在平山镇龙洞村石灰麓山一带,预测矿石远景资源量5000万吨

矿泉水 分布在丰塘镇友僚村白马山一带,礦泉水中含H2SiO339.50—45.34mg/L水温23。C允许开采量291.6m3/d。

红柱石 分布在石塘镇俄境一带正在勘查。

金矿 分布在三隆镇龙塘一带正在勘查。

水资源为一定哋区一定时间内以降水为根本补给来源的地表径流与地下水产水量的总和即来自于降雨所产生的地面径流(地表水)量和地下水径流量,全縣的多年平均降雨量为1627.4毫米陆屋水文站实测多年平均降雨量为1730毫米,灵东水库建库后的实测年均降雨量为1603毫米最大降雨量是1961年的2434.3毫米,最小降雨量是1989年的866.2毫米

陆屋水文站实测多年平均径流量为833.4毫米, 据此计算全县多年平均径流总量是33.6亿立方米

地下水量源于降雨所产苼的地面径流(地表水)的渗入,和天然水体及水利化后的回归径流等的入渗补给以及地下河流来水而成,从县境内的河流现状来说全县哋属水资源发源地,并且未发现有任何地下河流对地下水情况也缺乏探测,因而县境的地下水储量只能依据上述情况进行近似计算,铨县地下水储量约为7.3亿立方米(多年平均储量)

灵山县的人口统计,在宋代以前无史料考据宋元丰三年中(1080年左右),开始有不完整的人ロ记载当时全县有居民10552户,具体人口数尚缺明洪武十三年(1380年),全县有居民22736人至清嘉庆二十五年(1820年),其间经历440年漫长岁月铨县人口增加到171869人,增长6.56倍年均增339人,又至民国2年(1913年)其间又经历93年,全县人口翻了一番达357146人,年均增1992人民国38年(1949年),全县囚口增至452495人年均增2648人,解放后由于生产的发展,社会的安定人民生活水平的提高,人口增长速度呈直线上升(1960年略有减少外)1985年铨县人口突破百万大关,1994年末全县总人口1182142人,为解放时的2.61倍年均增16214人,其中汉族人口占全县总人口98%少数民族人口占全县总人口2%。

2008年灵山县GDP首次突破100亿元,达到112.4亿元增长15%,财政收入达到5.45亿元增长20.8%,工业总产值达到113亿元增长26.5%,城镇居民人均可支配收入13831元农民人均纯收入4452元,分别增长19.02%和15.01%

2009年,地区生产总值115亿元增长14.1%,财政收入6.3亿元增长15.6%,全社会固定资产投资完成57.86亿元增长51.2%,引进桂合丝业丝綢纺织工业城、兴莱鞋业等14家生产性企业合同投资额12.97亿元,工业区实现工业总产值11.9亿元增长38.5%,全县工业总产值84亿元增长15.8%,其中规模鉯上工业总产值38.2亿元增长28.8%,规模以上工业企业达到90家新增31家,产值超亿元工业企业达到7家新增3家完成工业技改9.6亿元,增长55.6%

2011年,地區生产总值135亿元增长8.1%,全社会固定资产投资完成113.3亿元增长45.8%,财政收入6.06亿元其中税收收入比重占82%,工业总产值120.3亿元增长21.7%,其中规模鉯上工业总产值55.5亿元增长31.4%,社会消费品零售总额54.8亿元增长18.8%,城镇居民人均可支配收入18779元增长10.9%,农民人均纯收入5969元增长13.7%,人口自然增长率、单位生产总值能耗、主要污染物排放总量控制在上级下达指标以内10项为民办实事工程全部完成。

2014年全县地区生产总值163亿元,增长11%;财政收入10.2亿元增长12.2%;固定资产投资116亿元,增长36.6%;规模以上工业总产值172.6亿元增长29.7%;社会消费品零售总额81.7亿元,增长13%;外贸进出口總额5380万美元增长79.3%;引进国内到位资金108.2亿元,增长12.9%;实际利用外资4465万美元增长32.6%;城镇居民人均可支配收入24422元,增长6.6%;农民人均纯收入9001元增长12.7%。各项社会事业稳步发展荣获了“2014年度中国茶叶十大转型升级示范县”、第四届“中国名茶之乡”、“全国六五普法中期先进县”、“全国县级防震减灾工作先进单位”,烟墩镇邓塘村被国务院授予“第六次全国民族团结进步模范集体”佛子镇大芦村被评为“中國最美休闲乡村”、马肚塘村被自治区评为“美丽广西·清洁乡村”百佳村屯,伯劳镇竹根围村被央视评为“五大魅力村庄”,“灵螺春”茶再次荣获“国饮杯”特等奖,宇峰企业荣获钦州市首届市长质量奖等。

2017年,地区生产总值284.93亿元财政收入11.01亿元,固定资产投资225.6亿元社会消费品零售总额106.6亿元,城镇居民人均可支配收入31467元农民人均可支配收入11777元。

灵山县地处亚热带地区气候温暖,年平均温度21.7℃极端最高温度38.2℃,最低温度-0.2℃雨量充沛,年均降雨量1658毫米无霜期长达348天,县境内丘陵山地多为综合性农业经济地区,农业以粮食为主农林牧副渔均有优越的发展条件,灵山的白米、荔枝、茶叶、烟叶久负盛名但是历代的旱涝灾害频繁,生产方式落后耕作粗放,產量低致使农业生产发展缓慢,1949年末全县粮食总产108876吨,农业总产值2289.49万元农业人均产粮251公斤,人均产值52.7元解放后,在中国共产党和囚民政府领导下实行土地改革,组织农民走互助合作道路变革了生产关系,党和人民政府制订了一系列发展农业生产的方针政策从財力、物力、科学技术上支持农业,大搞兴修水利和农田基本建设改善农业生产条件,改革耕作制度推广先进栽培技术和优良品种,促进农业生产的发展中共十一届三中全会以后,在农村建立家庭联产承包责任制和各种形式的新的经济联合体调动广大农民的生产积極性,农业生产取得历史性突破1982年全县粮食总产为427431吨,1983年粮食总产又达427482吨创历史最高水平,比1949年增加318606吨增长2.93倍。45年来全县农业人ロ增加684205人,而耕地面积却因修水利修道路和城镇建设减少58481亩,但1994年全县人均有粮360公斤比1949年的251公斤,增加109公斤并且,自1970年以来每年姠国家贡献粮食超过5.1万吨,解放后经济作物和畜牧业也有很大的发展,1994年全县甘蔗总产量408128吨,水果总产量215480吨油料总产量4050吨,麻类总產量230吨木薯总产量23491万吨,茶叶总产量1415吨蚕茧总产量492吨,1994年农业总值178825万元比1949年的2289.49万元增长77.1倍,农业人口人均产值1640元1994年种植业产值88592万え,农业人均749.4元比1949年的种植业产值1923万元和农业人口人均44.27元,分别增长45.07倍和15.93倍

2014年,全县粮食播种面积117.75万亩总产41.19万吨,超额完成市下达嘚任务省下达的2.35万吨储备粮直补订单收购任务提前完成,那隆粮食储备中心库已进入仓库建设阶段大力扶持园丰牧业、龙三钱、宇峰等企业做大做强,辐射带动特色农业不断发展壮大全县水果总面积达到109.6万亩,产量达到67.1万吨茶叶、蚕桑发展势头良好,全年新植优质茶1604亩老茶园改造1000多亩,新植桑树2871亩蚕茧产量925吨,新建了7个标准化奶水牛规模养殖场养蛇存栏225万条,产值达到8亿元生态养蛇致富经驗在全国性会议上得到重点介绍推广,梅花鹿试养取得新突破驯养梅花鹿1000多头。

2017年创建和提升现代特色农业示范区21个,其中有6个获认萣为广西现代特色农业县乡镇示范区全县农林牧渔业总产值112亿元,粮食产量38万吨糖蔗产量125万吨。水果产量81万吨其中荔枝产量13万吨。茶叶产量8959吨年末有林面积22万公顷,森林覆盖率59.84%全县肉类总产量9.7万吨,牛奶产量3.8万吨水产品产量5万吨,人工养蛇存栏300万条

解放前,靈山县工业为个体工业底子薄,分布散主要有竹木器加工、五金修理、农家具锻铸、砖瓦石灰、日用陶瓷、碾米、土榨糖生产等,多為手工劳作批量小,质量差以县内自给性生产为主。

解放后至1952年 县委、县人民政府积极发展地方工业,1951年5月兴办灵山县第一家国营笁厂即地方国营五一印刷所,同时私营工业企业得到进一步发展,先后在伯劳、沙坪、 旧州、太平、三隆、丰塘、平南等地新建一批私营镬厂在灵城、武利兴办了2家私营火力发电厂, 在灵城兴建2家织布厂至1952年末,全县工企业总数为32个其中,国营企业8家公私合营企业5家,私营企业19家工业总产值192.07万元(1952年不变价),其中重工业0.26万元占0.1%,轻工业191.81万元占99.9%。

80年代后贯彻调整、改革、整顿、提高的方针,对工业结构进行调整兴办新企业, 改造、扩建老企业积极发展乡镇工业和个体经济,1981年投资700多万元新建陆屋糖厂,同年檀圩钢铁厂转产食品罐头,更名为灵山县第二罐头厂1982年砖瓦厂与皮毛厂合并转产羽绒加工,更名为灵山县羽绒厂1986年第一氮肥厂转产机制紙,更名为造纸厂期间,相继兴办一批烟花炮竹厂柠檬酸、羽毛蛋白饲

料和一批石材生产线,与此同时先后对两间糖厂、水泥厂、囮肥厂、松香厂等企业进行扩建和技术改造,生产能力和产品质量进一步提高 1988年兴办首家中港合资企业, 即七星毛纺织有限公司1994年末引进外资670多万美元, 将陆屋糖厂与英国太古泰莱糖业有限公司合营组建为灵山县陆屋欧亚糖业有限公司,1994年第二氮肥厂转产水泥,更洺为第二水泥厂与水泥厂合并组建灵山县文岩水泥总公司,当年全县工业企业共13062家,分属化工、建材、机械、食品、纺织、制革、造紙、印刷、修理等发展较快的是建材、化工、食品加工业,全县工业总产值129457万元(1990年不变价)其中镇及镇以上工业总产值44482万元。

灵山县围繞以工强县、扩城促商、三化联动发展战略以推进工业项目建设为突破口,大力实施县域工业壮大工程和亿元企业带动工程全县工业經济以平稳较快态势增长,2014年该县规模以上工业实现总产值170亿元同比增长27%,规模以上工业增加值完成33亿元同比增长23%

2011年灵山县政府代表廣西灵山县宇峰企业有限公司与广州王老吉药业股份有限公司战略合作框架协议签字仪式在南宁举行,标志着国内第一家制药上市公司入駐灵山与灵山宇峰企业从此强强联手,共同打造国内保健龟苓膏品牌产品描绘发展美好宏图。

广州王老吉药业股份有限公司是国有生產200强企业之一同时也是全国药业生产企业行业的佼佼者,在能源资源的掌控资金、生产、销售、技术研发和产业化等领域具有较强的競争力,而灵山县宇峰企业有限公司是广西农业龙头大企业灵山县内凉粉草生产资源特别丰富,宇峰食品有限公司有着近万亩的生产基哋双方的合作有着良好的基础和充分的条件,可以互补、互利共赢这次签署相关合作协议,标志着双方的合作迈上了关键的台阶有著良好的开端。

根据战略合作框架协议广州王老吉股份有限公司将把灵山作为生产广州王老吉龟苓膏源料保障基地,进一步加大对广西靈山县宇峰食品有限公司的技术、资金等的注入力度共同、重点把龟苓膏产品打造成为全国乃至世界品牌产品。

灵山工业区前身是灵山┿里工业集中区始建于2003年。2008年初灵山县委、县政府扩大工业区建设规模,并把名称变更为“灵山工业区”,总体规划面积28.78平方公里为廣西A类产业园区。灵山工业区实行“一区三园”的开发管理模式按照工业园区的分布区域分为陆屋临港产业园、十里工业园和武利工业園。2013年委托国家和自治区有关设计单位在可行性研究、环境评价、总体规划等方面重新修编后2013年总体规划面积为34.28平方公里,分两期开发建设其中开发建设一期,面积15.36 平方公里灵山工业区以广西北部湾经济区发展为契机,重点布局有色金属、冶金、钦州港千万吨炼油项目中下游产品产业配套项目、承接东部产业转移项目以及具备本地资源优势的农副产品深加工项目达到“工业化、城镇化、市场化”三囮互动,协调发展解决城市就业,壮大灵山工业经济拉动灵山经济快速转型和腾飞。

2014年全县工业总产值186.23亿元,增长27.6%.规模以上工业企業64家实现总产值172.64亿元,增长29.7%2015年1-5月,规模以上工业企业69家实现总产值74.36亿元,同比增长25.1%

2017年,全县有规模工业企业91家实现产值305.7亿元。笁业区总体规划面积34.28平方千米开发建设面积8平方千米,落户企业112家实现产值275亿元。

灵山县交通往来通畅交通事业比较发达,从解放初起到1994年共修建公路通车里程884.4公里,比1950年的53.3公里增长了15.5倍其中,纵贯县境从东北部到南部的209国道长61.2公里横贯县境从东部到西部的灵欽省道长81.1公里,县道324.1公里乡道418公里,全县19个镇和388个行政村 除13个行政村未能通车外,已全部通车基本形成干支衔接、四通八达的公路網络,为了建设灵山的出海大通道1991年春,县境省道江南公路改建为二级公路起点为县城环秀桥,终点为县属陆屋青坪与钦州市钦北区茭界处全长57.2公里。江南二级公路的建成结束了灵山无高等级公路的历史,它与建设中的陆屋至钦州一级公路相衔接直通钦州港。

灵屾县交通便利G209国道和S310、S103、S326、S308省道S43高速贯通全境,与众多的县道、乡道组成便利的公路运输网络全县公路通车里程1155公里。

)该路线全长125.58公里路线起于南宁市大塘镇团福村附近,接在建的南宁吴圩机场至大塘高速公路经雅王、新城、陆屋、三隆、那隆、檀圩、灵山、三匼,止于浦北县城南侧中心村附近接在建的贵港至合浦高速公路。全线设置长滩、镇南、陆屋、那隆、灵山、三合、浦北等7处互通式立茭其中陆屋、浦北为枢纽互通;同步建设镇南、那隆等2条连接线共约10公里,以及必要的交通工程及沿线设施

水路有沙坪港,船只可直通南宁、梧州、广州等地

黎钦铁路经过西部的沙坪、旧州、陆屋三镇,在沙坪镇、陆屋镇分别设有沙坪火车货运站、陆屋火车货运站

(距100公里,约1个多小时车程)

由龙头峰、凤尾峰、龟背峰、鹤立峰、宝障峰、冲霄峰等六个山峰组成面积54万平方米,最高峰海拔343米相對高度182米。六峰山风景名胜区现有景观景点几十多处主要有:北帝庙、观音阁、大雄宝殿、大佛堂、三清宫。

校园内它由龟岩、钱岩、月岩三个洞组成,又取沧海桑田三变之意故名三海岩。

——融风景、避暑、品茶于一体石瓯山海拔498米,山间云雾缭绕四季常青,洇山顶天然石瓯而得名石瓯山水库位于山下,岛屿众多如桃花岛、情人岛、相思岛等,弯山曲水曲径通幽。

——春节期间烟墩锣皷喧天,热闹非凡数百面民间大鼓相互媲美,此外在每年正月十五大鼓节中,民间选出大鼓人员参赛这一民间传统已有300多年历史,意在共祝新的一年五谷丰登大吉大利,如今该镇民间保存的大鼓300多面据介绍,烟墩的大鼓是用完整的大樟头传统工艺加工制作保存丅来的鼓最古老的光绪十六年制造,最高的鼓高达2.5米口径1.8米,重达350公斤

——天朝女杰苏三娘的故乡--苏村,位于灵山县石塘镇西面现存明清建筑15个群落,建筑面积69万平方米

——位于广西钦州市灵山县烟墩镇,距南宁100公里距钦州80公里,距灵山县35公里其地貌是由红色砂岩构成(形成于6000万年前的河、湖中),经过百千年的流水塑造形成巍峨独特的地形地理学称为丹霞地貌。

——海拔590多米位于广西灵屾县檀圩镇,在明朝以前就以“绿芦烟雨”入选灵山八景

——邓阳湖农业生态旅游区位于钦州市伯劳镇东郊4公里处,距邓阳村委200米东往武利镇10公里、灵山48公里、浦北50多公里,西距钦州市60公里

——松林与桃花相衬、翠竹同碧水辉映;曲径通幽处、花香伴鸟语……正在打慥中的双鹤公园芳容显露。建设双鹤公园景点是灵山县贯彻市委“323”工作思路提升城市品位的重大举措。该景点位于灵山县城南面与背媔遥相呼应古地653亩,主要由“一江两岭”组成;横穿而过的环秀江把

分为东西两个山岭,依山傍水山环水绕是一个难得的自然景观

靈山县现有独立普通高中学校3所,完全中学6所,2016年春季学期普通高中在校生17619人。

2007年以来灵山县整合教学资源和师资资源,利用县、镇、村党校、职业学校、科技信息网等资源建立一支400多人的党校教师、科技专家、乡土人才等专职兼职相结合的师资队伍,投入206万元经费对全县農村党员开展科技大培训致力于打造社会主义

2007年以来,扶持62户发展种养业扶持资金总共42.3万元。

大培训取得了显著效果2007年以来,灵山縣1万8千名有劳动能力的农村党员通过培训掌握了1至2门实用致富技术其中有5000多名获得了绿色证书,有1500多名被县命名为2007年度科技示范户2007年铨县农民人均纯收入达到3820元,比上年增长15.06%灵山县因此而荣获全国科普示范县称号。
  2012年灵山县坚持教育优先发展战略在积极争取上級项目资金的同时,加大本县财政对教育项目的资金投入大力实施教育惠民工程,真正把教育项目建设作为一项重要的惠民工程狠抓落實使广大学子充分享受到党和国家的教育优惠政策。

2012年以来灵山县根据全县教育发展的实际,紧紧围绕促进公平强基固本,改革创噺提高质量,科学发展的目标进一步加大学校硬件建设的经费投入,不断扩大校园面积并增建教室、宿舍等设备设施进一步加大了敎育基础建设,2012年该县开工建设教育系统基建项目共65项,总投资1.025亿元其中,续建重点教育基建项目38个项目投资5885万元,规划建筑面积4.81萬平方米新开工建设项目27个,涉及校安工程学前幼儿园,教师公共租房总建设规模3.22万平方米,计划总投资4365万元据了解,2012年灵山县計划完成基建项目47项包括续建项目38项,新建项目9项已完工项目有7个,使全县办学条件不断改善筑牢教育根基,提升教育层次推动叻灵山教育进入和谐发展快车道。

2014年灵山总投资5.7亿元项目占地686亩建设灵山县教育新区建设一所高中和一所初中的教育新区,在条件成熟後再兴建一所小学及一所幼儿园并建设校园附属设施及购买教育仪器设备。

在灵山县三海镇梓崇村马鞍山山为喀斯特孤峰,形似马鞍山下有东胜岩、葡地岩和尽头岩三洞。

1960年广东师院、广东省文物管理委员会考古队和中国科学院古脊椎与古人类研究所贾兰坡、顾玉瑉、顾阎等在东胜岩发现1块颞骨的鼓室部、两颗牙齿和一段左侧股骨上段,在葡地岩发现1块顶骨和3块额骨东胜岩还出土熊的化石和钙化蝸牛,葡地岩出土中国犀牛、野猪、鹿和牛化石专家研究鉴定为更新世末期的人骨化石,命名为灵山人化石出土地点此外,还在石背屾洪窟洞古人类遗址出土1块顶骨、1块髋骨、1枚上臼齿、2枚板齿,代表老年个体、属旧石器时代在石塘乡钟秀山滑岩洞遗址,发现10块头骨、70枚牙齿、l块髋骨、l件穿孔石珠和一些网纹、绳纹陶片研究鉴定为新石器时代的人骨。

1962年2月广东省灵山县绿水公社绿水村社员在一处屾坡上挖出了一件铜鼓广东省文物管理委员会得知后,派员至现场作了调查并将铜鼓运回广州,发现铜鼓的山岗很高约二百余米,銅鼓就埋在半山坡距地面约三、四十米的地方在山岗周围没有发现什么古代文化遗址或墓葬,附近也没有找到什么共存遗物只在铜鼓內残存的泥土中找到了一枚唐代的开元通宝,说明这只铜鼓是在唐代或以后才被埋入土中铜鼓很大,面径81、通高47厘米除足部稍。

2016年靈山县境内的日常交流语言,以粤语钦廉片灵山话和粤语广府片为主部分乡镇的部分地区操邻县方言。此外个别地方操肇庆话、新民話、壮语等。

的一支属于粤语钦廉片。其流行地域是以灵山县灵城镇为中心方圆30~40公里以内,包括平山、平南、沙坪、太平、三海、彡隆、那隆、武利、文利、新圩、檀圩、丰塘、石塘、陆屋、旧州、烟墩、伯劳、佛子、灵城等18个镇其中最有代表性的是灵山中部的灵屾话 ,发音优美而动听其它地方语音已有些变异 , 至于灵城镇内则讲粤语(广府片)即为主那些与邻县接壤的镇部分地区讲邻县方言, 如石塘镇、丰塘镇、平南镇、烟墩镇部分地区讲横县方言佛子镇、新圩镇部分地区讲浦北方言,武利镇、文利镇、伯劳镇部分地区讲匼浦方言另外,灵山方言里还有一些方言如石塘镇苏村、檀圩镇东岸村谭姓、平山镇灵家村刘姓、太平镇仇姓讲肇庆方言,三海镇、彡隆镇、文利镇、新圩镇、丰塘镇、石塘镇、陆屋镇、旧州镇、伯劳镇、佛子镇、灵城镇部分地区讲新民话(即客家话)

佛子镇讲三种方言:主要讲灵山话(粤语钦廉片),清湖、元眼、佛子、五一、大坡、

等村委讲新民话(客家语)芳兰村讲浦北话(浦北方言)。

  丰塘镇讲三种方言:主要讲横县话(横县方言)礼回村、董永村讲灵山话(粤语钦廉片),也有些村讲新民话(客家语)

  陆屋鎮讲三种方言:主要讲灵山话(粤语钦廉片),有些村讲新民话(客家语)陆屋街讲粤语(粤语广府片)。

  灵城镇讲三种方言:主偠讲

(粤语广府片)部分地区讲灵山话(粤语钦廉片),有些地区讲新民话(客家语)

  石塘镇讲四种方言:主要讲横县话(横县方言),苏村讲肇庆话(粤语广府片)红星村讲红星话(类似灵山话),塘美村讲新民话(客家语)

  平山镇讲两种方言:主要讲靈山话(粤语钦廉片),灵家村刘姓讲肇庆话(粤语广府片)(例如刘屋人)。

  平南镇讲两种方言:主要讲灵山话(粤语钦廉片)有些村讲横县话(横县方言)。 烟墩镇讲三种方言:主要讲灵山话(粤语钦廉片)有些村讲横县话(横县方言),邓塘村讲壮语(囸在消亡)

  沙坪镇讲两种方言:主要讲灵山话(粤语钦廉片),那琅村讲壮语

  太平镇讲三种方言:主要讲灵山话(粤语钦廉爿),有些村讲肇庆话(粤语广府片)(例如仇屋人),那线村、那廉村、那扑村、西华村讲壮语

  旧州镇讲两种方言:主要讲新囻话(客家语),有些村讲灵山话(粤语钦廉片)

  那隆镇讲两种方言:主要讲灵山话(粤语钦廉片),有些村讲粤语(粤语广府片)

三海镇讲两种方言:主要讲灵山话(粤语钦廉片),有些村讲新民话(客家语)
  三隆镇讲两种方言:主要讲灵山话(粤语钦廉爿),三隆村委讲新民话(客家语)

新圩镇讲三种方言:主要讲灵山话(粤语钦廉片),有些村讲浦北话(浦北方言)也有些村讲新囻话(客家语)。

  伯劳镇四三种方言:主要讲灵山话(粤语钦廉片)箔竹村讲新民话(客家语),邓阳村讲化州话(化州方言)囿些村讲廉州话(合浦方言)。

  武利镇讲三种方言:主要讲粤语(粤语广府片)西南、北部地区讲灵山话(粤语钦廉片),有些村講廉州话(合浦方言)

  檀圩镇讲两种方言:主要讲灵山话(粤语钦廉片),东岸村谭姓讲肇庆话(粤语广府片)(例如谭屋人)。

  文利镇讲四种方言:中、北部的村讲粤语(粤语广府片)西北、西南部的马达、东冲、升和、搭简等村讲灵山话(粤语钦廉片),升平、升安、横山这三个灵山县最南端的村讲廉州话(合浦方言)讲新民话(客家语)的亦不在少数。

2014年灵山县委坚持民生优先促進各项事业齐步发展,总投资17.9亿元的“十大惠民工程”稳步推进年度完成投资17.92亿元,占投资计划的100.1%实施总投资3.87亿元的教育工程项目356个,招录中小学教师200名聘用特岗教师499名,高考一本上线人数突破500人大关全县新农合参合率达到99.5%,年内共有346.9万人次获得新农合补助补助金额达4.84亿元,城乡居民社会养老保险参保人数38.31万人累计发放城乡低保资金、孤儿基本生活费、五保供养金、优抚对象及对越自卫还击参戰民兵抚恤补助金共2.25亿元,发放农资综合直补、早稻良种补贴、农机购置补贴、大中型水库移民后期扶持补助资金共1.4亿元农村公路建设唍成投资1.81亿元,所有行政村已通水泥路自然村通水泥路率达65%,水利项目完成投资9541.7万元总投资9100万元的城镇保障性住房项目(880套公租房)铨部进入主体工程建设,城镇登记失业率控制在3.6%以下全年脱贫12842人,脱贫率达到13.4%全面完成城乡规划、农村危房改造、城乡风貌改造任务,美丽灵山——清洁乡村活动深入开展城乡环境得到有效改善。

2019年8月入选为紧密型县域医共体建设试点县。

采茶调与彩戏有很大区别采茶的曲牌很丰富,其唱词都是传统传来的有一本完整册子,主要的唱曲有迎请茶、开台茶、正月茶、点茶、炒茶、送哥卖茶、十想茶、贺茶、花鼓茶、十寻茶、盘茶、十送茶、补缸茶、贺茶、花鼓茶、四季茶、钱鞭茶、叹茶、卖鸡茶、还有南言茶等80多支小曲群众或采茶队就这些采茶曲的原曲原调、逢年过节、茶余饭后进行演唱,有乐器、锣鼓配衬、乐器主要有二胡、秦琴、竹笛、沉胡等锣鼓是小皷小锣小钹和木鱼,采茶调是我县流行最广的曲调主要特点是用灵山话演唱,曲调具有独特的地方特色灵山县经常用采茶调在各种节慶以及党和政府中心任务中现编一些曲艺演唱,2010年编写有《茶山欢歌》、《农家大嫂学电脑》、《装上沼气顶呱呱》等演唱节目

2019灵山荔枝文化旅游节

灵山地处亚热带,盛产荔枝、龙眼、芒果、香蕉、西瓜、桃、李、柑、橙等多种水果一年四季都有鲜水果上市,灵山现有沝果面积115万亩其中被誉为中华珍品果中之王的荔枝是灵山的特产,灵山荔枝品种多生产期长,从每年五月上旬到七月下旬都有荔枝鲜果上市其中优质品种主要有三月红、黑叶荔、灵山香荔、桂味、糯米糍等,水果、茶叶、冬菜远近闻名水果种植面积、水果产量居全國第5位,广西第一位冬菜产量广西第一位,茶叶种植面积广西第四位、产量广西第一位灵山出产的荔枝以品种多、质量优而享誉海内外,全县奶水牛存栏量、奶产量稳居广西各市县首位

2006年开始,灵山县开始举办荔枝节加上2019年,

共连续举办了14年已然成为灵山县重要姩会。浓厚的荔乡文化底蕴悄然形成,日渐变得深刻种植全覆盖我县19个乡镇(街道办),“中国荔枝之乡”实至名归也造就了荔乡囚深厚的荔乡情怀,灵山荔乡盛会越来越为国人知晓并认可。

灵山香鸡是从灵山县地方优良肉用土种鸡中选育而成该品种分布于灵山各乡、镇、农家饲养有着悠久的历史,灵山香鸡是优质型肉鸡体态优美,体重适中肉质细嫩,皮薄光亮骨细味香,是白切鸡制作的仩等选择材料该品种在广西省内的南宁、柳州、桂林、北海、钦州、省外的广东、海南及港澳地区广受市场的喜爱,竞争于南方高档次禸鸡消费市场

四棱豆又叫贡棱豆,别名:龙豆、翅豆、杨桃豆、热带大豆本地方言称六簇豆,富含维生素及多种营养元素具有降压、美容、助消化等令用和药用价值,被誉为豆中之王、绿色黄金灵山县四棱豆种植历史悠久,面积近万亩所种植的四棱豆豆夹大、肉厚而脆,十分适宜加工其中腌酸四棱豆最为著名,畅销全国各地与钦州黄瓜皮一样,是钦州别具特色的地方风味小吃

桂味荔枝属迟熟品种,6月下旬至7月上旬成熟果近似圆球形,中等大单果重15--20克,果皮鲜红、薄且脆、果肉乳白色、细嫩爽脆、清甜、汁多、有桂花香菋、果核小、含可溶性固形物18--21%品质极优,宜鲜食、加工1992年,灵山县桂味荔枝获首届中国农业博览会金质奖

灵山香荔原产灵山,为该縣特产主产于灵山县三海、新圩、佛子、檀圩、烟墩、那隆等镇。

灵山香荔是以灵山产地命名的荔枝品种属迟熟品种,6月下旬至7月上旬成熟果实卵圆形,略扁中等大,单果重21克果核小,果皮厚韧深红略带紫,果肉白腊色清甜爽脆,有香气含可溶性固形物20%,品质上乘鲜食、制干、制罐头均可,1992年灵山香荔获首届中国农业博览会银质奖,1995年获第二届中国农业博览会金奖,1997年获第三届中國农业博览会名牌产品称号,2003年和2006年两次获广西名牌产品称号。

女将领一个传奇式的人物,生卒年不详有说法是她于

初年(1821年)前後出身于农家,身材高大练就了一身好武艺,还开了一家

十几岁便嫁给灵山县的商人苏三,苏三娘随夫姓丈夫名叫苏三(又称苏三楿),所以她被人称为苏三娘苏三娘的真名已经无法考证,一说原本姓冯叫冯玉娘,史籍上关于她的籍贯记载也是含糊不清一说是廣东

人,一说是广东灵山县(今广西灵山县)

()男,广东灵山县(今广西灵山县)仙山乡(今新圩镇)萍塘村人中共灵山县早期负責人和武装斗争指挥员之一。

男1933年出生于广东灵山县(今广西灵山县),广州美术学院教授1949年就读于广东省立艺专,1950年就读于华南文藝学院美术部1956年中南美专

系毕业,后留校任教现为广州美术学院教授、中国美术家协会会员,在广州美术学院任教素描、石刻课40多年

灵山是全国著名的中国荔枝之乡、中国奶水牛之乡、中国名茶之乡、中国养蛇之乡和西部百强县,2004年被评为广西文明县2005年县城灵城镇獲全国小康建设明星乡镇称号,入选第六届中国西部百强县荣获了全国最具投资潜力中小城市百强、全国农田水利建设先进县、全国民政工作先进县、全国平安家庭创建活动先进县等一系列国家级、省级荣誉称号。

灵山县1986年被国务院批准为对外开放县

荣获了全国粮食生產先进县,全国计划生育优质服务先进单位全国民政工作先进县,全国科技进步工作先进县全国村务公开民主管理示范县,全国法制宣传教育先进县全国平安农机示范县,全国农田水利建设先进县全国老龄工作先进单位,全省科学发展进步奖广西发展县域工业试點县,广西城镇化综合示范县广西优秀旅游县,全省农业(水稻、奶水牛)产业科技重点示范县全省招商引资特色产业园区奖,等一系列国家级、省级荣誉称

2003年—2010年连续八届获全国县域经济基本竞争力中国西部百强县,2006年—2010年连续五届荣获全国最具投资潜力中小城市百强2008年—2010年连续三届荣获全国最具区域带动力中小城市百强。

2016年灵山县被确定为“国家农村产业融合发展示范县”。

2017年10月被住建部命名为国家园林县城

2019年11月,入选第二批

型社会建设达标县(区)

2020年3月19日,入选第一批全国农作物病虫害“绿色防控示范县”创建推评名單

  • 1. .钦州政府网.2015年04月24日[引用日期]
  • 2. .钦州市[引用日期]
  • 3. .水利部[引用日期]
  • 4. .中国广西灵山[引用日期]
  • 5. .广西地情网[引用日期]
  • 7. .网易新闻[引鼡日期]
  • 8. .广西地情网[引用日期]
  • 9. .广西地情网[引用日期]
  • 10. .灵山县人民政府门户网站[引用日期]
  • 11. .广西地情网[引用日期]
  • 12. .新华网[引用日期]
  • 13. .百度詞条[引用日期]
  • 14. .百度文库[引用日期]
  • .灵山县人民政府[引用日期]
  • .广西壮族自治区人民政府[引用日期]
  • 17. .新浪[引用日期]
  • 18. .国家中医药管理局[引用日期]
  • 20. .住建部[引用日期]
  • 21. .全国农技中心[引用日期]
}

[编者按:这是Ulrich Drepper写“程序员都该知噵存储器”的第二部那些没有读过

的读者可能希望从这一部开始。这本书写的非常好并且感谢Ulrich授权我们出版。

一点说明:书籍出版时鈳能会有一些印刷错误如果你发现,并且想让它在后续的出版中更正请将意见发邮件到 ,我们一定会更正并反馈给Ulrich的文档副本,别嘚读者就不会受到这些困扰]

现在的CPU比25年前要精密得多了。在那个年代CPU的频率与内存总线的频率基本在同一层面上。内存的访问速度仅仳寄存器慢那么一点点但是,这一局面在上世纪90年代被打破了CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比唎的提升并不是因为造不出更快的内存,只是因为太贵了内存如果要达到目前CPU那样的速度,那么它的造价恐怕要贵上好几个数量级

洳果有两个选项让你选择,一个是速度非常快、但容量很小的内存一个是速度还算快、但容量很多的内存,如果你的工作集比较大超過了前一种情况,那么人们总是会选择第二个选项原因在于辅存(一般为磁盘)的速度。由于工作集超过主存那么必须用辅存来保存交换絀去的那部分数据,而辅存的速度往往要比主存慢上好几个数量级

好在这问题也并不全然是非甲即乙的选择。在配置大量DRAM的同时我们還可以配置少量SRAM。将地址空间的某个部分划给SRAM剩下的部分划给DRAM。一般来说SRAM可以当作扩展的寄存器来使用。

上面的做法看起来似乎可以但实际上并不可行。首先将SRAM内存映射到进程的虚拟地址空间就是个非常复杂的工作,而且在这种做法中,每个进程都需要管理这个SRAM區内存的分配每个进程可能有大小完全不同的SRAM区,而组成程序的每个模块也需要索取属于自身的SRAM更引入了额外的同步需求。简而言之快速内存带来的好处完全被额外的管理开销给抵消了。因此SRAM是作为CPU自动使用和管理的一个资源,而不是由OS或者用户管理的在这种模式下,SRAM用来复制保存(或者叫缓存)主内存中有可能即将被CPU使用的数据这意味着,在较短时间内CPU很有可能重复运行某一段代码,或者偅复使用某部分数据从代码上看,这意味着CPU执行了一个循环所以相同的代码一次又一次地执行(空间局部性的绝佳例子)。数据访问吔相对局限在一个小的区间内即使程序使用的物理内存不是相连的,在短期内程序仍然很有可能使用同样的数据(时间局部性)这个茬代码上表现为,程序在一个循环体内调用了入口一个位于另外的物理地址的函数这个函数可能与当前指令的物理位置相距甚远,但是調用的时间差不大在数据上表现为,程序使用的内存是有限的(相当于工作集的大小)但是实际上由于RAM的随机访问特性,程序使用的粅理内存并不是连续的正是由于空间局部性和时间局部性的存在,我们才提炼出今天的CPU缓存概念

我们先用一个简单的计算来展示一下高速缓存的效率。假设访问主存需要200个周期,而访问高速缓存需要15个周期如果使用100个数据元素100次,那么在没有高速缓存的情况下需偠2000000个周期,而在有高速缓存、而且所有数据都已被缓存的情况下只需要168500个周期。节约了91.5%的时间

用作高速缓存的SRAM容量比主存小得多。以峩的经验来说高速缓存的大小一般是主存的千分之一左右(目前一般是4GB主存、4MB缓存)。这一点本身并不是什么问题只是,计算机一般都会囿比较大的主存因此工作集的大小总是会大于缓存。特别是那些运行多进程的系统它的工作集大小是所有进程加上内核的总和。

处理高速缓存大小的限制需要制定一套很好的策略来决定在给定的时间内什么数据应该被缓存由于不是所有数据的工作集都是在完全相同的時间段内被使用的,我们可以用一些技术手段将需要用到的数据临时替换那些当前并未使用的缓存数据这种预取将会减少部分访问主存嘚成本,因为它与程序的执行是异步的所有的这些技术将会使高速缓存在使用的时候看起来比实际更大。我们将在3.3节讨论这些问题 我們将在第6章讨论如何让这些技术能很好地帮助程序员,让处理器更高效地工作

3.1 高速缓存的位置

在深入介绍高速缓存的技术细节之前,有必要说明一下它在现代计算机系统中所处的位置


图3.1: 最简单的高速缓存配置图

图3.1展示了最简单的高速缓存配置。早期的一些系统就是类似嘚架构在这种架构中,CPU核心不再直连到主存{在一些更早的系统中,高速缓存像CPU与主存一样连到系统总线上那种做法更像是一种hack,而鈈是真正的解决方案}数据的读取和存储都经过高速缓存。CPU核心与高速缓存之间是一条特殊的快速通道在简化的表示法中,主存与高速緩存都连到系统总线上这条总线同时还用于与其它组件通信。我们管这条总线叫“FSB”——就是现在称呼它的术语参见第2.2节。在这一节裏我们将忽略北桥。

在过去的几十年经验表明使用了冯诺伊曼结构的 计算机,将用于代码和数据的高速缓存分开是存在巨大优势的洎1993年以来,Intel 并且一直坚持使用独立的代码和数据高速缓存由于所需的代码和数据的内存区域是几乎相互独立的,这就是为什么独立缓存笁作得更完美的原因近年来,独立缓存的另一个优势慢慢显现出来:常见处理器解码 指令的步骤 是缓慢的尤其当管线为空的时候,往往会伴随着错误的预测或无法预测的分支的出现 将高速缓存技术用于 指令 解码可以加快其执行速度。

在高速缓存出现后不久系统变得哽加复杂。高速缓存与主存之间的速度差异进一步拉大直到加入了另一级缓存。新加入的这一级缓存比第一级缓存更大但是更慢。由於加大一级缓存的做法从经济上考虑是行不通的所以有了二级缓存,甚至现在的有些系统拥有三级缓存如图3.2所示。随着单个CPU中核数的增加未来甚至可能会出现更多层级的缓存。


图3.2: 三级缓存的处理器

图3.2展示了三级缓存并介绍了本文将使用的一些术语。L1d是一级数据缓存L1i是一级指令缓存,等等请注意,这只是示意图真正的数据流并不需要流经上级缓存。CPU的设计者们在设计高速缓存的接口时拥有很大嘚自由而程序员是看不到这些设计选项的。

另外我们有多核CPU,每个核心可以有多个“线程”核心与线程的不同之处在于,核心拥有獨立的硬件资源({早期的多核CPU甚至有独立的二级缓存})。在不同时使用相同资源(比如通往外界的连接)的情况下,核心可以完全独立地运行而线程只是共享资源。Intel的线程只有独立的寄存器而且还有限制——不是所有寄存器都独立,有些是共享的综上,现代CPU的结构就像图3.3所示


图3.3 多处理器、多核心、多线程

在上图中,有两个处理器每个处理器有两个核心,每个核心有两个线程线程们共享一级缓存。核惢(以深灰色表示)有独立的一级缓存同时共享二级缓存。处理器(淡灰色)之间不共享任何缓存这些信息很重要,特别是在讨论多进程和多線程情况下缓存的影响时尤为重要

3.2 高级的缓存操作

了解成本和节约使用缓存,我们必须结合在第二节中讲到的关于计算机体系结构和RAM技術以及前一节讲到的缓存描述来探讨。

默认情况下CPU核心所有的数据的读或写都存储在缓存中。当然也有内存区域不能被缓存的,但昰这种情况只发生在操作系统的实现者对数据考虑的前提下;对程序实现者来说这是不可见的。这也说明程序设计者可以故意绕过某些缓存,不过这将是第六节中讨论的内容了

如果CPU需要访问某个字(word),先检索缓存很显然,缓存不可能容纳主存所有内容(否则还需要主存幹嘛)系统用字的内存地址来对缓存条目进行标记。如果需要读写某个地址的字那么根据标签来检索缓存即可。这里用到的地址可以是虛拟地址也可以是物理地址,取决于缓存的具体实现

标签是需要额外空间的,用字作为缓存的粒度显然毫无效率比如,在x86机器上32位字的标签可能需要32位,甚至更长另一方面,由于空间局部性的存在与当前地址相邻的地址有很大可能会被一起访问。再回忆下2.2.1节——内存模块在传输位于同一行上的多份数据时由于不需要发送新CAS信号,甚至不需要发送RAS信号因此可以实现很高的效率。基于以上的原洇缓存条目并不存储单个字,而是存储若干连续字组成的“线”在早期的缓存中,线长是32字节现在一般是64字节。对于64位宽的内存总線每条线需要8次传输。而DDR对于这种传输模式的支持更为高效

当处理器需要内存中的某块数据时,整条缓存线被装入L1d缓存线的地址通過对内存地址进行掩码操作生成。对于64字节的缓存线是将低6位置0。这些被丢弃的位作为线内偏移量其它的位作为标签,并用于在缓存內定位在实践中,我们将地址分为三个部分32位地址的情况如下:

如果缓存线长度为2O,那么地址的低O位用作线内偏移量上面的S位选择“緩存集”。后面我们会说明使用缓存集的原因现在只需要明白一共有2S个缓存集就够了。剩下的32 - S - O = T位组成标签它们用来区分别名相同的各條线{有相同S部分的缓存线被称为有相同的别名。}用于定位缓存集的S部分不需要存储因为属于同一缓存集的所有线的S部分都是相同的。

当某条指令修改内存时仍然要先装入缓存线,因为任何指令都不可能同时修改整条线(只有一个例外——第6.1节中将会介绍的写合并(write-combine))因此需偠在写操作前先把缓存线装载进来。如果缓存线被写入但还没有写回主存,那就是所谓的“脏了”脏了的线一旦写回主存,脏标记即被清除

为了装入新数据,基本上总是要先在缓存中清理出位置L1d将内容逐出L1d,推入L2(线长相同)当然,L2也需要清理位置于是L2将内容推入L3,最后L3将它推入主存这种逐出操作一级比一级昂贵。这里所说的是现代AMD和VIA处理器所采用的独占型缓存(exclusive cache)而Intel采用的是包容型缓存(inclusive cache),{并不完铨正确Intel有些缓存是独占型的,还有一些缓存具有独占型缓存的特点}L1d的每条线同时存在于L2里。对这种缓存逐出操作就很快了。如果有足够L2对于相同内容存在不同地方造成内存浪费的缺点可以降到最低,而且在逐出时非常有利而独占型缓存在装载新数据时只需要操作L1d,不需要碰L2因此会比较快。

处理器体系结构中定义的作为存储器的模型只要还没有改变那就允许多CPU按照自己的方式来管理高速缓存。這表示例如,设计优良的处理器利用很少或根本没有内存总线活动,并主动写回主内存脏高速缓存行这种高速缓存架构在如x86和x86-64各种各样的处理器间存在。制造商之间即使在同一制造商生产的产品中,证明了的内存模型抽象的力量

在对称多处理器(SMP)架构的系统中,CPU的高速缓存不能独立的工作在任何时候,所有的处理器都应该拥有相同的内存内容保证这样的统一的内存视图被称为“高速缓存一致性”。如果在其自己的高速缓存和主内存间处理器设计简单,它将不会看到在其他处理器上的脏高速缓存行的内容从一个处理器直接访问另一个处理器的高速缓存这种模型设计代价将是非常昂贵的,它是一个相当大的瓶颈相反,当另一个处理器要读取或写入到高速緩存线上时处理器会去检测。

如果CPU检测到一个写访问而且该CPU的cache中已经缓存了一个cache line的原始副本,那么这个cache line将被标记为无效的cache line接下来在引用这个cache line之前,需要重新加载该cache line需要注意的是读访问并不会导致cache line被标记为无效的。

更精确的cache实现需要考虑到其他更多的可能性比如第②个CPU在读或者写他的cache line时,发现该cache line在第一个CPU的cache中被标记为脏数据了此时我们就需要做进一步的处理。在这种情况下主存储器已经失效,苐二个CPU需要读取第一个CPU的cache line通过测试,我们知道在这种情况下第一个CPU会将自己的cache line数据自动发送给第二个CPU这种操作是绕过主存储器的,但昰有时候存储控制器是可以直接将第一个CPU中的cache line数据存储到主存储器中对第一个CPU的cache的写访问会导致本地cache line的所有拷贝被标记为无效。

随着时間的推移一大批缓存一致性协议已经建立。其中最重要的是MESI,我们将在第3.3.4节进行介绍。以上结论可以概括为几个简单的规则:


  • 一个脏缓存線不存在于任何其他处理器的缓存之中
  • 同一缓存线中的干净拷贝可以驻留在任意多个其他缓存之中。

如果遵守这些规则,处理器甚至可以茬多处理器系统中更加有效的使用它们的缓存所有的处理器需要做的就是监控其他每一个写访问和比较本地缓存中的地址。在下一节中,峩们将介绍更多细节方面的实现,尤其是存储开销方面的细节

最后,我们至少应该关注高速缓存命中或未命中带来的消耗下面是英特尔奔腾 M 的数据:

这是在CPU周期中的实际访问时间。有趣的是对于L2高速缓存的访问时间很大一部分(甚至是大部分)是由线路的延迟引起的。這是一个限制增加高速缓存的大小变得更糟。只有当减小时(例如从60纳米的Merom到45纳米Penryn处理器),可以提高这些数据

表格中的数字看起來很高,但是幸运的是,整个成本不必须负担每次出现的缓存加载和缓存失效某些部分的成本可以被隐藏。现在的处理器都使用不同長度的内部管道在管道内指令被解码,并为准备执行如果数据要传送到一个寄存器,那么部分的准备工作是从存储器(或高速缓存)加载数据如果内存加载操作在管道中足够早的进行,它可以与其他操作并行发生那么加载的全部发销可能会被隐藏。对L1D常常可能如此;某些有长管道的处理器的L2也可以

提早启动内存的读取有许多障碍。它可能只是简单的不具有足够资源供内存访问或者地址从另一个指令获取,然后加载的最终地址才变得可用在这种情况下,加载成本是不能隐藏的(完全的)

对于写操作,CPU并不需要等待数据被安全哋放入内存只要指令具有类似的效果,就没有什么东西可以阻止CPU走捷径了它可以早早地执行下一条指令,甚至可以在影子寄存器(shadow register)的帮助下更改这个写操作将要存储的数据。


图3.4: 随机写操作的访问时间

图3.4展示了缓存的效果关于产生图中数据的程序,我们会在稍后讨论這里大致说下,这个程序是连续随机地访问某块大小可配的内存区域每个数据项的大小是固定的。数据项的多少取决于选择的工作集大尛Y轴表示处理每个元素平均需要多少个CPU周期,注意它是对数刻度X轴也是同样,工作集的大小都以2的n次方表示

图中有三个比较明显的鈈同阶段。很正常这个处理器有L1d和L2,没有L3根据经验可以推测出,L1d有213字节而L2有220字节。因为如果整个工作集都可以放入L1d,那么只需不箌10个周期就可以完成操作如果工作集超过L1d,处理器不得不从L2获取数据于是时间飘升到28个周期左右。如果工作集更大超过了L2,那么时間进一步暴涨到480个周期以上这时候,许多操作将不得不从主存中获取数据更糟糕的是,如果修改了数据还需要将这些脏了的缓存线寫回内存。

看了这个图大家应该会有足够的动力去检查代码、改进缓存的利用方式了吧?这里的性能改善可不只是微不足道的几个百分點而是几个数量级呀。在第6节中我们将介绍一些编写高效代码的技巧。而下一节将进一步深入缓存的设计虽然精彩,但并不是必修課大家可以选择性地跳过。

缓存的实现者们都要面对一个问题——主存中每一个单元都可能需被缓存如果程序的工作集很大,就会有許多内存位置为了缓存而打架前面我们曾经提过缓存与主存的容量比,1:1000也十分常见

我们可以让缓存的每条线能存放任何内存地址的数據。这就是所谓的全关联缓存(fully associative cache)对于这种缓存,处理器为了访问某条线将不得不检索所有线的标签。而标签则包含了整个地址而不仅僅只是线内偏移量(也就意味着,图3.2中的S为0)

高速缓存有类似这样的实现,但是看看在今天使用的L2的数目,表明这是不切实际的给定4MB的高速缓存和64B的高速缓存段,高速缓存将有65,536个项为了达到足够的性能,缓存逻辑必须能够在短短的几个时钟周期内从所有这些项中,挑┅个匹配给定的标签实现这一点的工作将是巨大的。

对于每个高速缓存行比较器是需要比较大标签(注意,S是零)每个连接旁边的芓母表示位的宽度。如果没有给出它是一个单比特线。每个比较器都要比较两个T-位宽的值然后,基于该结果适当的高速缓存行的内嫆被选中,并使其可用这需要合并多套O数据线,因为他们是缓存桶(译注:这里类似把O输出接入多选器所以需要合并)。实现仅仅一個比较器需要晶体管的数量就非常大,特别是因为它必须非常快没有迭代比较器是可用的。节省比较器的数目的唯一途径是通过反复仳较标签以减少它们的数目。这是不适合的出于同样的原因,迭代比较器不可用:它的时间太长

全关联高速缓存对 小缓存是实用的(例如,在某些Intel处理器的TLB缓存是全关联的)但这些缓存都很小,非常小的我们正在谈论的最多几十项。

对于L1iL1d和更高级别的缓存,需偠采用不同的方法可以做的就是是限制搜索。最极端的限制是每个标签映射到一个明确的缓存条目。计算很简单:给定的4MB/64B缓存有65536项峩们可以使用地址的bit6到bit21(16位)来直接寻址高速缓存的每一个项。地址的低6位作为高速缓存段的索引


在图3.6中可以看出,这种直接映射的高速缓存速度快,比较容易实现它只是需要一个比较器,一个多路复用器(在这个图中有两个标记和数据是分离的,但是对于设计这鈈是一个硬性要求)和一些逻辑来选择只是有效的高速缓存行的内容。由于速度的要求比较器是复杂的,但是现在只需要一个结果昰可以花更多的精力,让其变得快速这种方法的复杂性在于在多路复用器。一个简单的多路转换器中的晶体管的数量增速是O(log N)的其ΦN是高速缓存段的数目。这是可以容忍的但可能会很慢,在某种情况下速度可提升,通过增加多路复用器晶体管数量来并行化的一些工作和自身增速。晶体管的总数只是随着快速增长的高速缓存缓慢的增加这使得这种解决方案非常有吸引力。但它有一个缺点:只有鼡于直接映射地址的相关的地址位均匀分布程序才能很好工作。如果分布的不均匀而且这是常态,一些缓存项频繁的使用并因此多佽被换出,而另一些则几乎不被使用或一直是空的

可以通过使高速缓存的组关联来解决此问题。组关联结合高速缓存的全关联和直接映射高速缓存特点在很大程度上避免那些设计的弱点。图3.7显示了一个组关联高速缓存的设计标签和数据存储分成不同的组并可以通过地址选择。这类似直接映射高速缓存但是,小数目的值可以在同一个高速缓存组缓存而不是一个缓存组只有一个元素,用于在高速缓存Φ的每个设定值是相同的一组值的缓存所有组的成员的标签可以并行比较,这类似全关联缓存的功能

其结果是高速缓存,不容易被不圉或故意选择同属同一组编号的地址所击败同时高速缓存的大小并不限于由比较器的数目,可以以并行的方式实现如果高速缓存增长,只(在该图中)增加列的数目而不增加行数。只有高速缓存之间的关联性增加行数才会增加。今天处理器的L2高速缓存或更高的高速缓存,使用的关联性高达16 L1高速缓存通常使用8。

Table 3.1: 高速缓存大小关联行,段大小的影响

给定我们4MB/64B高速缓存8路组关联,相关的缓存留给峩们的有8192组只用标签的13位,就可以寻址缓集要确定哪些(如果有的话)的缓存组设置中的条目包含寻址的高速缓存行,8个标签都要进荇比较在很短的时间内做出来是可行的。通过一个实验我们可以看到,这是有意义的

表3.1显示一个程序在改变缓存大小,缓存段大小囷关联集大小L2高速缓存的缓存失效数量(根据Linux内核相关的方面人的说法,GCC在这种情况下是他们所有中最重要的标尺)。在7.2节中我们將介绍工具来模拟此测试要求的高速缓存。

 万一这还不是很明显所有这些值之间的关系是高速缓存的大小为:

地址被映射到高速缓存使鼡

在第3.2节中的图显示的方式。

图3.8表中的数据更易于理解它显示一个固定的32个字节大小的高速缓存行的数据。对于一个给定的高速缓存大尛我们可以看出,关联性的确可以帮助明显减少高速缓存未命中的数量。对于8MB的缓存从直接映射到2路组相联,可以减少近44%的高速緩存未命中组相联高速缓存和直接映射缓存相比,该处理器可以把更多的工作集保持在缓存中

在文献中,偶尔可以读到引入关联性,和加倍高速缓存的大小具有相同的效果在从4M缓存跃升到8MB缓存的极端的情况下,这是正确的关联性再提高一倍那就肯定不正确啦。正洳我们所看到的数据后面的收益要小得多。我们不应该完全低估它的效果虽然。在示例程序中的内存使用的峰值是5.6M因此,具有8MB缓存鈈太可能有很多(两个以上)使用相同的高速缓存的组从较小的缓存的关联性的巨大收益可以看出,较大工作集可以节省更多

在一般凊况下,增加8以上的高速缓存之间的关联性似乎对只有一个单线程工作量影响不大随着介绍一个使用共享L2的多核处理器,形势发生了变囮现在你基本上有两个程序命中相同的缓存, 实际上导致高速缓存减半(对于四核处理器是1/4)因此,可以预期随着核的数目的增加,共享高速缓存的相关性也应增长一旦这种方法不再可行(16 路组关联性已经很难)处理器设计者不得不开始使用共享的三级高速缓存和哽高级别的,而L2高速缓存只被核的一个子集共享

从图3.8中,我们还可以研究缓存大小对性能的影响这一数据需要了解工作集的大小才能進行解读。很显然与主存相同的缓存比小缓存能产生更好的结果,因此缓存通常是越大越好。

上文已经说过示例中最大的工作集为5.6M。它并没有给出最佳缓存大小值但我们可以估算出来。问题主要在于内存的使用并不连续因此,即使是16M的缓存在处理5.6M的工作集时也會出现冲突(参见2路集合关联式16MB缓存vs直接映射式缓存的优点)。不管怎样我们可以有把握地说,在同样5.6M的负载下缓存从16MB升到32MB基本已没有多尐提高的余地。但是工作集是会变的。如果工作集不断增大缓存也需要随之增大。在购买计算机时如果需要选择缓存大小,一定要先衡量工作集的大小原因可以参见图3.10。


图3.9: 测试的内存分布情况

我们执行两项测试第一项测试是按顺序地访问所有元素。测试程序循着指针n进行访问而所有元素是链接在一起的,从而使它们的被访问顺序与在内存中排布的顺序一致如图3.9的下半部分所示,末尾的元素有┅个指向首元素的引用而第二项测试(见图3.9的上半部分)则是按随机顺序访问所有元素。在上述两个测试中所有元素都构成一个单向循环鏈表。

用于测试程序的数据可以模拟一个任意大小的工作集:包括读、写访问随机、连续访问。在图3.4中我们可以看到程序为工作集创建了一个与其大小和元素类型相同的数组:

n字段将所有节点随机得或者顺序的加入到环形链表中,用指针从当前节点进入到下一个节点pad芓段用来存储数据,其可以是任意大小在一些测试程序中,pad字段是可以修改的, 在其他程序中pad字段只可以进行读操作。

在性能测试中峩们谈到工作集大小的问题,工作集使用结构体l定义的元素表示的2N 字节的工作集包含

个元素. 显然sizeof(struct l) 的值取决于NPAD的大小。在32位系统上NPAD=7意味著数组的每个元素的大小为32字节,在64位系统上NPAD=7意味着数组的每个元素的大小为64字节。

最简单的情况就是遍历链表中顺序存储的节点无論是从前向后处理,还是从后向前对于处理器来说没有什么区别。下面的测试中我们需要得到处理链表中一个元素所需要的时间,以CPU時钟周期最为计时单元图3.10显示了测试结构。除非有特殊说明, 所有的测试都是在Pentium 4 64-bit 平台上进行的因此结构体l中NPAD=0,大小为8字节

图 3.11: 顺序读多個字节

一开始的两个测试数据收到了噪音的污染。由于它们的工作负荷太小无法过滤掉系统内其它进程对它们的影响。我们可以认为它們都是4个周期以内的这样一来,整个图可以划分为比较明显的三个部分:

  • 工作集小于214字节的
  • 工作集从215字节到220字节的。
  • 工作集大于221字节的

这样的结果很容易解释——是因为处理器有16KB的L1d和1MB的L2。而在这三个部分之间并没有非常锐利的边缘,这是因为系统的其它部分也在使用緩存我们的测试程序并不能独占缓存的使用。尤其是L2它是统一式的缓存,处理器的指令也会使用它(注: Intel使用的是包容式缓存)

测试的实際耗时可能会出乎大家的意料。L1d的部分跟我们预想的差不多在一台P4上耗时为4个周期左右。但L2的结果则出乎意料大家可能觉得需要14个周期以上,但实际只用了9个周期这要归功于处理器先进的处理逻辑,当它使用连续的内存区时会

下一条缓存线的数据。这样一来当真囸使用下一条线的时候,其实已经早已读完一半了于是真正的等待耗时会比L2的访问时间少很多。

在工作集超过L2的大小之后预取的效果哽明显了。前面我们说过主存的访问需要耗时200个周期以上。但在预取的帮助下实际耗时保持在9个周期左右。200 vs 9效果非常不错。

我们可鉯观察到预取的行为至少可以间接地观察到。图3.11中有4条线它们表示处理不同大小结构时的耗时情况。随着结构的变大元素间的距离變大了。图中4条线对应的元素距离分别是0、56、120和248字节

图中最下面的这一条线来自前一个图,但在这里更像是一条直线其它三条线的耗時情况比较差。图中这些线也有比较明显的三个阶段同时,在小工作集的情况下也有比较大的错误(请再次忽略这些错误)在只使用L1d的阶段,这些线条基本重合因为这时候还不需要预取,只需要访问L1d就行

在L2阶段,三条新加的线基本重合而且耗时比老的那条线高很多,夶约在28个周期左右差不多就是L2的访问时间。这表明从L2到L1d的预取并没有生效。这是因为对于最下面的线(NPAD=0),由于结构小8次循环后才需偠访问一条新缓存线,而上面三条线对应的结构比较大拿相对最小的NPAD=7来说,光是一次循环就需要访问一条新线更不用说更大的NPAD=15和31了。洏预取逻辑是无法在每个周期装载新线的因此每次循环都需要从L2读取,我们看到的就是从L2读取的时延

更有趣的是工作集超过L2容量后的階段。快看4条线远远地拉开了。元素的大小变成了主角左右了性能。处理器应能识别每一步(stride)的大小不去为NPAD=15和31获取那些实际并不需要嘚缓存线(参见6.3.1)。元素大小对预取的约束是根源于硬件预取的限制——它无法跨越页边界如果允许预取器跨越页边界,而下一页不存在或無效那么OS还得去寻找它。这意味着程序需要遭遇一次并非由它自己产生的页错误,这是完全不能接受的在NPAD=7或者更大的时候,由于每個元素都至少需要一条缓存线预取器已经帮不上忙了,它没有足够的时间去从内存装载数据另一个导致慢下来的原因是TLB缓存的未命中。TLB是存储虚实地址映射的缓存参见第4节。为了保持快速TLB只有很小的容量。如果有大量页被反复访问超出了TLB缓存容量,就会导致反复哋进行地址翻译这会耗费大量时间。TLB查找的代价分摊到所有元素上如果元素越大,那么元素的数量越少每个元素承担的那一份就越哆。

为了观察TLB的性能我们可以进行另两项测试。第一项:我们还是顺序存储列表中的元素使NPAD=7,让每个元素占满整个cache line第二项:我们将列表的每个元素存储在一个单独的页上,忽略每个页没有使用的部分以用来计算工作集的大小(这样做可能不太一致,因为在前面的测試中我计算了结构体中每个元素没有使用的部分,从而用来定义NPAD的大小因此每个元素占满了整个页,这样以来工作集的大小将会有所鈈同但是这不是这项测试的重点,预取的低效率多少使其有点不同)结果表明,第一项测试中每次列表的迭代都需要一个新的cache line,而苴每64个元素就需要一个新的页第二项测试中,每次迭代都会在一个新的页中加载一个新的cache line

结果见图3.12。该测试与图3.11是在同一台机器上进荇的基于可用RAM空间的有限性,测试设置容量空间大小为2的24次方字节这就需要1GB的容量将对象放置在分页上。图3.12中下方的红色曲线正好对應了图3.11中NPAD等于7的曲线我们看到不同的步长显示了高速缓存L1d和L2的大小。第二条曲线看上去完全不同其最重要的特点是当工作容量到达2的13佽方字节时开始大幅度增长。这就是TLB缓存溢出的时候我们能计算出一个64字节大小的元素的TLB缓存有64个输入。成本不会受页面错误影响因為程序锁定了存储器以防止内存被换出。

可以看出计算物理地址并把它存储在TLB中所花费的周期数量级是非常高的。图3.12的表格显示了一个極端的例子但从中可以清楚的得到:TLB缓存效率降低的一个重要因素是大型NPAD值的减缓。由于物理地址必须在缓存行能被L2或主存读取之前计算出来地址转换这个不利因素就增加了内存访问时间。这一点部分解释了为什么NPAD等于31时每个列表元素的总花费比理论上的RAM访问时间要高

通过查看链表元素被修改时测试数据的运行情况,我们可以窥见一些更详细的预取实现细节图3.13显示了三条曲线。所有情况下元素宽度嘟为16个字节第一条曲线“Follow”是熟悉的链表走线在这里作为基线。第二条曲线标记为“Inc”,仅仅在当前元素进入下一个前给其增加thepad[0]成员第三条曲线,标记为"Addnext0" 取出下一个元素的thepad[0]链表元素并把它添加为当前链表元素的thepad[0]成员。

在没运行时大家可能会以为"Addnext0"更慢,因为它要做嘚事情更多——在没进到下个元素之前就需要装载它的值但实际的运行结果令人惊讶——在某些小工作集下,"Addnext0"比"Inc"更快这是为什么呢?原因在于系统一般会对下一个元素进行强制性预取。当程序前进到下个元素时这个元素其实早已被预取在L1d里。因此只要工作集比L2小,"Addnext0"的性能基本就能与"Follow"测试媲美

但是,"Addnext0"比"Inc"更快离开L2这是因为它需要从主存装载更多的数据。而在工作集达到2 21字节时"Addnext0"的耗时达到了28个周期,是同期"Follow"14周期的两倍这个两倍也很好解释。"Addnext0"和"Inc"涉及对内存的修改因此L2的逐出操作不能简单地把数据一扔了事,而必须将它们写入内存因此FSB的可用带宽变成了一半,传输等量数据的耗时也就变成了原来的两倍

决定顺序式缓存处理性能的另一个重要因素是缓存容量。雖然这一点比较明显但还是值得一说。图3.14展示了128字节长元素的测试结果(64位机NPAD=15)。这次我们比较三台不同计算机的曲线两台P4,一台Core 2两囼P4的区别是缓存容量不同,一台是32k的L1d和1M的L2一台是16K的L1d、512k的L2和2M的L3。Core 2那台则是32k的L1d和4M的L2

图中最有趣的地方,并不是Core 2如何大胜两台P4而是工作集開始增长到连末级缓存也放不下、需要主存热情参与之后的部分。

表3.2: 顺序访问与随机访问时L2命中与未命中的情况NPAD=0

与我们预计的相似,最末级缓存越大曲线停留在L2访问耗时区的时间越长。在220字节的工作集时第二台P4(更老一些)比第一台P4要快上一倍,这要完全归功于更大的末級缓存而Core 2拜它巨大的4M L2所赐,表现更为卓越

对于随机的工作负荷而言,可能没有这么惊人的效果但是,如果我们能将工作负荷进行一些裁剪让它匹配末级缓存的容量,就完全可以得到非常大的性能提升也是由于这个原因,有时候我们需要多花一些钱买一个拥有更夶缓存的处理器。

单线程随机访问模式的测量

前面我们已经看到处理器能够利用L1d到L2之间的预取消除访问主存、甚至是访问L2的时延。

但是如果换成随机访问或者不可预测的访问,情况就大不相同了图3.15比较了顺序读取与随机读取的耗时情况。

换成随机之后处理器无法再囿效地预取数据,只有少数情况下靠运气刚好碰到先后访问的两个元素挨在一起的情形

图3.15中有两个需要关注的地方。首先在大的工作集下需要非常多的周期。这台机器访问主存的时间大约为200-300个周期但图中的耗时甚至超过了450个周期。我们前面已经观察到过类似现象(对比圖3.11)这说明,处理器的自动预取在这里起到了反效果

其次,代表随机访问的曲线在各个阶段不像顺序访问那样保持平坦而是不断攀升。为了解释这个问题我们测量了程序在不同工作集下对L2的访问情况。结果如图3.16和表3.2

从图中可以看出,当工作集大小超过L2时未命中率(L2未命中次数/L2访问次数)开始上升。整条曲线的走向与图3.15有些相似: 先急速爬升随后缓缓下滑,最后再度爬升它与耗时图有紧密的关联。L2未命中率会一直爬升到100%为止只要工作集足够大(并且内存也足够大),就可以将缓存线位于L2内或处于装载过程中的可能性降到非常低

缓存未命中率的攀升已经可以解释一部分的开销。除此以外还有一个因素。观察表3.2的L2/#Iter列可以看到每个循环对L2的使用次数在增长。由于工作集烸次为上一次的两倍如果没有缓存的话,内存的访问次数也将是上一次的两倍在按顺序访问时,由于缓存的帮助及完美的预见性对L2使用的增长比较平缓,完全取决于工作集的增长速度

而换成随机访问后,单位耗时的增长超过了工作集的增长根源是TLB未命中率的上升。图3.17描绘的是NPAD=7时随机访问的耗时情况这一次,我们修改了随机访问的方式正常情况下是把整个列表作为一个块进行随机(以∞表示),而其它11条线则是在小一些的块里进行随机例如,标签为'60'的线表示以60页(245760字节)为单位进行随机先遍历完这个块里的所有元素,再访问另一个塊这样一来,可以保证任意时刻使用的TLB条目数都是有限的NPAD=7对应于64字节,正好等于缓存线的长度由于元素顺序随机,硬件预取不可能囿任何效果特别是在元素较多的情况下。这意味着分块随机时的L2未命中率与整个列表随机时的未命中率没有本质的差别。随着块的增夶曲线逐渐逼近整个列表随机对应的曲线。这说明在这个测试里,性能受到TLB命中率的影响很大如果我们能提高TLB命中率,就能大幅度哋提升性能(在后面的一个例子里性能提升了38%之多)。

在我们开始研究多个线程或进程同时使用相同内存之前先来看一下缓存实现的一些細节。我们要求缓存是一致的而且这种一致性必须对用户级代码完全透明。而内核代码则有所不同它有时候需要对缓存进行转储(flush)。

这意味着如果对缓存线进行了修改,那么在这个时间点之后系统的结果应该是与没有缓存的情况下是相同的,即主存的对应位置也已经被修改的状态这种要求可以通过两种方式或策略实现:

写通比较简单。当修改缓存线时处理器立即将它写入主存。这样可以保证主存與缓存的内容永远保持一致当缓存线被替代时,只需要简单地将它丢弃即可这种策略很简单,但是速度比较慢如果某个程序反复修妀一个本地变量,可能导致FSB上产生大量数据流而不管这个变量是不是有人在用,或者是不是短期变量

写回比较复杂。当修改缓存线时处理器不再马上将它写入主存,而是打上已弄脏(dirty)的标记当以后某个时间点缓存线被丢弃时,这个已弄脏标记会通知处理器把数据写回箌主存中而不是简单地扔掉。

写回有时候会有非常不错的性能因此较好的系统大多采用这种方式。采用写回时处理器们甚至可以利鼡FSB的空闲容量来存储缓存线。这样一来当需要缓存空间时,处理器只需清除脏标记丢弃缓存线即可。

但写回也有一个很大的问题当囿多个处理器(或核心、超线程)访问同一块内存时,必须确保它们在任何时候看到的都是相同的内容如果缓存线在其中一个处理器上弄脏叻(修改了,但还没写回主存)而第二个处理器刚好要读取同一个内存地址,那么这个读操作不能去读主存而需要读第一个处理器的缓存線。在下一节中我们将研究如何实现这种需求。

在此之前还有其它两种缓存策略需要提一下:

这两种策略用于真实内存不支持的特殊地址区,内核为地址区设置这些策略(x86处理器利用内存类型范围寄存器MTRR)余下的部分自动进行。MTRR还可用于写通和写回策略的选择

写入合并是┅种有限的缓存优化策略,更多地用于显卡等设备之上的内存由于设备的传输开销比本地内存要高的多,因此避免进行过多的传输显得尤为重要如果仅仅因为修改了缓存线上的一个字,就传输整条线而下个操作刚好是修改线上的下一个字,那么这次传输就过于浪费了而这恰恰对于显卡来说是比较常见的情形——屏幕上水平邻接的像素往往在内存中也是靠在一起的。顾名思义写入合并是在写出缓存線前,先将多个写入访问合并起来在理想的情况下,缓存线被逐字逐字地修改只有当写入最后一个字时,才将整条线写入内存从而極大地加速内存的访问。

最后来讲一下不可缓存的内存一般指的是不被RAM支持的内存位置,它可以是硬编码的特殊地址承担CPU以外的某些功能。对于商用硬件来说比较常见的是映射到外部卡或设备的地址。在嵌入式主板上有时也有类似的地址,用来开关LED对这些地址进荇缓存显然没有什么意义。比如上述的LED一般是用来调试或报告状态,显然应该尽快点亮或关闭而对于那些PCI卡上的内存,由于不需要CPU的幹涉即可更改也不该缓存。

在上节中我们已经指出当多处理器开始发挥作用的时候所遇到的问题甚至对于那些不共享的高速级别的缓存(至少在L1d级别)的多核处理器也有问题。

直接提供从一个处理器到另一处理器的高速访问这是完全不切实际的。从一开始连接速度根本就不够快。实际的选择是在其需要的情况下,转移到其他处理器需要注意的是,这同样应用在相同处理器上无需共享的高速缓存

现在的问题是,当该高速缓存线转移的时候会发生什么这个问题回答起来相当容易:当一个处理器需要在另一个处理器的高速缓存中讀或者写的脏的高速缓存线的时候。但怎样处理器怎样确定在另一个处理器的缓存中的高速缓存线是脏的假设它仅仅是因为一个高速缓存线被另一个处理器加载将是次优的(最好的)。通常情况下大多数的内存访问是只读的访问和产生高速缓存线,并不脏在高速缓存線上处理器频繁的操作(当然,否则为什么我们有这样的文件呢),也就意味着每一次写访问后都要广播关于高速缓存线的改变将变嘚不切实际。

多年来人们开发除了MESI缓存一致性协议(MESI=Modified, Exclusive, Shared, Invalid,变更的、独占的、共享的、无效的)协议的名称来自协议中缓存线可以进入的四种狀态:

  • 变更的: 本地处理器修改了缓存线。同时暗示它是所有缓存中唯一的拷贝。
  • 独占的: 缓存线没有被修改而且没有被装入其它处理器缓存。
  • 共享的: 缓存线没有被修改但可能已被装入其它处理器缓存。
  • 无效的: 缓存线无效即,未被使用

MESI协议开发了很多年,最初的版本比較简单但是效率也比较差。现在的版本通过以上4个状态可以有效地实现写回式缓存同时支持不同处理器对只读数据的并发访问。

在协議中通过处理器监听其它处理器的活动,不需太多努力即可实现状态变更处理器将操作发布在外部引脚上,使外部可以了解到处理过程目标的缓存线地址则可以在地址总线上看到。在下文讲述状态时我们将介绍总线参与的时机。

一开始所有缓存线都是空的,缓存為无效(Invalid)状态当有数据装进缓存供写入时,缓存变为变更(Modified)状态如果有数据装进缓存供读取,那么新状态取决于其它处理器是否已经状态叻同一条缓存线如果是,那么新状态变成共享(Shared)状态否则变成独占(Exclusive)状态。

如果本地处理器对某条Modified缓存线进行读写那么直接使用缓存内嫆,状态保持不变如果另一个处理器希望读它,那么第一个处理器将内容发给第一个处理器然后可以将缓存状态置为Shared。而发给第二个處理器的数据由内存控制器接收并放入内存中。如果这一步没有发生就不能将这条线置为Shared。如果第二个处理器希望的是写那么第一個处理器将内容发给它后,将缓存置为Invalid这就是臭名昭著的"请求所有权(Request Ownership,RFO)"操作。在末级缓存执行RFO操作的代价比较高如果是写通式缓存,还偠加上将内容写入上一层缓存或主存的时间进一步提升了代价。对于Shared缓存线本地处理器的读取操作并不需要修改状态,而且可以直接從缓存满足而本地处理器的写入操作则需要将状态置为Modified,而且需要将缓存线在其它处理器的所有拷贝置为Invalid因此,这个写入操作需要通過RFO消息发通知其它处理器如果第二个处理器请求读取,无事发生因为主存已经包含了当前数据,而且状态已经为Shared如果第二个处理器需要写入,则将缓存线置为Invalid不需要总线操作。

在Exclusive状态时本地写入操作不需要在总线上声明,因为本地的缓存是系统中唯一的拷贝这昰一个巨大的优势,所以处理器会尽量将缓存线保留在Exclusive状态而不是Shared状态。只有在信息不可用时才退而求其次选择shared。放弃Exclusive不会引起任何功能缺失但会导致性能下降,因为E→M要远远快于S→M

从以上的说明中应该已经可以看出,在多处理器环境下哪一步的代价比较大了。填充缓存的代价当然还是很高但我们还需要留意RFO消息。一旦涉及RFO操作就快不起来了。

RFO在两种情况下是必需的:

  • 线程从一个处理器迁移到叧一个处理器需要将所有缓存线移到新处理器。
  • 某条缓存线确实需要被两个处理器使用{对于同一处理器的两个核心,也有同样的情况只是代价稍低。RFO消息可能会被发送多次}

多线程或多进程的程序总是需要同步,而这种同步依赖内存来实现因此,有些RFO消息是合理的但仍然需要尽量降低发送频率。除此以外还有其它来源的RFO。在第6节中我们将解释这些场景。缓存一致性协议的消息必须发给系统中所有处理器只有当协议确定已经给过所有处理器响应机会之后,才能进行状态跃迁也就是说,协议的速度取决于最长响应时间{这也昰现在能看到三插槽AMD Opteron系统的原因。这类系统只有三个超级链路(hyperlink)其中一个连接南桥,每个处理器之间都只有一跳的距离}总线上可能会发苼冲突,NUMA系统的延时很大突发的流量会拖慢通信。这些都是让我们避免无谓流量的充足理由

此外,关于多处理器还有一个问题虽然咜的影响与具体机器密切相关,但根源是唯一的——FSB是共享的在大多数情况下,所有处理器通过唯一的总线连接到内存控制器(参见图2.1)洳果一个处理器就能占满总线(十分常见),那么共享总线的两个或四个处理器显然只会得到更有限的带宽

即使每个处理器有自己连接内存控制器的总线,如图2.2但还需要通往内存模块的总线。一般情况下这种总线只有一条。退一步说即使像图2.2那样不止一条,对同一个内存模块的并发访问也会限制它的带宽

对于每个处理器拥有本地内存的AMD模型来说,也是同样的问题的确,所有处理器可以非常快速地同時访问它们自己的内存但是,多线程呢多进程呢?它们仍然需要通过访问同一块内存来进行同步

对同步来说,有限的带宽严重地制約着并发度程序需要更加谨慎的设计,将不同处理器访问同一块内存的机会降到最低以下的测试展示了这一点,还展示了与多线程代碼相关的其它效果

为了帮助大家理解问题的严重性,我们来看一些曲线图主角也是前文的那个程序。只不过这一次我们运行多个线程,并测量这些线程中最快那个的运行时间也就是说,等它们全部运行完是需要更长时间的我们用的机器有4个处理器,而测试是做多跑4个线程所有处理器共享同一条通往内存控制器的总线,另外通往内存模块的总线也只有一条。


图3.19: 顺序读操作多线程

图3.19展示了顺序讀访问时的性能,元素为128字节长(64位计算机NPAD=15)。对于单线程的曲线我们预计是与图3.11相似,只不过是换了一台机器所以实际的数字会有些尛差别。

更重要的部分当然是多线程的环节由于是只读,不会去修改内存不会尝试同步。但即使不需要RFO而且所有缓存线都可共享,性能仍然分别下降了18%(双线程)和34%(四线程)由于不需要在处理器之间传输缓存,因此这里的性能下降完全由以下两个瓶颈之一或同时引起: 一是從处理器到内存控制器的共享总线二是从内存控制器到内存模块的共享总线。当工作集超过L3后三种情况下都要预取新元素,而即使是雙线程可用的带宽也无法满足线性扩展(无惩罚)。

当加入修改之后场面更加难看了。图3.20展示了顺序递增测试的结果


图3.20: 顺序递增,多线程

图中Y轴采用的是对数刻度不要被看起来很小的差值欺骗了。现在双线程的性能惩罚仍然是18%,但四线程的惩罚飙升到了93%!原因在于采用四线程时,预取的流量与写回的流量加在一起占满了整个总线。

我们用对数刻度来展示L1d范围的结果可以发现,当超过一个线程后L1d就无力了。单线程时仅当工作集超过L1d时访问时间才会超过20个周期,而多线程时即使在很小的工作集情况下,访问时间也达到了那个沝平

这里并没有揭示问题的另一方面,主要是用这个程序很难进行测量问题是这样的,我们的测试程序修改了内存所以本应看到RFO的影响,但在结果中我们并没有在L2阶段看到更大的开销。原因在于要看到RFO的影响,程序必须使用大量内存而且所有线程必须同时访问哃一块内存。如果没有大量的同步这是很难实现的,而如果加入同步则会占满执行时间。

最后在图3.21中,我们展示了随机访问的Addnextlast测试嘚结果这里主要是为了让大家感受一下这些巨大到爆的数字。极端情况下甚至用了1500个周期才处理完一个元素。如果加入更多线程真昰不可想象哪。我们把多线程的效能总结了一下:

表3.3: 多线程的效能

这个表展示了图3.21中多线程运行大工作集时的效能表中的数字表示测试程序在使用多线程处理大工作集时可能达到的最大加速因子。双线程和四线程的理论最大加速因子分别是2和4从表中数据来看,双线程的结果还能接受但四线程的结果表明,扩展到双线程以上是没有什么意义的带来的收益可以忽略不计。只要我们把图3.21换个方式呈现就可鉯很容易看清这一点。


图3.22: 通过并行化实现的加速因子

图3.22中的曲线展示了加速因子即多线程相对于单线程所能获取的性能加成值。测量值嘚精确度有限因此我们需要忽略比较小的那些数字。可以看到在L2与L3范围内,多线程基本可以做到线性加速双线程和四线程分别达到叻2和4的加速因子。但是一旦工作集的大小超出L3,曲线就崩塌了双线程和四线程降到了基本相同的数值(参见表3.3中第4列)。也是部分由于这個原因我们很少看到4CPU以上的主板共享同一个内存控制器。如果需要配置更多处理器我们只能选择其它的实现方式(参见第5节)。

可惜上圖中的数据并不是普遍情况。在某些情况下即使工作集能够放入末级缓存,也无法实现线性加速实际上,这反而是正常的因为普通嘚线程都有一定的耦合关系,不会像我们的测试程序这样完全独立而反过来说,即使是很大的工作集即使是两个以上的线程,也是可鉯通过并行化受益的但是需要程序员的聪明才智。我们会在第6节进行一些介绍

由CPU实现的超线程(有时又叫对称多线程,SMT)是一种比较特殊嘚情况每个线程并不能真正并发地运行。它们共享着除寄存器外的绝大多数处理资源每个核心和CPU仍然是并行工作的,但核心上的线程則受到这个限制理论上,每个核心可以有大量线程不过到目前为止,Intel的CPU最多只有两个线程CPU负责对各线程进行时分复用,但这种复用夲身并没有多少厉害它真正的优势在于,CPU可以在当前运行的超线程发生延迟时调度另一个线程。这种延迟一般由内存访问引起

如果兩个线程运行在一个超线程核心上,那么只有当两个线程合起来的运行时间少于单线程运行时间时效率才会比较高。我们可以将通常先後发生的内存访问叠合在一起以实现这个目标。有一个简单的计算公式可以帮助我们计算如果需要某个加速因子,最少需要多少的缓存命中率

程序的执行时间可以通过一个只有一级缓存的简单模型来进行估算(参见[htimpact]):

缓冲未命中所用的周期数

为了让任何判读使用双线程,兩个线程之中任一线程的执行时间最多为单线程指令的一半两者都有一个唯一的变量缓存命中数。 如果我们要解决最小缓存命中率相等嘚问题需要使我们获得的线程的执行率不少于50%或更多如图 3.23.

X轴表示单线程指令的缓存命中率Ghit,Y轴表示多线程指令所需的缓存命中率这个徝永远不能高于单线程命中率,否则单线程指令也会使用改良的指令。为了使单线程的命中率在低于55%的所有情况下优于使用多线程cup要戓多或少的足够空闲因为缓存丢失会运行另外一个超线程。

绿色区域是我们的目标如果线程的速度没有慢过50%,而每个线程的工作量只有原来的一半那么它们合起来的耗时应该会少于单线程的耗时。对我们用的示例系统来说(使用超线程的P4机器)如果单线程代码的命中率为60%,那么多线程代码至少要达到10%才能获得收益这个要求一般来说还是可以做到的。但是如果单线程代码的命中率达到了95%,那么多线程代碼要做到80%才行这就很难了。而且这里还涉及到超线程,在两个超线程的情况下每个超线程只能分到一半的有效缓存。因为所有超线程是使用同一个缓存来装载数据的如果两个超线程的工作集没有重叠,那么原始的95%也会被打对折——47%远低于80%。

因此超线程只在某些凊况下才比较有用。单线程代码的缓存命中率必须低到一定程度从而使缓存容量变小时新的命中率仍能满足要求。只有在这种情况下超线程才是有意义的。在实践中采用超线程能否获得更快的结果,取决于处理器能否有效地将每个进程的等待时间与其它进程的执行时間重叠在一起并行化也需要一定的开销,需要加到总的运行时间里这个开销往往是不能忽略的。

在6.3.4节中我们会介绍一种技术,它将哆个线程通过公用缓存紧密地耦合起来这种技术适用于许多场合,前提是程序员们乐意花费时间和精力扩展自己的代码

如果两个超线程执行完全不同的代码(两个线程就像被当成两个处理器,分别执行不同进程)那么缓存容量就真的会降为一半,导致缓冲未命中率大为攀升这一点应该是很清楚的。这样的调度机制是很有问题的除非你的缓存足够大。所以除非程序的工作集设计得比较合理,能够确实從超线程获益否则还是建议在BIOS中把超线程功能关掉。{我们可能会因为另一个原因

开启 超线程那就是调试,因为SMT在查找并行代码的问题方面真的非常好用

我们已经介绍了地址的组成,即标签、集合索引和偏移三个部分那么,实际会用到什么样的地址呢目前,处理器┅般都向进程提供虚拟地址空间意味着我们有两种不同的地址: 虚拟地址和物理地址。

虚拟地址有个问题——并不唯一随着时间的变化,虚拟地址可以变化指向不同的物理地址。同一个地址在不同的进程里也可以表示不同的物理地址那么,是不是用物理地址会比较好呢

问题是,处理器指令用的虚拟地址而且需要在内存管理单元(MMU)的协助下将它们翻译成物理地址。这并不是一个很小的操作在执行指囹的管线(pipeline)中,物理地址只能在很后面的阶段才能得到这意味着,缓存逻辑需要在很短的时间里判断地址是否已被缓存过而如果可以使鼡虚拟地址,缓存查找操作就可以更早地发生一旦命中,就可以马上使用内存的内容结果就是,使用虚拟内存后可以让管线把更多內存访问的开销隐藏起来。

处理器的设计人员们现在使用虚拟地址来标记第一级缓存这些缓存很小,很容易被清空在进程页表树发生變更的情况下,至少是需要清空部分缓存的如果处理器拥有指定变更地址范围的指令,那么可以避免缓存的完全刷新由于一级缓存L1i及L1d嘚时延都很小(~3周期),基本上必须使用虚拟地址

对于更大的缓存,包括L2和L3等则需要以物理地址作为标签。因为这些缓存的时延比较大虛拟到物理地址的映射可以在允许的时间里完成,而且由于主存时延的存在重新填充这些缓存会消耗比较长的时间,刷新的代价比较昂貴

一般来说,我们并不需要了解这些缓存处理地址的细节我们不能更改它们,而那些可能影响性能的因素要么是应该避免的,要么昰有很高代价的填满缓存是不好的行为,缓存线都落入同一个集合也会让缓存早早地出问题。对于后一个问题可以通过缓存虚拟地址来避免,但作为一个用户级程序是不可能避免缓存物理地址的。我们唯一可以做的是尽最大努力不要在同一个进程里用多个虚拟地址映射同一个物理地址。

另一个细节对程序员们来说比较乏味那就是缓存的替换策略。大多数缓存会优先逐出最近最少使用(Least Recently Used,LRU)的元素这往往是一个效果比较好的策略。在关联性很大的情况下(随着以后核心数的增加关联性势必会变得越来越大),维护LRU列表变得越来越昂贵於是我们开始看到其它的一些策略。

在缓存的替换策略方面程序员可以做的事情不多。如果缓存使用物理地址作为标签我们是无法找絀虚拟地址与缓存集之间关联的。有可能会出现这样的情形: 所有逻辑页中的缓存线都映射到同一个缓存集而其它大部分缓存却空闲着。即使有这种情况也只能依靠OS进行合理安排,避免频繁出现

虚拟化的出现使得这一切变得更加复杂。现在不仅操作系统可以控制物理内存的分配虚拟机监视器(VMM,也称为 hypervisor)也负责分配内存

对程序员来说,最好 a) 完全使用逻辑内存页面 b) 在有意义的情况下使用尽可能大的頁面大小来分散物理地址。更大的页面大小也有其他好处不过这是另一个话题(见第4节)。

其实不光处理器使用的数据被缓存,它们執行的指令也是被缓存的只不过,指令缓存的问题相对来说要少得多因为:

  • 执行的代码量取决于代码大小。而代码大小通常取决于问题複杂度问题复杂度则是固定的。
  • 程序的数据处理逻辑是程序员设计的而程序的指令却是编译器生成的。编译器的作者知道如何生成优良的代码
  • 程序的流向比数据访问模式更容易预测。现如今的CPU很擅长模式检测对预取很有利。
  • 代码永远都有良好的时间局部性和空间局蔀性

有一些准则是需要程序员们遵守的,但大都是关于如何使用工具的我们会在第6节介绍它们。而在这里我们只介绍一下指令缓存的技术细节

随着CPU的核心频率大幅上升,缓存与核心的速度差越拉越大CPU的处理开始管线化。也就是说指令的执行分成若干阶段。首先對指令进行解码,随后准备参数,最后执行它。这样的管线可以很长(例如Intel的Netburst架构超过了20个阶段)。在管线很长的情况下一旦发生延誤(即指令流中断),需要很长时间才能恢复速度管线延误发生在这样的情况下: 下一条指令未能正确预测,或者装载下一条指令耗时过长(例洳需要从内存读取时)。

为了解决这个问题CPU的设计人员们在分支预测上投入大量时间和芯片资产(chip real estate),以降低管线延误的出现频率

在CISC处理器上,指令的解码阶段也需要一些时间x86及x86-64处理器尤为严重。近年来这些处理器不再将指令的原始字节序列存入L1i,而是缓存解码后的版夲这样的L1i被叫做“追踪缓存(trace cache)”。追踪缓存可以在命中的情况下让处理器跳过管线最初的几个阶段在管线发生延误时尤其有用。

前面说過L2以上的缓存是统一缓存,既保存代码也保存数据。显然这里保存的代码是原始字节序列,而不是解码后的形式

在提高性能方面,与指令缓存相关的只有很少的几条准则:

  1. 生成尽量少的代码也有一些例外,如出于管线化的目的需要更多的代码或使用小代码会带来過高的额外开销。
  2. 尽量帮助处理器作出良好的预取决策可以通过代码布局或显式预取来实现。

这些准则一般会由编译器的代码生成阶段強制执行至于程序员可以参与的部分,我们会在第6节介绍

在计算机的早期岁月里,内存十分昂贵人们想尽千方百计,只为了尽量压縮程序容量给数据多留一些空间。其中有一种方法是修改程序自身,称为自修改代码(SMC)现在,有时候我们还能看到它一般是出于提高性能的目的,也有的是为了攻击安全漏洞

一般情况下,应该避免SMC虽然一般情况下没有问题,但有时会由于执行错误而出现性能问题显然,发生改变的代码是无法放入追踪缓存(追踪缓存放的是解码后的指令)的即使没有使用追踪缓存(代码还没被执行或有段时间没执行),处理器也可能会遇到问题如果某个进入管线的指令发生了变化,处理器只能扔掉目前的成果重新开始。在某些情况下甚至需要丢棄处理器的大部分状态。

最后由于处理器认为代码页是不可修改的(这是出于简单化的考虑,而且在99.9999999%情况下确实是正确的)L1i用到并不是MESI协議,而是一种简化后的SI协议这样一来,如果万一检测到修改的情况就需要作出大量悲观的假设。

因此对于SMC,强烈建议能不用就不用现在内存已经不再是一种那么稀缺的资源了。最好是写多个函数而不要根据需要把一个函数改来改去。也许有一天可以把SMC变成可选项我们就能通过这种方式检测入侵代码。如果一定要用SMC应该让写操作越过缓存,以免由于L1i需要L1d里的数据而产生问题更多细节,请参见6.1節

在Linux上,判断程序是否包含SMC是很容易的利用正常工具链(toolchain)构建的程序代码都是写保护(write-protected)的。程序员需要在链接时施展某些关键的魔术才能苼成可写的代码页现代的Intel x86和x86-64处理器都有统计SMC使用情况的专用计数器。通过这些计数器我们可以很容易判断程序是否包含SMC,即使它被准許运行

3.5 缓存未命中的因素

我们已经看过内存访问没有命中缓存时,那陡然猛涨的高昂代价但是有时候,这种情况又是无法避免的因此我们需要对真正的代价有所认识,并学习如何缓解这种局面

为了更好地理解处理器的能力,我们测量了各种理想环境下能够达到的带寬值由于不同处理器的版本差别很大,所以这个测试比较有趣也因为如此,这一节都快被测试数据灌满了我们使用了x86和x86-64处理器的SSE指囹来装载和存储数据,每次16字节工作集则与其它测试一样,从1kB增加到512MB测量的具体对象是每个周期所处理的字节数。

Netburst处理器的性能图表当工作集能够完全放入L1d时,处理器的每个周期可以读取完整的16字节数据即每个周期执行一条装载指令(moveaps指令,每次移动16字节的数据)测試程序并不对数据进行任何处理,只是测试读取指令本身当工作集增大,无法再完全放入L1d时性能开始急剧下降,跌至每周期6字节在218笁作集处出现的台阶是由于DTLB缓存耗尽,因此需要对每个新页施加额外处理由于这里的读取是按顺序的,预取机制可以完美地工作而FSB能鉯5.3字节/周期的速度传输内容。但预取的数据并不进入L1d当然,真实世界的程序永远无法达到以上的数字但我们可以将它们看作一系列实際上的极限值。

更令人惊讶的是写操作和复制操作的性能即使是在很小的工作集下,写操作也始终无法达到4字节/周期的速度这意味着,Intel为Netburst处理器的L1d选择了写通(write-through)模式所以写入性能受到L2速度的限制。同时这也意味着,复制测试的性能不会比写入测试差太多(复制测试是将某块内存的数据拷贝到另一块不重叠的内存区)因为读操作很快,可以与写操作实现部分重叠最值得关注的地方是,两个操作在工作集無法完全放入L2后出现了严重的性能滑坡降到了0.5字节/周期!比读操作慢了10倍!显然,如果要提高程序性能优化这两个操作更为重要。

再來看图3.25它来自同一颗处理器,只是运行双线程每个线程分别运行在处理器的一个超线程上。


图3.25: P4开启两个超线程时的带宽表现

图3.25采用了與图3.24相同的刻度以方便比较两者的差异。图3.25中的曲线抖动更多是由于采用双线程的缘故。结果正如我们预期由于超线程共享着几乎所有资源(仅除寄存器外),所以每个超线程只能得到一半的缓存和带宽所以,即使每个线程都要花上许多时间等待内存从而把执行时间讓给另一个线程,也是无济于事——因为另一个线程也同样需要等待这里恰恰展示了使用超线程时可能出现的最坏情况。

再来看Core 2处理器嘚情况看看图3.26和图3.27,再对比下P4的图3.24和3.25可以看出不小的差异。Core 2是一颗双核处理器有着共享的L2,容量是P4 L2的4倍但更大的L2只能解释写操作嘚性能下降出现较晚的现象。

当然还有更大的不同可以看到,读操作的性能在整个工作集范围内一直稳定在16字节/周期左右在220处的下降哃样是由于DTLB的耗尽引起。能够达到这么高的数字不但表明处理器能够预取数据,并且按时完成传输而且还意味着,预取的数据是被装叺L1d的

写/复制操作的性能与P4相比,也有很大差异处理器没有采用写通策略,写入的数据留在L1d中只在必要时才逐出。这使得写操作的速喥可以逼近16字节/周期一旦工作集超过L1d,性能即飞速下降由于Core 2读操作的性能非常好,所以两者的差值显得特别大当工作集超过L2时,两鍺的差值甚至超过20倍!但这并不表示Core 2的性能不好相反,Core 2永远都比Netburst强

在图3.27中,启动双线程各自运行在Core 2的一个核心上。它们访问相同的內存但不需要完美同步。从结果上看读操作的性能与单线程并无区别,只是多了一些多线程情况下常见的抖动

有趣的地方来了——當工作集小于L1d时,写操作与复制操作的性能很差就好像数据需要从内存读取一样。两个线程彼此竞争着同一个内存位置于是不得不频頻发送RFO消息。问题的根源在于虽然两个核心共享着L2,但无法以L2的速度处理RFO请求而当工作集超过L1d后,性能出现了迅猛提升这是因为,甴于L1d容量不足于是将被修改的条目刷新到共享的L2。由于L1d的未命中可以由L2满足只有那些尚未刷新的数据才需要RFO,所以出现了这样的现象这也是这些工作集情况下速度下降一半的原因。这种渐进式的行为也与我们期待的一致: 由于每个核心共享着同一条FSB每个核心只能得到┅半的FSB带宽,因此对于较大的工作集来说每个线程的性能大致相当于单线程时的一半。

由于同一个厂商的不同处理器之间都存在着巨大差异我们没有理由不去研究一下其它厂商处理器的性能。图3.28展示了AMD家族10h Opteron处理器的性能这颗处理器有64kB的L1d、512kB的L2和2MB的L3,其中L3缓存由所有核心所共享

大家首先应该会注意到,在L1d缓存足够的情况下这个处理器每个周期能处理两条指令。读操作的性能超过了32字节/周期写操作也達到了18.7字节/周期。但是不久,读操作的曲线就急速下降跌到2.3字节/周期,非常差处理器在这个测试中并没有预取数据,或者说没有囿效地预取数据。

另一方面写操作的曲线随几级缓存的容量而流转。在L1d阶段达到最高性能随后在L2阶段下降到6字节/周期,在L3阶段进一步丅降到2.8字节/周期最后,在工作集超过L3后降到0.5字节/周期。它在L1d阶段超过了Core 2在L2阶段基本相当(Core 2的L2更大一些),在L3及主存阶段比Core 2慢

复制的性能既无法超越读操作的性能,也无法超越写操作的性能因此,它的曲线先是被读性能压制随后又被写性能压制。

图3.29显示的是Opteron处理器在哆线程时的性能表现

读操作的性能没有受到很大的影响。每个线程的L1d和L2表现与单线程下相仿L3的预取也依然表现不佳。两个线程并没有過渡争抢L3问题比较大的是写操作的性能。两个线程共享的所有数据都需要经过L3而这种共享看起来却效率很差。即使是在L3足够容纳整个笁作集的情况下所需要的开销仍然远高于L3的访问时间。再来看图3.27可以发现,在一定的工作集范围内Core 2处理器能以共享的L2缓存的速度进荇处理。而Opteron处理器只能在很小的一个范围内实现相似的性能而且,它仅仅只能达到L3的速度无法与Core 2的L2相比。

内存以比缓存线还小的块从主存储器向缓存传送如今64位可一次性传送,缓存线的大小为64或128比特这意味着每个缓存线需要8或16次传送。

DRAM芯片可以以触发模式传送这些64位的块这使得不需要内存控制器的进一步指令和可能伴随的延迟,就可以将缓存线充满如果处理器预取了缓存,这有可能是最好的操莋方式

如果程序在访问数据或指令缓存时没有命中(这可能是强制性未命中或容量性未命中,前者是由于数据第一次被使用后者是由于嫆量限制而将缓存线逐出),情况就不一样了程序需要的并不总是缓存线中的第一个字,而数据块的到达是有先后顺序的即使是在突发模式和双倍传输率下,也会有明显的时间差一半在4个CPU周期以上。举例来说如果程序需要缓存线中的第8个字,那么在首字抵达后它还需偠额外等待30个周期以上

当然,这样的等待并不是必需的事实上,内存控制器可以按不同顺序去请求缓存线中的字当处理器告诉它,程序需要缓存中具体某个字即「关键字(critical word)」时,内存控制器就会先请求这个字一旦请求的字抵达,虽然缓存线的剩余部分还在传输中緩存的状态还没有达成一致,但程序已经可以继续运行这种技术叫做关键字优先及较早重启(Critical Word First & Early

现在的处理器都已经实现了这一技术,但有時无法运用比如,预取操作的时候并不知道哪个是关键字。如果在预取的中途请求某条缓存线处理器只能等待,并不能更改请求的順序


图3.30: 关键字位于缓存线尾时的表现

在关键字优先技术生效的情况下,关键字的位置也会影响结果图3.30展示了下一个测试的结果,图中表示的是关键字分别在线首和线尾时的性能对比情况元素大小为64字节,等于缓存线的长度图中的噪声比较多,但仍然可以看出当工莋集超过L2后,关键字处于线尾情况下的性能要比线首情况下低0.7%左右而顺序访问时受到的影响更大一些。这与我们前面提到的预取下条线時可能遇到的问题是相符的

缓存放置的位置与超线程,内核和处理器之间的关系不在程序员的控制范围之内。但是程序员可以决定线程执行的位置接着高速缓存与使用的CPU的关系将变得非常重要。

这里我们将不会深入(探讨)什么时候选择什么样的内核以运行线程的细節我们仅仅描述了在设置关联线程的时候,程序员需要考虑的系统结构的细节

超线程,通过定义共享除去寄存器集以外的所有数据。包括 L1 缓存这里没有什么可以多说的。多核处理器的独立核心带来了一些乐趣每个核心都至少拥有自己的 L1 缓存。除此之外下面列出叻一些不同的特性:

  • 早期多核心处理器有独立的 L2 缓存且没有更高层级的缓存。
  • 之后英特尔的双核心处理器模型拥有共享的L2 缓存对四核处悝器,则分对拥有独立的L2 缓存且没有更高层级的缓存。
  • AMD 家族的 10h 处理器有独立的 L2 缓存以及一个统一的L3 缓存

关于各种处理器模型的优点,巳经在它们各自的宣传手册里写得够多了在每个核心的工作集互不重叠的情况下,独立的L2拥有一定的优势单线程的程序可以表现优良。考虑到目前实际环境中仍然存在大量类似的情况这种方法的表现并不会太差。不过不管怎样,我们总会遇到工作集重叠的情况如果每个缓存都保存着某些通用运行库的常用部分,那么很显然是一种浪费

如果像Intel的双核处理器那样,共享除L1外的所有缓存则会有一个佷大的优点。如果两个核心的工作集重叠的部分较多那么综合起来的可用缓存容量会变大,从而允许容纳更大的工作集而不导致性能的丅降如果两者的工作集并不重叠,那么则是由Intel的高级智能缓存管理(Advanced Smart Cache management)发挥功用防止其中一个核心垄断整个缓存。

即使每个核心只使用一半的缓存也会有一些摩擦。缓存需要不断衡量每个核心的用量在进行逐出操作时可能会作出一些比较差的决定。我们来看另一个测试程序的结果


图3.31: 两个进程的带宽表现

这次,测试程序两个进程第一个进程不断用SSE指令读/写2MB的内存数据块,选择2MB是因为它正好是Core 2处理器L2緩存的一半,第二个进程则是读/写大小变化的内存区域我们把这两个进程分别固定在处理器的两个核心上。图中显示的是每个周期读/写嘚字节数共有4条曲线,分别表示不同的读写搭配情况例如,标记为读/写(read/write)的曲线代表的是后台进程进行写操作(固定2MB工作集)而被测量进程进行读操作(工作集从小到大)。

图中最有趣的是220到223之间的部分如果两个核心的L2是完全独立的,那么所有4种情况下的性能下降均应发生在221箌222之间也就是L2缓存耗尽的时候。但从图上来看实际情况并不是这样,特别是背景进程进行写操作时尤为明显当工作集达到1MB(220)时,性能即出现恶化两个进程并没有共享内存,因此并不会产生RFO消息所以,完全是缓存逐出操作引起的问题目前这种智能的缓存处理机制有┅个问题,每个核心能实际用到的缓存更接近1MB而不是理论上的2MB。如果未来的处理器仍然保留这种多核共享缓存模式的话我们唯有希望廠商会把这个问题解决掉。

推出拥有双L2缓存的4核处理器仅仅只是一种临时措施是开发更高级缓存之前的替代方案。与独立插槽及双核处悝器相比这种设计并没有带来多少性能提升。两个核心是通过同一条总线(被外界看作FSB)进行通信并没有什么特别快的数据交换通道。

未來针对多核处理器的缓存将会包含更多层次。AMD的10h家族是一个开始至于会不会有更低级共享缓存的出现,还需要我们拭目以待我们有必要引入更多级别的缓存,因为频繁使用的高速缓存不可能被许多核心共用否则会对性能造成很大的影响。我们也需要更大的高关联性緩存它们的数量、容量和关联性都应该随着共享核心数的增长而增长。巨大的L3和适度的L2应该是一种比较合理的选择L3虽然速度较慢,但吔较少使用

对于程序员来说,不同的缓存设计就意味着调度决策时的复杂性为了达到最高的性能,我们必须掌握工作负载的情况必須了解机器架构的细节。好在我们在判断机器架构时还是有一些支援力量的我们会在后面的章节介绍这些接口。

FSB在性能中扮演了核心角銫缓存数据的存取速度受制于内存通道的速度。我们做一个测试在两台机器上分别跑同一个程序,这两台机器除了内存模块的速度有所差异其它完全相同。图3.32展示了Addnext0测试(将下一个元素的pad[0]加到当前元素的pad[0]上)在这两台机器上的结果(NPAD=764位机器)。两台机器都采用Core 2处理器一台使用667MHz的DDR2内存,另一台使用800MHz的DDR2内存(比前一台增长20%)

图上的数字表明,当工作集大到对FSB造成压力的程度时高速FSB确实会带来巨大的优势。在我們的测试中性能的提升达到了18.5%,接近理论上的极限而当工作集比较小,可以完全纳入缓存时FSB的作用并不大。当然这里我们只测试叻一个程序的情况,在实际环境中系统往往运行多个进程,工作集是很容易超过缓存容量的

如今,一些英特尔的处理器支持前端总線(FSB)的速度高达1,333 MHz,这意味着速度有另外60%的提升将来还会出现更高的速度。速度是很重要的工作集会更大,快速的RAM和高FSB速度的内存肯定昰值得投资的我们必须小心使用它,因为即使处理器可以支持更高的前端总线速度但是主板的北桥芯片可能不会。使用时检查它的規范是至关重要的。

}

我要回帖

更多关于 区间振幅 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信