当前位置:首页 > 优化
  • 35岁的程序员被优化,就问你慌不慌?

    35岁的程序员被优化,就问你慌不慌?

    众所周知,在动物尤其是猛兽的世界里,残疾的雄性很快会被抛弃,由残酷的自然接管它的命运。 程序员曾经是我们这个世纪最大的幸运儿,是没有马和盔甲的数字骑士。 但老话说得好,风水轮流转。前几年横空出现的一个数字,让许多程序员寝食难安,原本不富裕的发量急剧减少:35。35岁,成了众多程序员过不去的一道坎:被降薪,被调岗,被明升暗降,直至被“优化”。 被优化后的程序员,因为其人力资源的专用性,在再就业过程中面临诸多困难。而这些人都在尴尬的年纪,上有老下有小,背着沉重的房贷,被优化后的生活陷入困境。所谓的再创业,对其中的大多数来说不是实际的选择。而再去学习新的技术或手艺,也为时太晚。 当然,很多人体贴地为企业考虑,认为企业优化这些中年程序员,完全是市场效率的体现。中年人精力逐渐衰退,拥有的知识渐渐陈旧,又有家庭牵绊,没办法像年轻人那样全副精神996,但工资却往往比年轻人高。从企业角度讲,用更便宜更好用的年轻人来取代中年人,或许少了那么点人情味,但物竞天择,汰旧换新,何错之有? 企业当然不是养老院,效率和利润应该是企业的首要考虑。不以利润或股东利益为首要考虑的企业,大概率是不合格的企业。但是,在一个真正的竞争性市场,拥有长远战略的创新型企业,大概率也不会把研发人员当作耗件。这不单单是人情味、同理心或社会责任感的问题,也是这类企业解决核心员工激励问题的必然选择。 从一个残疾的尼安德特人说起 在已经消失的古人类中,尼安德特人是最接近现代人类的,他们比现代人类更为强壮,脑容量和人类差不多,能熟练使用石器,并且产生了原始的音乐和绘画。 1957年,伊拉克库尔德地区的山尼达洞穴(Shanidar Cave)出土了一具尼安德特人遗体,被称为山尼达1号。人类学家在仔细研究了这具遗体后发现,这位尼人生前遍体鳞伤,不但右前臂被截肢,还失去了听力。在尼人生活的险恶环境中,听力极为重要,既聋又残疾的他不但无法参与部落狩猎,还很容易成为洞熊和穴狮的食物。令人惊奇的是,他活到了40-50岁,在尼人中属于高寿的老人。人类学家推断,他生前受到了同伴的照料,才能如此恶劣的身体条件下存活。 山尼达1号很幸运,他被文明地照料,没有被抛弃。面对严酷的生存环境,尼人为什么要从原本有限的资源中拿出一部分照料残疾的老年人?这非常难得,即使在数万年之后,叶芝的诗仍然唱到“一个衰颓的老人只是个废物,是件破外衣支在一根木棍上”。尼安德特人对残疾的山尼达1号的照料,并不仅仅是基于感情的反理性行为。相反,这背后有坚实和高级的理性基础,这正是人类在进化中可以胜出的密码。 尼人生活的环境险恶多变,时刻面临洞熊、穴狮等猛兽乃至其他人类旁支的斗争,整个部落要生存下来,需要部落成员团结一心,戮力并前。大家一起奋勇向前,生存下来的概率,比大家遇到威胁就各自逃命要大得多。但是,人都有自利的心理,尼人也不例外。如果一个尼人奋勇向前,也许就会在战斗中丢掉一个胳膊。虽然大家一起拼命会让部落活下来,他却可能因此残疾了。如果人人都这么想,那么大难临头时大家都作鸟兽散,部落就瓦解了。 因此,能否解决这个核心的激励问题,成了决定部落生死存亡的大问题。在漫长的进化之路中,一些原始人类的分支渐渐摸索出了各种解决激励问题的办法。比如,利用家庭和婚姻的纽带,加强成员之间的血肉联系。又如,建立原始的宗教,让成员相信有死后的世界,有轮回,有转生。虽然在物质的世界里他们只有有限的生命,但在精神的世界里他们无限延续。 另一个普遍存在于人类社会的办法,是人类创造性地使用世代交叠结构(overlapping generations)而构造的激励方式。 在这种方式下,年轻人毫无保留地为部落、团体或企业奉献青春,创造的价值远高于他们现时所拿到的物质回报。等他们老了或因伤残失去劳动能力时,部落、团体或企业就要回报他们当年的牺牲,给予他们的物质补偿将高于他们现在所能创造的价值。这种安排不但人道,而且解决了年轻人的激励问题:年轻人在最有创造力和战斗力的时候为社团奉献一切,因为他们被许诺了一个美好的未来。有人会问,这种制度对年轻人公平吗?但只要年轻人稍有耐心和远见,他们就会想到,自己也可能有会老的一天(如果他们足够幸运),也可能有会因为伤残而失去劳动能力的一天。 维持这一套制度的核心要件在于,部落、团体或企业要有信守承诺的能力。在成员失去劳动能力后,部落、团体或企业的领导人如果只考虑当下的成本和收益,那么他们就有很强的动机把这些包袱甩掉。但如果他们眼光短浅到只看着眼前的一亩三分地,这一套体系就玩崩了:年轻人再也不会相信未来失去劳动能力后,会有团体来照顾自己,因此任何超出当下物质回报的额外投入都毫无意义。这就叫:后人收后休欢喜,更有收人在后头。 越是严酷的生存环境,团体合作越重要,解决核心成员的激励问题也就变得越迫切。从严酷竞争中搏杀出来的团体,绝大多数会选择照料伤残的成员和他们的家人,并特别优待那些最早加入的成员,即使他们的能力与后来者相比并不出众。而无法信守这些承诺的团体,大概早就在严酷的竞争中被无情淘汰了。

    时间:2020-08-23 关键词: 优化 市场经济 程序员

  • IBM宣布SSD神优化技术:性能、可靠性提升3倍 延迟降低50倍

    IBM宣布SSD神优化技术:性能、可靠性提升3倍 延迟降低50倍

    随着技术的发展,SSD硬盘也面临着新的瓶颈,性能、可靠性及延迟等指标难以兼顾。IBM日前宣布推出一种新的SSD分区技术,它可以将SSD的性能及耐用性提升3倍,延迟足足降低了50倍。 这个分区技术不是常说的C、D、E盘那样,而是相对传统SSD硬盘的FTL转换层而言,IBM开发了一种新的转换层技术SALSA(软件日志结构阵列),可以更好地控制SSD硬盘上的数据操作。 实际的结果如何呢?IBM也公布了一些测试结果,在RMS-350 U.2硬盘上对比了与传统FTL硬盘的性能及延迟结果,使用的是FIO Block级别的测试软件。 性能方面,使用SALSA技术之后,读写速度从127MB/s提升到了301MB/s,而延迟降低的就更明显了,最多可以从815.1ms降至9.3ms,足足减少了99.99%,IBM表示延迟改善了有50倍之多。 除了性能及延迟上的改善,SALSA技术还同样改善了SSD硬盘的寿命/可靠性,耐用性也是原来的3倍多。 只不过IBM的测试估计很难让消费级SSD硬盘享受到这样的神优化,目前主要是针对的服务器环境。

    时间:2020-08-17 关键词: IBM ssd 延迟 优化

  • 安卓抢先体验 《王者荣耀》神优化:更新包大小缩减3-5倍

    安卓抢先体验 《王者荣耀》神优化:更新包大小缩减3-5倍

    每次《王者荣耀》更新,进入游戏前均有大量的各种加载及资源更新,等待时间漫长。玩家们只好盯着更新界面的公告翻来翻去的看。 针对这一问题,官方研发了“游戏内更新机制优化”,更新资源大小将缩减“3-5倍”。 据了解,此优化将先针对“安卓用户”在近期上架更新优化版本,因需安装优化资源包,游戏内将有0.9G左右更新,请大家耐心等待。此次更新后,从下一次的版本更新开始,都将开启游戏内更新体验优化效果~ 优化示例说明:后续大版本及日常版本更新包的资源大小能缩减“3-5倍” 更新优化效果示例: 大版本的游戏内更新仅需要下载平均“0.3G左右”(优化前约1G)版本新资源 日常版本游戏内更新仅需要下载平均“10M左右”(优化前约60M)版本新资源 (两者资源大小根据版本资源情况可能有一定浮动) 优化即将启动 本次优化技术更新将先针对“安卓用户”在“近期”上架更新优化版本(具体开启时间请留意后续公告)。因本次需要为您安装优化资源包,游戏内将有“0.9G”左右资源更新,请耐心等待。 第一步:应用商店手动更新。(1.7G左右客户端更新) 第二步:游戏内更新。(本次将为你安装优化技术资源包,因此会有0.9G左右资源更新) 此次更新后,从下一次的版本更新开始,都将开启游戏内更新体验优化效果。 针对iOS用户,官方将在下次大版本更新中为玩家安装“阶段”优化技术,后续的日常版本更新都将开启优化效果。同时,因App Store的更新机制要求不同,iOS的大版本更新体验优化技术正在研发试验中,请关注后续官方信息。

    时间:2020-06-29 关键词: 王者荣耀 更新包 优化

  • 软件优化可将CPU性能提升28倍 Intel详解OneAPI战略

    软件优化可将CPU性能提升28倍 Intel详解OneAPI战略

    在日前的SC 19大会上,Intel发布了全新的Xe架构GPU及多款10nm产品,这是Intel应对未来HPC高性能计算的关键。与此同时,Intel还正式宣布了OneAPI统一编程模型,它可能不被DIY玩家熟悉,但这很有可能会改变未来十年各种XPU芯片的发展。 有很多人不知道,Intel不仅是全球最大的CPU芯片公司,其软件开发能力也非常强大,软件工程师就有超过1.5万人,还是Linux Kernel的最大贡献者,每年修改的代码超过50万行,为100多个操作系统做优化。 在CPU及其他芯片开发上,Intel会越来越重视软件优化的能力,提出六大技术支柱的高级副总Raja Koduri之前表态称“全新的硬件架构每一个数量级的性能提升,软件就能带来两个数量级的性能提升。” 根据Raja Koudri所说,Intel通过软件优化,可以给Java带来6倍的性能提升,给持久性内存带来8倍的性能升级,在AI领域带来28倍的性能提升,并且,这是在相同的硬件上通过软件实现的提升。 在未来的芯片发展中,软件优化的作用已经无需多言,所以OneAPI战略对Intel来说也非常重要,因为它统一了各个平台的编程规范,简化了开发难度,有利于营造更好的开发生态。 基于此,Intel知IN官微发布了一篇名为《英特尔oneAPI:定义未来十年应用程序开发的统一、简化的编程模型》的长文,详细介绍了OneAPI的作用及内容,想要了解的玩家可以看看。 以下是全文详细内容: oneAPI是什么? oneAPI是一个统一的、简化的编程模型,旨在简化跨多架构的开发过程(如CPU、GPU、FPGA、加速器)。oneAPI包含两个组成部分:一项产业计划和一款英特尔®beta产品,都是全新探索的第一步。 oneAPI计划的跨架构开发模型基于行业标准和开放规范,支持广泛的行业生态系统采纳该技术来推动应用开发领域的新演进。 英特尔®oneAPI beta产品是英特尔基于oneAPI的实现,它包括了oneAPI标准组件如直接编程工具(Data Parallel C++)、含有一系列性能库的基于API的编程工具,以及先进的分析、调试工具等组件。开发人员从现在开始就可以在英特尔DevCloud for oneAPI上对基于多种英特尔架构(包括英特尔至强®可扩展处理器、带集成显卡的英特尔酷睿™处理器、英特尔FPGA如英特尔Arria®、Stratix®等)的代码和应用进行测试。这一进展源自于英特尔数百万小时软件工程开发的努力,旨在为全球开发人员提供一座从现有代码和技能过渡到即将来临的xPU时代的桥梁。 oneAPI为何重要? oneAPI是英特尔“软件先行”战略的重要体现,英特尔相信这一战略将定义和引领一个人工智能日益融合、异构及多架构的编程时代。 跨架构(CPU、GPU、FPGA及其他加速器)开发能力对于处理数据密集型工作负载极为重要,因为这种工作负载需要多种架构,这也将成为未来的常态。在今天,每一个硬件平台往往需要开发者维护独立的代码库,这些代码库需要使用不同的语言、库和软件工具进行编程。这是一项极其复杂和耗费时间的工作,会大大降低开发速度、抑制创新。 为了解决这一难题,oneAPI提供一个通用、开放的编程体验,让开发者可以自由选择架构,无需在性能上作出妥协,也大大降低了使用不同的代码库、编程语言、编程工具和工作流程所带来的复杂性。相对于今天的基于单个厂商的封闭式编程环境,oneAPI为开发者提供了极富竞争力、也更先进的可替代选择,帮助他们在保留现有软件投资的基础上,搭建一座无缝连接的桥梁,从而为未来的多架构世界创造更多丰富的应用程序。 为什么英特尔能够应对这项挑战? 英特尔已经深入开发者生态领域超过20年。英特尔拥有15000多名软件工程师和10000项与客户紧密合作的软件部署,是Linux kernel最大的贡献者,每年修改的代码超过50万行,为100多个操作系统进行过优化,并且拥有超过两千万活跃开发者的生态,而这些只是英特尔庞大的软件实力的一部分。 英特尔跨基础架构、网络、操作系统的开发经验,开发工具和SDK以及其所参与并影响的标准制定组织的数量在业界是无与伦比的。凭借深耕行业多年的积累和英特尔软件工程团队数百万个小时的努力,英特尔正通过创建一个统一的编程模型,推动开发普及化,简化困难,为开发者创造一个更具移植性、更高效且性能更高的编程环境,来帮助开发者应对未来的挑战。 为什么需要一个开放式规范? 数十年以来,英特尔与包括ISO C++/Fortran Groups、OpenMP* ARB、MPI Forum、The Khronos Group在内的多个标准制定组织以及行业/学术组织携手,希望通过开放协作的方式寻求一种可实现互操作性与互换性的产品规范,而oneAPI项目就是这一行动的延续。oneAPI将实现与现有行业标准的互操作性。 最新oneAPI规范可在oneAPI计划官网oneapi.com查阅 oneAPI开放式规范包括哪些内容? 这一开放式规范包括一种跨架构的编程语言Data Parallel C++(DPC++)、一套用于API编程的函数库以及底层硬件接口(oneAPI Level Zero)。有了这些组件,英特尔和其它企业就能创建他们自己的oneAPI实现来支持他们自己的产品,或基于oneAPI进行新产品开发。 Data Parallel C++是什么? DPC++是基于大众熟悉的C和C++语言,专门为oneAPI设计的主要编程语言。它融合了来自Kronos Group的SYCL*,从而可以支持跨CPU和加速器上的数据并行和异构编程,目的是为了简化编程以及提高代码在不同硬件上的可重用性,同时能根据特定的加速器进行调优。 DPC++语言增强将会通过一个开发者社区项目来进行扩展,以简化数据并行编程。该项目向公众开放,并将通过开发者们的共同努力不断发展。 oneAPI规范内容将会开源吗? 很多库和组件已经开源或即将开源。 请访问oneapi.com查看详细开源项 哪些公司将支持或参与oneAPI计划? 截至11月17日,支持oneAPI概念的业内领先企业和研究机构已经超过30家,包括高性能计算领域的领导者、人工智能领域的创新者、硬件厂商/OEM、独立软件开发商、云服务商、高校等等。其中很多也积极参与了oneAPI beta版工具包的测试并提供反馈意见。 这项计划刚刚启动,英特尔预期未来几年将会有更多参与方加入该计划。企业在创建自己的oneAPI实现并完成自我认证后即可以使用全新oneAPI计划品牌和标识。 不同的oneAPI Beta版工具包都包含了什么? 英特尔 oneAPI 基础工具包(Beta版)包含了一系列核心工具和库,为构建和部署跨架构的高性能以数据为中心的应用而开发。它具体包含了oneAPI开放式规范技术(DPC++语言、特定领域的库)和英特尔® Python*分发包来提供跨相关架构的即时加速,以及能增强分析、协助设计和调试等组件。 除英特尔oneAPI基础工具包外,英特尔还提供其他针对高性能计算、人工智能等专门工作负载的工具包,包括: 英特尔oneAPI高性能计算工具包(Beta版):帮助快速交付可扩展的C++、Fortran和OpenMP应用程序 英特尔oneAPI深度学习框架开发者工具包(Beta版):用于建立深度学习框架或对现有深度学习框架实现定制化 英特尔oneAPI渲染工具包(Beta版):用于开发高性能、高精度的可视化应用程序(包括科学可视化) 英特尔AI分析工具包(Beta版):由oneAPI提供技术支持,适用于人工智能开发者和数据科学家,以更好地利用机器学习和深度学习模型来构建应用。 此外还有两种oneAPI补充工具包:为系统工程师设计的英特尔系统Bring-Up 工具包以及面向深度学习推理和计算机视觉的生产场景的英特尔发行版 OpenVINO™ 工具开发包。 更多详情请访问:software.intel.com/oneapi oneAPI支持哪些处理器和加速器? oneAPI规范是为支持来自多个厂商的各种CPU和加速器而设计的。oneAPI Beta版目前支持英特尔CPU(英特尔至强®、酷睿™、凌动)、英特尔Arria FPGA以及作为未来独立数据中心GPU代理开发平台的第九代/英特尔核芯显卡。oneAPI日后将支持更多英特尔加速器架构。 其它厂商的硬件与oneAPI兼容吗? oneAPI规范的DPC++语言和库等都向公众开放使用,我们也鼓励其它硬件厂商使用。其它硬件厂商可以创建自己的oneAPI实现并基于此对特定硬件进行优化。 开发者可以通过哪些途径获取更多信息? 关于oneAPI计划的更多信息可通过访问oneAPI.com获取。开发者可在英特尔开发人员专区(网址:software.intel.com/oneapi)下载英特尔 oneAPI 测试版工具包供本地使用,也可以通过英特尔 DevCloud for oneAPI平台快速入门获得对于oneAPI工具包的访问,并使用它对多个以数据为中心的架构下的代码和工作负载进行测试。该方式无需安装和设置并节省时间,且在无需负担开发平台成本的情况下灵活尝试不同的硬件。​​​​

    时间:2019-12-17 关键词: 软件 Intel 处理器 opneapi 优化

  • Diodes 公司推出业界首款 HDMI 2.1 线性转接驱动器,并针对新一代视讯应用进行优化

      Diodes 公司今日发表业界首款 HDMI 2.1 通透线性转接驱动器,并针对数字电视、笔记本电脑及桌面计算机、VR 装置及游戏机的功率及成本进行优化。此产品最高可支持 10K 视讯分辨率。  PI3HDX12211 是 Diodes 公司最新的 HDMI 线性转接驱动器,也是业界首款符合 HDMI 2.1 规格的产品。PI3HDX12211 的每个通道最高支持 12Gbit/s 的速度,具备信道链接调训、速率及编码方面的透明度。本产品提供超低讯号延迟,可在高效能应用中确保优异的讯号完整性。  HDMI 2.1 是 HDMI 的最新规格,可达到更高的视讯分辨率及更新率。带宽提升至 48Gbit/s,因此可传输未压缩的 8K HDR 视讯。  PI3HDX12211 的通透特性意味着该款转接驱动器不受协议限制,可同时支持静态和动态 HDR。实作 HDMI 2.1 的装置可透过此接口传输静态/动态 HDR 中继数据。PI3HDX12211 具备四个可编程线性等化、输出振幅线性及平整增益的差分通道,可透过 I2C 接口或接脚设置进行控制。  PI3HDX12211 以 3.3V 供电运作,每个通道功耗仅 220mW,并可维持 1200mV 峰值至峰值的输出振幅线性。随着视讯分辨率日益变高,PI3HDX12211 可在笔记型和桌面计算机、游戏机、数字电视和机顶盒、扩充坞及周边装置上带来最新的视觉体验。  PI3HDX12211 将提供 42 个接点的 TQFN 封装,批量为 3000 个。    关于 Diodes Incorporated  Diodes公司(纳斯达克股票代码:DIOD)是一家标准普尔小盘600(Standard and Poor’s SmallCap 600)和罗素3000(Russell 3000)指数公司,该公司是一家为广泛的分离、逻辑、模拟和混合讯号半导体市场提供高质量专用标准产品之全球领先制造商和供货商。Diodes服务于消费性电子、计算、通讯、工业和汽车市场。公司产品包括二极管、整流器、晶体管、MOSFET、保护器件、特定功能数组、单闸极逻辑、放大器和比较器、霍尔效应和温度传感器、电源管理器件——包括LED驱动器、AC-DC转换器和控制器、DC-DC切换式和线性稳压器,以及电压基准和特殊功能器件,如USB电源开关、负载开关、电压监控器和马达控制器。Diodes 亦提供频率、连接、切换以及针对高速讯号的讯号完整性解决方案。Diodes的公司总部和美洲销售办事处位于得克萨斯州普莱诺市和加利福尼亚州米尔皮塔斯市。设计、市场和工程中心位于普莱诺、米尔皮塔斯、台北、桃园、竹北、英国曼彻斯特和德国诺伊豪斯。Diodes晶圆制造厂位于曼彻斯特、中国上海和苏格兰格里诺克。Diodes在中国上海、济南、成都和扬州以及香港、诺伊豪斯和台北还有多家封测厂。公司其他工程、销售、仓库和物流办事处位于台北、香港、曼彻斯特、上海、中国深圳、韩国城南市、德国慕尼黑和日本东京,此外,其在世界各地还设有多家支持办事处。

    时间:2019-10-08 关键词: 驱动器 优化

  • c编译器高级篇!!搞定c编译器优化

    c编译器高级篇!!搞定c编译器优化

    对于c编译器,想必大家也有所了解,3款主流c编译器也是活跃在不同人群的PC上。网络上很多文章都止步于对c编译器的介绍,并未探索c编译器更加深层次的内容。而在本文中,将涉及c编译器的高级部分——c编译器及其优化。所以,本文的讲解需要大家具备一定的c编译器基础,以及一定的c语言代码编写能力。 此外,本文的内容的开发环境基于ARM处理器,相关技术同样可在RISC处理器上实现,所以同样需要读者具备最基础的处理器知识。 本文主要讲解C编译器在代码优化时遇到的一些问题。要编写高效的C语言源代码,必须了解C编译器对什么形式的代码有所改动,编译器涉及的处理器结构的限制,以及一些特殊的C编译器的限制。 1.为编译器选择处理器结构 在编译C源文件时,必须为编译器指定正确的处理器类型。这样可以使编译的代码最大限度地利用处理器的硬件结构,如对半字加载(Halfword Load)、存储指令(Store InstrucTIons)和指令调度(InstrucTIon Scheduling)的支持。所以编译程序时,应该尽量准确地告诉编译器该代码是运行在什么类型的处理器上。有些处理器类型编译器是不能直接支持,如SA-1100,这时可以使用与该类型处理器为同一指令集的基本处理器,比如对于SA-100,可以使用StrongARM。 注意指定目标处理器可能使代码与其他ARM处理器不兼容。例如,编译时指定了ARMv6体系结构的代码,可能不能运行在ARM920T的处理器上(如果代码中使用了ARMv6体系结构中特有的指令)。 选择处理器类型可以使用--cpu name编译选项。该选项生成用于特定ARM处理器或体系结构的代码。 如果name是处理器名称。 · 输入名称必须和ARM数据表中所示严格一致,例如ARM7TDMI。该选项不接受通配符字符。有效值是任何 ARM6 或更高版本的 ARM 处理器。 · 选择处理器操作会选择适当的体系结构、浮点单元 (FPU)以及存储结构。 · 某些--cpu选择暗含--fpu选择。例如,当使用--arm选项编译时,--cpu ARM1136JF-S暗含--fpu vfpv2。隐式FPU只覆盖命令行上出现在--cpu选项前面的显式--fpu选项。如果没有指定--fpu选项和--cpu选项,则使用--fpu softvfp。 2.调试选项 如果在编译C源程序时,设置了调试选项,这将很大程度地影响最终代码的大小和执行效率。因为带调试信息的代码映像,为了能够在调试程序时正确地显示变量或设置断点,包含很多冗余的代码和数据。所以如果想最大限度地提供程序执行效率、减少代码尺寸,就要在编译源文件时,去除编译器的调试选项。 以下选项指定调试表生成方法。 · -g (--debug):该选项启用生成当前编译的调试表。无论是否使用-g选项,编译器都生成的代码是相同的。惟一差别是调试表的存在与否。编译器是否对代码进行优化是由-O选项指定调的。默认情况下,使用-g选项等价于使用:-g -dwarf2 --debug_macros。 注意编译程序时,只使用-g选项而没有使用优化选项,编译器会提示警告信息。 · --no_debug:该选项禁止生成当前编译的调试表。这是默认选项。 · --no_debug_macros:当与-g一起使用时,该选项禁止生成预处理程序宏定义的调试表条目(Entry)。这会减小调试映像的大小。-gt-p是-gtp的同义字。 --debug_macros 当与 -g 一起使用时,该选项启用生成预处理程序宏定义的调试表条目。这是默认选项,会增加调试映像的大小。一些调试程序忽略预处理程序条目。 3.优化选项 使用-Onum选择编译器的优化级别。优化级别分别为。 · -O0:除一些简单的代码编号之外,关闭所有优化。使用该编译选项可以提供最直接的优化信息。 · -O1:关闭严重影响调试效果的优化功能。使用该编译选项,编译器会移除程序中未使用到的内联函数和静态函数。如果与 --debug 一起使用,该选项可以在较好的代码密度下,给出最佳调试视图。 · -O2:生成充分优化代码。如果与 --debug 一起使用,调试效果可能不令人满意,因为目标代码到源代码的映射可能因为代码优化而发生变化。 如果不生成调试表,这是默认优化级别。 · -O3:最高优化级别。使用该优化级别,使生成的代码在时间和空间上寻求平衡。该选项常和-Ospace和-OTIme配合使用。 · -O3 –OTIme:使用该选项编译的代码比-O2 –Otime选项编译的代码,在执行速度上要快,但占用的空间也更大。 · -O3 -Ospace:产生的代码比使用-O2 -Ospace选项产生的代码尺寸小,但执行效率可能会差。 如果要使编译的代码更侧重于代码的尺寸或执行效率(两者往往不可兼得),可以使用下面的编译选项。 · -Ospace:指示编译程序执行优化,以延长执行时间为代价减小映像大小。例如,由外部函数调用代替内联函数。如果代码大小比性能更重要,则使用该选项。这是编译器的默认设置。 · -Otime:指示编译程序执行优化,以增大映像大小为代价缩短执行时间。如果执行时间比代码大小更重要,则使用该选项。例如,它编译: while (expression) body; 为: if (expression) { do body; while (expression); } 如果既不指定-Otime也不指定-Ospace,则编译器默认使用-Ospace。可使用-Otime编译代码中对时间要求严格的部分,使用-Ospace编译其余部分。但不能在同一编译程序调用中同时指定-Otime和-Ospace。 4.AAPCS选项 ARM结构过程调用标准AAPCS(Procedure Call Standard for the ARM Architecture)是ARM体系结构二进制接口ABI(Application Binary Interface for the ARM Architecture【BSABI】)标准的一部分。使用该标准可以很方便的执行C和汇编语言的相互调用。 编译程序时,使用--apcs选项可以指定所使用得AAPCS标准的版本。如果没有指定--apcs或--cpu选项,则编译器使用下面默认编译选项。 --apcs /noswst/nointer/noropi/norwpi --cpu ARM7TDMI --fpu softvfp 有关AAPCS的详细信息,请参加ARM相关文档。 5.编译选项对代码生成影响示例 本节举例说明编译器的优化选项如何影响代码生成。 (1)使用-O0选项 下面的例子显示了即使使用-O0编译选项对代码进行编译时,有些冗余代码还是会被编译器自动清除。 int f(int *p) { return (*p = = *p); } 使用armcc -c -O0对源程序进行编译,生成的汇编代码如下所示。 f MOV r1, r0 MOV r0, #1 MOV pc, lr 通过上面的例子可以看到,编译出的最终代码中没有加载(Load)指针P的值,变量*p被编译器优化掉了。如果不想让编译器对变量*p做优化,可以使用“volatile”对变量进行声明。下面的例子,显示了将变量声明为“volatile”类型后,使用armcc编译(-O2的优化级别)后的结果。 f LDR r1,[r0] LDR r0,[r0] CMP r1,r0 MOVNE r0,#0 MOVEQ r0,#1 MOV pc,lr 另外,编译的代码中的“MOV r1, r0”并没有实际意义,只是为了方便调试程序时设置断点使用。 (2)冗余代码的清除 下面例子显示了一段急待优化的代码。 int dummy() { int a=10, b=20; int c; c=a+b; return 0; } 当使用arm –c –O0进行编译时,产生的汇编码如下所示。 dummy: 0000807C E3A0100A MOV r1,#0xa 》》》 REDUNDANT\#3 int a=10,b=20; 00008080 E3A02014 MOV r2,#0x14 》》》 REDUNDANT\#5 c=a+b; 00008084 E0813002 ADD r3,r1,r2 》》》 REDUNDANT\#6 return 0; 00008088 E3A00000 MOV r0,#0 》》》 REDUNDANT\#7 } 0000808C E12FFF1E BX r14 从上面的汇编输出可以看到,编译器并没有对程序中的冗余变量做任何工作。但上面这段代码在编译时,编译器会给出警告,警告信息如下所示。 Warning : #550-D: variable “c” was set but never used Redundant.c line 4 int c; 但如果将编译器的优化级别提高,如使用arm –c –O1命令,则编译器输出的汇编代码如下所示。 dummy: 0000807C E3A00000 MOV r0,#0 》》》 REDUNDANT\#7 } 00008080 E12FFF1E BX r14 从上面的例子看出,当优化级别提高到-O1时,程序中的冗余变量就会被清除。 (3)指令重排 当指定编译器对程序代码进行优化时,编译器会对程序中排列不合理的汇编指令序列进行重排(只有在-O1及其以上的优化级别中才有),重排的目的是为了减少指令互锁(interload)。所谓互锁就是指如果一条指令需要前一条指令的执行结果,而这时结果还没有出来,那么处理器就会等待。这被称为流水线冒险(pipeline hazard),也被称为流水线互锁。 下面例子显示了对同一程序使用代码重排和不使用代码重排所产生的汇编码的区别。÷ 程序的源代码如下所示。 int f(int *p, int x) { return *p + x * 3; } 使用-O0选项对代码进行编译(无代码重排),产生的结果如下所示。 ADD r1,r1,r1,LSL #1 LDR r0,[r0,#0] ADD r0,r0,r1 ; ARM9上产生互锁 MOV pc,lr 使用-O1选项对代码进行编译(存在代码重排),产生的结果如下所示。 ADD r1,r1,r1,LSL #1 ADD r0,r0,r1 MOV pc,lr 指令重排发生在寄存器定位和代码产生阶段。代码重排只对ARM9及其以后的处理器版本产生作用。当使用代码重排时,代码的执行速度平均提供4%。可以使用-zpno_optimize_ scheduling编译选项关闭代码重排。 (4)内嵌函数 通常情况下,如果不指定编译选项,编译器会将一些代码量小且调用次数少的函数内嵌进调用函数中。如果某段子程序在其他模块中没有被调用,请使用Static关键字将其标识。 编译选项的--autoinline和--no_autoinline可以作为内嵌函数的使能开关。--no_autoinline选项为-O0和-O1选项的默认选项,但如果指定-O2或-O3的优化选项,编译器将默认使用--autoinline选项。 有关内嵌函数的详细信息,请参见本书内嵌函数一节。 下面的例子显示了同一段程序,使用内嵌功能和不使用内嵌功能编译出的不同结果。 要编译的源文件如下。 int bar(int a) { a=a+5; return a; } int foo(int i) { i=bar(i); i=i-2; i=bar(i); i++; return i; } 下面的汇编程序为不使用内嵌功能时编译出的结果。 bar ADD r0,r0,#5 MOV pc,lr foo STR lr,[sp,#-4]! BL bar SUB r0,r0,#2 BL bar ADD r0,r0,#1 LDR pc,[sp],#4 下面的汇编码是使用内嵌功能时编译出的结果。 foo ADD r0,r0,#5 SUB r0,r0,#2 ADD r0,r0,#5 ADD r0,r0,#1 MOV pc,lr 从上面的例子可以看出在使用内嵌功能时,函数间的相互调用减少了数据的压栈和出栈,节省了程序的执行时间,但如果内嵌函数被调用多次会造成空间的浪费。 以上内容便是小编此次带来的与c编译器相关的所有内容,如果你对本文比较满意,不妨在后期持续关注本网站的相关文章哦。

    时间:2019-08-30 关键词: 处理器 c编译器 优化

  • 外媒称苹果优化App搜索结果 苹果回应与用户习惯有关

    7月24日上午消息,外媒发文称,苹果公司自己的官方应用在其应用商店(App Store)的搜索结果往往优于竞争对手。这让媒体认为苹果公司有意优化他们自己的App搜索结果,但苹果回应称,这种搜索结果跟用户习惯有关,并非一成不变。 以有声读物的搜索为例。在去年9月被苹果图书应用程序取代之前,AudioBooks.com连续两年占据榜首,但去年9月之后,该网站每日应用程序下载量下降了25%。同样,苹果地图在“地图”搜索中排名第一,而“Apple TV”和iTunes商店在“电视”、“电影”和“视频”等关键词的搜索中排名第一。 苹果在应用商店的主导地位让苹果官方App占据了上风,尤其是因为许多官方App不符合第三方应用程序要求遵守的标准。例如,许多苹果官方App没有评论或评级功能,这是影响搜索结果的因素之一。 共有42个因素会影响应用程序在搜索中的排名,但影响最大的因素是下载、评级、相关性和用户行为。苹果表示,用户行为包括用户在搜索后所选择的App,然后继续下载的次数。 针对质疑,苹果公司进行了回应。他们自己也进行了自己的测试,并表示该测试方式和结果并不准确。 苹果表示,他们使用的算法使用机器学习和用户偏好有关,这些因素导致App排名经常波动。苹果的意思是,搜索结果并非一成不变,而是跟使用习惯和它在相关品类的受欢迎程度有关。 另外苹果确定,所有应用程序都遵循相同的搜索算法,包括苹果自己的App。 苹果公司在一份声明中表示:“苹果的用户与我们的产品有着非常紧密的联系,他们中的许多人将搜索作为一种发现和打开应用程序的方式。用户使用习惯是苹果App在搜索结果排名靠前的原因,同样(用户习惯)也是优步(Uber)、微软(Microsoft)和其他许多公司排名靠前的原因。” 苹果应用商店中的许多应用程序都是默认安装在iPhone和iPad上的,不过字iOS 10系统之后,如果用户愿意,可以删除原生应用,并在应用商店中搜索重装。

    时间:2019-08-12 关键词: 苹果 用户习惯 app搜索结果 优化

  • 何刚:华为Mate X折叠屏还在优化中 达不到质量要求不会上市

    何刚:华为Mate X折叠屏还在优化中 达不到质量要求不会上市

    26日下午,华为在深圳坂田基地发布了首款5G商用手机华为Mate 20X 5G。在会后的专访中,华为消费者业务手机产品线总裁何刚被问及Mate X折叠手机进展时表示,目前还在不断优化和完善,没有达到质量要求不会上市。 何刚坦言,这款产品还在不断地优化过程中,因为它涉及到全新的工艺、全新的设计方式等,这些都会带来各种使用场景下面临的困难、问题和挑战,应该这些困难、问题和挑战是大于我们最早预期的。 “大家应该非常清楚华为对质量的要求非常苛刻,如果没有达到质量要求是不会让产品上市的。”何刚说。 何刚表示,目前还是在不断地优化和完善这款手机,届时希望带给大家一个非常完美的产品。所以今天我们发布会上并没有讲这款产品,但是我们的工作在一直进行,依然投入了大量的工作不断地优化完善这款产品,让我们的产品上市的时候能够让消费者满意。 今年2月份MWC期间,华为首款折叠屏5G手机Mate X首次亮相,采用可折叠屏设计,展开时可达8英寸。轻轻翻折,又能成为可单手掌控的6.6英寸屏幕,另一块屏幕尺寸则为6.38寸。搭载麒麟980处理器,配置8GB运行内存,后置三摄像头。其8GB+512GB版本售价2299欧元(约17500元人民币)。 据此前消息,经历“翻车”之后的三星折叠屏手机Galaxy Fold将于9月份重新上市销售。 对此何刚表示:“我们在Mate X这款产品上的投入也非常大。至于三星什么时候上市,不是我们考虑的关键点。我们考虑的关键点是希望消费者拿到这款产品的时候能够拿到优质的产品,消费体验非常好,满足消费者对华为这个品牌的期望。” 目前,华为Mate X(TAH-AN00)已经通过了3C认证和入网许可,距离上市应该不会太远了。

    时间:2019-08-12 关键词: 华为 x mate 折叠屏 何刚 优化

  • 能源的综合系统优化技术

    能源的综合系统优化技术

    现在的能源不断发展,能源技术也在不断更新,那么什么是能源技术呢? 下面讲解分布式能源技术的综合系统优化技术。 (1)多种能源系统整合优化——将各种不同的能源系统进行联合优化,例如:将分布式能源与传统能源系统整合后,进行联合优化;或者,将分布式能源系统与冰蓄冷系统整合并进行联合再优化,将微型燃气轮机与热泵系统整合优化,以及太阳能与分布式系统的优化整合等等,达到取长补短的目的,充分发挥各个系统的综合优势; (2)将分布式能源与交通系统整合优化——利用低谷电力为电动汽车蓄电或燃料电池汽车储氢等,将燃料电池和混合动力汽车作为电源形成随着人流移动的电源和供水系统。实现节约投资经费,降低高技术产品使用成本等目的; 分布式能源技术发展现状 (3)分布式能源系统电网接入研究——解决分布式能源与现有电网设施的兼容、整合和安全运行等问题; (4)储能技术——通过蓄能技术的开发应用,解决能源的延时性调节问题,提高能源系统的容错能力,其中包括蓄电、蓄热、蓄冷和蓄能四个技术方向。蓄电包括化学蓄电:电池;物理蓄电:飞轮和水能、气能储热包括项变储热、热水、热油和蒸汽等多种形式。储冷:冰和水。储能包括物理蓄能:机械储能、水蓄能、以及记忆金属蓄能等多种方式; (5)地源蓄能技术——利用地下水和土壤将冬季的冷和夏季的热蓄能储存,进行季节性调节使用,结合热泵技术进行直接利用,减少城市热岛效应; (6)网络式能源系统——互联网式的分布式能源梯级利用系统是未来能源工业的重要形态,它是由燃气管网、低压电网、冷热水网络和信息共同组成的用户就近互联系统,复合网络的智能化运行、结算、冗余调整和系统容错优化; 以上就是分布式能源技术的综合系统优化技术,相信随着科学技术的不断发展,能源技术的综合优化会越来越先进。

    时间:2019-08-01 关键词: 电网 电源技术解析 分布式能源 优化

  • ETC用户通行费将优惠≥5%

     近日,交通运输部办公厅印发《关于大力推动高速公路ETC发展应用工作的通知》(以下简称《通知》),积极推动ETC安装使用,为撤销高速公路省界收费站创造条件。 《通知》提出,全面实施ETC车载装置(OBU)免费安装,并增加安装服务网点。6月起在高速公路服务区和具备条件的高速公路收费站出入口广场,为通行高速公路车辆开展ETC安装服务。计划今年年底,各省(区、市)汽车ETC安装率达到80%以上,通行高速公路的车辆ETC使用率达到90%以上。 安装不便是ETC推广的难点之一。《通知》显示,组织发行机构与银行、保险等服务网点以及加油站、4S店等车辆集中场所对接,就近提供一站式全流程安装服务;并开展互联网发行服务,支持客户自行注册,自助安装。 记者了解到,目前广州市内中国农业银行、华夏银行、中国银行和中国邮政储蓄银行均可对个人免费安装ETC,部分银行办理后通行有优惠。 此外,《通知》明确,将加大ETC车辆通行优惠力度。从7月1日起,严格落实对ETC用户不少于5%的车辆通行费基本优惠政策,实现对通行本区域的ETC车辆无差别基本优惠。ETC产品服务也将优化。停止发行储值卡,根据客户需求,将既有储值卡转换为记账卡。

    时间:2019-06-18 关键词: ETC obu 优化

  • “优化”使模拟IC达到极限性能

    数十年来,微波设计人员在设计中一直运用优化方法来提高和集中电路的性能。得益于过去十年间开发出的一些新技术,现在模拟IC设计人员也能够很容易地建立并高效地在其设计上进行优化。 不同于以往的电路优化器必需主要在批模式 (batch mode)下进行单调冗长的设置和运行,这些更新颖的解决方案是专门设计用来使电路设计创建阶段的设置和交互式使用更加便捷轻松。虽然许多解决方案只包含一种算法,但有些工具现在可提供许多的优化算法和方法,可根据问题的实际情况和设计空间宽度来予以具体运用。其中许多算法是从一个用户定义初始点开始,在设计空间进行搜索寻找局部最优点。另外还有一些方法则能够搜索整个设计空间寻找全局最优点。 让我们来分析一个应用实例,该例中模拟IC的要求是把中间宽带信号放大到2GHz。作为一个运算放大器,这个IC总是用于闭环结构,在这些频率下,实乃一个真正的挑战。因此,信号通过放大器后的相移必须保持在最小。由于这种高频要求,该放大器将采用60GHz硅锗技术来实现。 这种放大器旨在满足或超越带宽和增益要求,同时把功率减至最小,并保持稳定性。的确,这些要求彼此间非常矛盾。单单满足这些规格要求,设计人员就可能需要耗费数小时甚至数日的时间,更不用说寻找最佳解决方案了。通常,为节省时间起见,设计人员不得不勉强接受一种没有发挥设计最大潜力的勉强可接收的解决方案。而这正是优化能真正发挥优势的地方。 除带宽以外,还必须考虑到增益、功率和稳定性等其它要求。在本例中,电源抑制比和优先直流偏移也都是优化中的权衡因素。这些目标大部分为不均等约束条件,须小于或大于某一目标值或线段。 定义了测量参数之后,设定优化目标就很容易了。用户只需简单地挑选优化进程(optimization session)中需要的测量参数,并选择是使其小于、大于还是等于某个值即可(适用的话,也可以是在某个频率或时间范围上的某个取值范围)。 一旦这些目标、权值、设计参数和约束被定义好,优化器就准备运行了。由于该放大器具有离散设计参数,故可以应用指针算法或随机算法。本例中指针算法更适合,因为这种算法一般对仿真运行时间代价高昂的非线性问题更有效。优化器运行50次迭代后分析结果将发现,代价函数(cost function)得到充分改善。进行最终调节之后,优化器耗时30分钟左右共运行100次迭代以进一步优化那些参数。  在这一点上,可通过细化目标权值来提高性能,代价是牺牲其它一些要求。而且,随优化进程的继续,某些设计参数的重要性降低,然后不再有用。再增加100次迭代运行/迭代加细,继续优化过程,最终得到总体权衡后的选项。这种交互作用对最大限度地实现优化是至关重要的。该优化进程共需好几个小时,但设计者确信能够实现全面的权衡,使放大器的性能达到极限。 作者: James Spoto 总裁兼CEO Applied Wave Research公司

    时间:2018-12-04 关键词: 模拟 ic 电源技术解析 优化

  • 如何优化单片机中的C程序

    1、选择合适的算法和数据结构应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。2、使用尽量小的数据类型能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。在ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。3、使用自加、自减指令通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码,编译器通常都能够生成inc和dec之类的指令,而使用a=a+1或a=a-1之类的指令,有很多C编译器都会生成二到三个字节的指令。在AVR单片适用的ICCAVR、GCCAVR、IAR等C编译器以上几种书写方式生成的代码是一样的,也能够生成高质量的inc和dec之类的的代码。4、减少运算的强度可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。如下:(1)、求余运算。 a=a%8;可以改为: a=a&7;说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要求是求2n方的余数,均可使用位操作的方法来代替。(2)、平方运算 a=pow(a,2.0);可以改为: a=a*a;说明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比求平方运算快得多,因为浮点数的求平方是通过调用子程序来实现的,在自带硬件乘法器的AVR单片机中,如ATMega163中,乘法运算只需2个时钟周期就可以完成。既使是在没有内置硬件乘法器的AVR单片机中,乘法运算的子程序比平方运算的子程序代码短,执行速度快。如果是求3次方,如: a=pow(a,3.0);更改为: a=a*a*a;则效率的改善更明显。(3)、用移位实现乘除法运算 a=a*4; b=b/4;可以改为: a=a2;说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR中,如果乘以2n,都可以生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如: a=a*9可以改为: a=(a

    时间:2018-11-30 关键词: c程序 单片机中 优化

  • 关于Mysql thread_concurrency和innodb_thread_concurren

    摘要 最近工作上,需要研究一下mysql的优化,其中接触了一个mysql的参数thread_concurrency,需要调查一下thread_concurrency的理论知识,研究一下thread_concurrency是否有助于提升mysql的性能,通过百度和google的帮助以及阅读官方doc,对mysql thread_concurrency以及innodb_thread_concurrency有了一定的了解,这里简单的对其中涉及的知识做一些整理。    原文地址:关于Mysql thread_concurrency和innodb_thread_concurrency参数的一点整理    首先,最重要的一点,这个参数已经在最新版本的mysql中被移除了,官方最新5.7版本的doc上面对thread_concurrency有这样的说明:    thread_concurrency变量是针对于Solaris 8及低版本的系统,设置了这个变量mysqld会调用thr_setconcurrency()函数。这个函数允许应用程序给同一时间运行的线程系统提示所需数量的线程。当前的Solaris 版本中这个参数已经没有作用了。这个参数在mysql 5.6.1中已经被标记为过时,在5.7.2版本的mysql中被移除。           对于thread_concurrency参数,这里有两篇文章可以参考:         thread_concurrency doesn’t do what you expect         mysql中优化thread_concurrency的误区           在 Mysql中事务隔离级别与binlog_format的一点理解中,我们简单的介绍过mysql的两种存储引擎:MyISAM和InnoDB,InnoDB支持事务,也是日常开发中常用的存储引擎,在InnoDB中,我们可以通过设置参数innodb_thread_concurrency限制线程的数量。            先来看一下官方doc 14.13.5 Configuring Thread Concurrency for InnoDB对innodb_thread_concurrency参数的配置说明,翻译如下:           InnoDB使用操作系统线程来处理用户的事务请求。(在事务提交或回滚之前可能给InnoDB引擎带来很多的请求)。在现代化操作系统和多核处理器的服务器,上下文切换是有效的,大多数工作负载运行没有任何并发线程数量的限制。在MySQL 5.5及以上版本中,MySQL做了可伸缩性的改进,它减少了这种在InnoDB内部限制并发执行线程数量的需要。           它有助于在最小化的情况下进行线程之间的上下文切换,InnoDB可以使用各种技术来限制操作系统并发执行线程的数量(因此大批量的请求可以在任何一个时间得到处理)。当InnoDB从用户会话收到一个新的请求,如果线程并发执行的数量达到预定义的限制,那么新的请求会先睡眠一段时间后再次尝试。在睡眠后不能按计划执行的请求会被放入先入/先出队列,并最终处理。那些等待获取锁的线程则不会被计入到并发执行线程的数量中。       我们可以通过设置配置参数innodb_thread_concurrency来限制并发线程的数量,一旦执行线程的数量达到这个限制,额外的线程在被放置到对队列中之前,会睡眠数微秒,可以通过设定参数innodb_thread_sleep_delay来配置睡眠时间。            在5.6.3之前的版本中,Mysql要求通过测试和实验找到innodb_thread_sleep_delay的最优值,这个最优值可能会因工作负载情况不同而发生改变。在MySQL 5.6.3及更高版本中,你可以通过设置参数innodb_adaptive_max_sleep_delay为innodb_thread_sleep_delay设置最大允许的值,InnoDB会根据当前线程调度活动自动调整innodb_thread_sleep_delay的值,这种动态调整机制有助于工作的线程,在系统负载低时或系统接近满负荷运转时,都能够顺利的调度。           在MySQL 和 InnoDB之前的版本系列中,innodb_thread_concurrency的默认值,以及其隐含的限制并发线程执行的数量都进行过调整。在当前最新版本的mysql中,innodb_thread_concurrency的默认值为0,它表示默认情况下不限制线程并发执行的数量。           需要注意的是,InnoDB导致线程睡眠当且仅当并发线程的数量是有限的时候。如果对线程并发执行的数量没有限制,所有的请求都会被认为是可调度的,也就是说,如果innodb_thread_concurrency的值设置为0,innodb_thread_sleep_delay的值将会被忽略。           当有对线程数量进行限制(即innodb_thread_concurrency参数> 0),InnoDB通过允许多个请求在一个SQL语句执行过程中进入InnoDB,而不必遵守innodb_thread_concurrency设置的参数限额,来减少上下文的切换开销,当一个SQL语句(如join语句)包含在InnoDB的多行操作时,InnoDB会分配 指定数量的“入场券”,允许一个线程反复使用最小的开销。           当一个新的SQL语句开始,当前线程没有“入场券”,它就必须遵守innodb_thread_concurrency参数设置,一旦这个线程有权进入InnoDB,它会被分配一个“入场券”,它可以通过这个“入场券”用于随后进入InnoDB执行行操作,如果“入场券”使用完毕,该线程将会被驱逐,innodb_thread_concurrency参数会被放回到先入/先出队列中等待的线程等待再次观察。一旦这个线程再次有权进入InnoDB,“入场券”又会被重新分配,我们可以通过设置全局参数innodb_concurrency_tickets来指定“入场券”的数量,默认情况下是5000。正在等待获取锁的线程,一旦锁可用,会被立即分配一个“入场券”。           这些参数的正确值取决于当前系统环境和负载情况。尝试各种不同的值,以确定哪些值适用于当前应用程序。在限制并发执行的线程数之前,在多核及多处理器的计算机上,检查一下InnoDB的配置参数是否可以改善性能,比如innodb_adaptive_hash_index。           对于innodb_thread_concurrency参数的作用及配置,这里有两篇文章可以参考:       innodb_thread_concurrency的作用与改良         innoDb 的多线程并发调优           在官方doc上,对于innodb_thread_concurrency的使用,也给出了一些建议,如下:如果一个工作负载中,并发用户线程的数量小于64,建议设置innodb_thread_concurrency=0;如果工作负载一直较为严重甚至偶尔达到顶峰,建议先设置innodb_thread_concurrency=128,并通过不断的降低这个参数,96, 80, 64等等,直到发现能够提供最佳性能的线程数,例如,假设系统通常有40到50个用户,但定期的数量增加至60,70,甚至200。你会发现,性能在80个并发用户设置时表现稳定,如果高于这个数,性能反而下降。在这种情况下,建议设置innodb_thread_concurrency参数为80,以避免影响性能。如果你不希望InnoDB使用的虚拟CPU数量比用户线程使用的虚拟CPU更多(比如20个虚拟CPU),建议通过设置innodb_thread_concurrency 参数为这个值(也可能更低,这取决于性能体现),如果你的目标是将MySQL与其他应用隔离,你可以考虑绑定mysqld进程到专有的虚拟CPU。但是需 要注意的是,这种绑定,在myslqd进程一直不是很忙的情况下,可能会导致非最优的硬件使用率。在这种情况下,你可能会设置mysqld进程绑定的虚拟 CPU,允许其他应用程序使用虚拟CPU的一部分或全部。在某些情况下,最佳的innodb_thread_concurrency参数设置可以比虚拟CPU的数量小。定期检测和分析系统,负载量、用户数或者工作环境的改变可能都需要对innodb_thread_concurrency参数的设置进行调整。

    时间:2018-11-20 关键词: mysql 优化

  • keil mdk中如何确保某一段程序不被优化掉

    使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM.比如,你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它:void (*UserProgram)();        //函数指针UserProgram = (void (*)()) (0x00002000);  //定位到指定的入口地址0x00002000(*UserProgram)();               //调用test()函数这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默认的指令将test函数给整个优化掉,因为它觉得test()函数根本没有被调用,这个时候,虽然(*UserProgram)();仍会执行,但内容与初衷已经大相径庭.能否让编译器不自动优化test这个函数?当然有,就是使用链接器命令:--keep=section_id 此选项指定删除未使用节时不能删除的输入节。其中 section_id 是以下项之一:symbol 指定在删除未使用节时保留定义 symbol 的输入节。 如果 symbol 存在多个定义,则 armlink 将生成一则错误消息。 例如,您可能使用 --keep=int_handler。若要保留定义以 _handler 结尾的符号的所有节,请使用--keep=*_handler。object(section)指定在删除未使用节时保留 object 中的 section。 例如,若要保留vectors.o 对象的 vect 节,请使用: -- keep=vectors.o(vect)若要保留 vectors.o 对象中节名称的前三个字母是 vec 的所有节,请使用:--keep=vectors.o(vec*)由于我的程序test()函数是单独放在一个文件里(entry.c)的,所以我在linker标签栏下的Misc controls编辑框中输入--keep=entry.o

    时间:2018-11-16 关键词: keil mdk 优化

  • ST免费驱动软件提高STM32嵌入式应用设计灵活性

    ST免费驱动软件提高STM32嵌入式应用设计灵活性

    横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)扩大其业界领先的32位微控制器开发生态系统范围,新增STM32Cube底层应用程序编程接口(LL API)软件,让STM32ARM® Cortex®-M微控制器专家级设计用户能够更近距离接触硬件,直达寄存器级代码,以优化性能和运行时效率。   随着LL API的推出,现在STM32Cube环境在器件外设控制方面为设计人员提供全面的灵活性,从好用的可移植HAL(硬件抽象层)到高度优化的 LL API,让客户使用意法半导体的经过验证的软件,专注应用开发。 LL API集成在含有在STM32Cube软件包内,该软件包含有在STM32 Nucleo开发板上运行的项目例程,将项目例程移植到其它的STM32开发板上也很容易简单。LL API和相应的HAL可以同时运行在同一个项目内 ,让设计人员在上市时间、软件内存占用率和运行时效率之间灵活地选择最佳平衡点。 LL API是从旧的STM32标准外设固件库(SPL)升级到STMCube™生态系统的捷径。像每款STM32Cube嵌入式软件包内的HAL一样,LL API符合MISRA-C 2004标准,只有几个例外,但是也被全部列出,并给予详尽解释说明。意法半导体使用Grammatech CodeSonar®测试了这些API的质量和可靠性。通过STM32CubeMX软件包自动更新机制,LL API始终保持最新版。 免费开源BSD LL API目前集成在STM32L4、L0和F0系列微控制器STMCube软件包内,计划2017年第一季度所有STMCube平台都将集成该驱动程序。

    时间:2016-07-24 关键词: 控制器 效率 技术前沿 优化

  • TMS320C66x汇编语言的DSP代码优化技术

    摘要:随着主频的不断增加及多核处理器的出现,DSP运算量也不断地提高,但是从系统集成度的提高和成本角度考虑,仍然需要对C语言代码进行优化以提高效率。介绍了TMS320C66x汇编和流水线技术,阐述了在CCS编译器的实时运行环境下,编程需要注意的有关问题,以及如何利用流水线技术提高DSP的处理效率。 引言 DSP(数字信号处理器)通常作为实时信号处理的核心器件,被广泛应用于工业控制、通信、航空航天、武器精确制导等领域中。在以DSP为核心的系统设计过程中,软件开发的地位显得尤为重要。虽然器件水平的不断提高、DSP主频和运算核的增加,使DSP的运算能力大为提升,但是随着系统集成度和实时性的不断提高,为了提高运算速度和执行效率,在进行软件开发时经常需要用到C语言和汇编语言的混合编程。 如何使C语言和汇编语言有效地结合在一起,使程序清晰易懂,同时提升运算效率是本文着重讨论的问题。TI公司的TMS320C66x系列是高性能的数字信号处理器,本文以CCS5.0编程环境为例,讲述了编译器的实时运行环境下的汇编编程规则、使用流水线技术对程序的改善,以及在编程中需要注意的问题。 1 TMS320C66x DSP简介 TMS320C66x高性能DSP采用VLIW结构,具有2路数据通道,每个通道包含4个可以并行运行的处理单元(.L、.S、.M和.D),每个通道有32个32位通用寄存器,每个周期最多可以运行8个32位的指令,数据的加载位宽为每个周期32位或者64位。 其L1/L2存储包括直接映射的32 KB的L1P指令RAM、32 KB的2路L1D数据RAM、512 KB可配置的L2 RAM;最高运行频率为1.25 GHz,每核最高有40 GMAC/s定点和20 GFLOP/s运算能力,8核共享4MB片上存储,包含丰富的外围接口,如DDR3控制器、PCIe控制器和SRIO接口等。 TMS320C66x DSP核心框图如图1所示。     2 编译器的实时运行环境 在编译器的实时运行环境下,编写汇编代码时要遵守的规则主要有:寄存器使用规则和参数传递规则。 TMS320C66x两组通用寄存器,每组分别有32个32位寄存器,分为两组,分别是A0~A31和B0~B31。编译器对特定寄存器的使用及如何保护作了规定。占用两个寄存器的数据(长整型、双精度浮点数)放在相邻的两个寄存器中,且第一个必须是奇数,例如A1:A0,前面存放高位,后面存放低位,成对使用。 TMS320C66x编译器对汇编函数调用有严格的规定,如果在调用中不遵守这些规定,就会破坏实时运行环境,导致程序错误。主程序把函数调用需要传递的参数放在寄存器或者堆栈里。参数的前10个依次放在A4、B4、A6、B6、A8、B8、A10、B10、A12和B12里、如果参数是长整型或者浮点型,就占用一个寄存器对,如A5:A4、B5:B4等,依此类推。 剩下的参数放在堆栈里,堆栈指针指向下一个空地址,第11个参数就是SP+offset,依此类推。参数放在堆栈里需要考虑存储边界,一个参数如未声明类型且长度不超过一个整型,按整型存放,未声明的浮点数按双精度浮点数存放。返回值如果是整型,单精度浮点数或者指针,放在A4中,如果是长整型或者双精度浮点数则放在A5:A4中。 3 软件流水线技术的应用 TMS320C66x系列DSP的高速度、高效率是靠并行处理来实现的,而软件流水线技术(software pipeline)则是实现并行处理的关键。DSP只有在流水线充分发挥作用的情况下,才可能达到最高的执行效率。软件流水线包含取指、译码和执行3个阶段,每个阶段又分为不同的相位。软件流水线技术处于不同相位可以并行执行,即取指、译码和执行可以并行运行,甚至相同阶段不同相位也可以并行运行。 软件流水线技术是一种循环内的指令,能在一个周期内使用不同功能单元并行处理多个迭代的技术,能更为有效地使用资源,尤其对于VLIW的具有多功能单元的架构,通过减少循环中因为数据相关导致的依赖和功能单元使用冲突挖掘一次循环中指令的并行性,一般都是针对最内层循环进行的优化。 软件流水线技术可以概括为:从一个循环出发,将一个循环分成可以并行执行的迭代单元,也就是说在一次循环运算结束前,启动多次后续的循环运算。软件流水阶段分为进入循环核前的prolog、循环核loop kernel、循环核结束后的epilog三个过程。流水线技术示意图如图2所示。 软件流水线编程时,主要使用以下寄存器: ①Loop Buffer是一个能存储若干条SPLOOP指令的片内存储空间,最多达14个执行包。 ②LBC 执行 SPLOOP、 SPLOOPD、SPLOOPW时清零,每个运行周期后+1,当运行到功能段(Stage)边缘时,重置为零,此寄存器用户不可见。 ③ILC为用于循环计数的专用寄存器,SPLOOP和SPLOOPD使用向下计数器,每运行一次循环递减,使用ILC需要4个周期的延迟。 RILC循环嵌套时用于重置ILC。 软件流水线编程时,主要使用以下指令: ①SPLOOP一般用于告知循环最小运行次数,但不知循环体是否超过4个周期的起始,因为ILC加载和使用需要4个周期的间隔;SPLOOPD知道循环最小运行次数,以及循环体超过4个周期的起始;SPLOOPW不知道循环次数的任何信息,表明buffer的起始;SPLOOP的参数表示最小的功能段指令周期数。 ②SPKERNEL和SPKERNELR表明结束,其参数表示循环结束的第几个功能段内的第几个周期。     而SPMASK和SPMASKR用来区分是SPLOOP内的存储还是普通memory内的指令。 软件流水线技术的限制:同一周期不能使用相同的功能单元;同一个周期不能同时写入一个目标寄存器;在一个执行程序包内,每个数据通路两个功能单元可以访问另一个寄存器堆的相同的操作数。当从另外一侧读取一个刚刚更新的寄存器时,会有一个周期的延迟,即交叉通道的延迟。 4 汇编语言在程序中的应用 在实际应用程序开发过程中,程序通常采用混合编程的方法实现。主函数采用C程序编写,而对于那些耗时较多的运算密集的模块采用汇编编写。 这样做的目的比较简单,因为这样在主程序中初始化一些初值,既简单又准确,且汇编程序能提升运算效率。这样既能保证程序的结构化和可读性,又能保证应用的实时性。 实验中主要以浮点复数点乘程序为例,介绍汇编语言对源代码的优化步骤。 首先将C源代码循环展开翻译成汇编代码,为了使运算效率最高,应使用相同运算周期内运算量最高的汇编指令。 确定最小迭代间隔规划使用功能单元,使循环的多次迭代能够并行执行;为了使程序流水执行,应首先确定最小功能段间隔。 一个循环的最小功能段间隔是这个循环相邻两次功能段开始之间必须等待的最小周期数。循环中的相邻功能段数据相关性和循环核中使用最多的功能单元是最小功能段间隔。 例如,如果在循环核中有3条相邻指令都使用.D1单元,则最小功能段间隔至少是3,因为使用同一功能单元的3条指令不能并行执行,这时需要的最小功能段为3。 规划使用寄存器。在已知最小功能段间隔以后,可根据程序的数据依赖关系为功能单元分配寄存器,必须保证每个周期内没有寄存器并行使用。 编写汇编程序如下:         程序中使用LDDW、CMPYSP等指令完成数据读写和乘法运算等,保证程序运算时间最短。程序中使用最多的单元为D1和D2,每个单元被使用了3次,所以程序的最小功能段为3,循环长度共有15个,被分为5个功能段,在每个周期内保证了没有相同的功能单元被使用。运行同时最多使用了A、B两侧共6个功能单元,保证了运算效率。使用更多的寄存器可以使数据的前后关联更小。 使用本程序运行平台为TMS320C6678,复数8 192点乘其运行周期为33 947,与使用编译器优化的点乘程序的运行周期42 055相比,大约提升了20%。 结语 本文提到的软件利用汇编优化代码技术,在实际的系统应用中获得了满意的代码效率,为大规模复杂算法运算的执行提供了有效的时间保障。 在程序中采用的汇编语言和软件流水技术,在实时条件下能够应用于更为复杂和有效的算法,尤其是在编译器对于某些程序优化不明显的情况下,为提升代码效率提供了一些解决思路。

    时间:2015-11-25 关键词: DSP 汇编语言 流水线技术 设计教程 优化

  • SQL Server存储过程编写和优化

    一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。 二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。 三、内容: 1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。 2、开发人员在提交 前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。 3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a)SQL的使用规范: i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。 ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。 iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。 iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。 v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。 vii. 尽量使用“>=”,不要使用“>”。 viii. 注意一些or子句和union子句之间的替换 ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。 x. 注意存储过程中参数和数据类型的关系。 xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。 b)索引的使用规范: i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。 ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引 iii. 避免对大表查询时进行table scan,必要时考虑新建索引。 iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。 v. 要注意索引的维护,周期性重建索引,重新编译存储过程。 c) tempdb的使用规范: i. 尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。 ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。 iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。 iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。 v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。 vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。 d)合理的算法使用: 根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。

    时间:2015-11-09 关键词: 存储 sql server 存储技术 过程编写 优化

  • 基于TMS320DM6446的H.264编码器的设计与优化

    2003年发布的H.264视频压缩编码标准在一定程度上解决了要在尽可能低的码率下获得尽可能好的图像质量这一问题。在相同的重建图像质量下,H.264能够比H.263节约50%左右的比特率。此外,H.264还增强了其对网络的适应性,差错的恢复能力,使其非常适用于数字视频存储、 IPTV及手机电视等视频质量要求高而信道传输环境不稳定的场合。 由于加入了多模式位移估计、基于4×4块的整数变换等多种新的算法,使H.264算法本身的复杂度大幅增加。因此采用基于TI的TMS320DM6446的DAVINCI_EVM平台作为算法的硬件平台,提出针对达芬奇平台对H.264编码器进行优化,在不降低编码质量的情况下提高程序运行效率,降低运算复杂度的一个实现方案。 H.264编码器的算法流程 H.264编码器结构如图1所示,输入的Fn为当前帧或场,编码器以宏块为单位进行处理,每个宏块可以选择帧内或者帧间预测两种编码方式。如果采用帧内编码模式,其预测值PRED(图1中为P)是由本帧中之前已经经过编码、解码、重建的一些样本点生成。而如果采用帧间模式,则P由一个或者多个参考帧的运动补偿预测生成。预测值P和当前块相减后,产生一个残差块D,经块变换、量化后产生一组量化后的变换系数X,再经熵编码,与解码所需的一些信息一起组成一个压缩后的码流,经NAL供传输和存储用。   图1 H.264编码器结构 编码硬件平台概况 本设计采用的达芬奇数字视频评估模块DVEVM(Digital Video Evaluation Module)是TI提供的用来评估DaVinci技术和DM644x体系架构的评估模块,是强调片上能力的一个很好的参考平台。其硬件资源包括 TM320DM6446的DSP和ARM9的双核芯片、128M的SDRAM、16MB的NAND Flash以及丰富的外设接口。 TM320DM6446中用于编码器具体实现的C64x+DSP的时钟频率达到600MHz。C64x+DSP的内部存储器的配置包括 32KB的程序存储器L1P、80KB的数据存储器L1D和64KB的二级缓存L2。图2为TM320DM6446中DSP端的核心C64x+的结构原理图。   图2 C64x+结构原理图 编码器在TM320DM6446上的实现 由于DSP平台与PC平台的差异性,必须要对PC上开发的编码器程序进行结构上的调整,并进行合理的内存分配才能在DSP平台上正常的运行。主要实现步骤如下。 1 编码器C语言结构调整 PC 平台上用C语言实现的编码器在DSP平台上的编码帧率(fps)非常低,平均2s才能编完一帧,其主要原因是无法利用DSP的并行处理机制。因此针对 C64x+的特点,将程序中对流水线操作影响较大的循环拆分成若干小循环实现。对编码器运行速度影响较大的模块,如sad的计算,DCT变换等采用CCS 自带的图像库以提高编码效率。 2 DSP端的内存配置 由于视频编码的数据存取量较大,而 DAVINCI_EVM提供了256M的外部存储器DDR2,因此通过对DSP/BIOS的设置将外部存储器设置为DDR2,并将可执行的C代码及C代码的堆存入外部存储器中。 3 对DSP端BOOT的设置 由于TM320DM6446采用双核的设计,ARM端只负责整个工程的控制而不参与编码算法的具体实现。为了保证编码算法能在DSP端无中断的全速运行,需要对ARM端进行屏蔽,并通过对DAVINCI_EVM跳线的设置使DSP端自BOOT。 通过以上步骤,编码器效率虽然有所提高,但仍无法满足实时性的要求,因此必须结合DM6446本身的特点对编码器算法进行进一步的优化。 编码器的优化 本文对H.264算法的优化主要有两个方面:1)对算法中耗时较多的运动估计模块进行优化;2)对DSP的数据搬移进行优化。 1 对编码器算法运动估计模块的优化 由于DSP硬件资源有限,因此有必要对H.264编码器中所耗时间较多的模块进行优化,表1为H.264各模块复杂度比较。 由表1可见,运动估计占了一半左右的时间。运动估计复杂度高的主要原因是采用了全搜索算法,虽然精度非常高,但带来了大量的计算量。针对这一问题,本设计在已有的菱形搜索算法基础上进行进一步的优化。 为了减少静止宏块被编码以及大模板搜索所带来的运算量,在用菱形算法进行运动搜索之前,以待编码宏块周围已编码宏块的运动矢量信息及 SKIP状况为依据预测当前宏块是否使用SKIP模式编码。当待编码宏块为非静止宏块时,再根据周围已编码宏块的SAD值预测当前宏块的运动剧烈程度,若是运动平缓的宏块则直接使用小模板进行搜索。只有当待编码宏块被判定为剧烈运动的宏块时才进行大模板搜索。由于多次的大模板搜索循环带来较大的计算量,因此在进行大模板搜索之前首先根据周围宏块的信息对最大搜索次数MaxNum进行预估值。当大模板的搜索次数大于MaxNum时直接跳转至小模板搜索。此流程设计可使静止宏块和运动平缓的宏块不进入运算量大的大模板搜索环节。优化后的菱形算法流程如图3所示。   图3 优化算法流程图 2 对DSP数据搬移的优化 视频编码需要处理较大的数据量,如一帧CIF格式的YUV数据约有150K,而 H.264除了要存储当前帧的信息外还必须存储重建帧和参考帧的信息,为此必须使用DM6446的片外存储器,即DDR。但是DSP的CPU对不同存储器的访问速度是不一样的,访问速度最快的是离DSP核最近的L1P和L1D,其次是二级缓存L2,访问速度最慢的是DSP的片外存储器。DSP对不同存储器的访问速度相差数倍。为了提高编码器的运行效率,节省DSP核对各个模块访问所消耗的时钟周期,需要启用DSP的DMA作为数据在两个存储器之间的传输通路。DMA的特点是可以在不需要CPU干预的情况下,在后台执行数据的高速传输,能够有效减轻CPU的负荷。   [!--empirenews.page--] C64x+在外部存储器与内部存储器之间的数据传递可以通过增强型DMA(EDMA)实现。EDMA传输的发起方式有3种,包括手动触发方式、外设事件发起方式及QDMA模式。在编码算法中,每处理完一组宏块就要向CPU提出DMA传输申请,因此采用QDMA模式的传输发起方式更适用于编码算法。 DSP核对两级内部存储器L1和L2的访问速度也不同,如果将外部存储器的数据直接通过EDMA传入L1D和L1P,这样的传输方式虽然较快,但需要分配比较大的L1 SRAM,这意味着L1的Cache就会变小,过小的L1 Cache会影响L2和外部内存中的代码和数据的效率。出于上述考虑,可以将L2作为L1与外部存储器之间的数据过渡区。L1和L2之间的数据传递采用 C64x+新引入的IDMA,其原理跟EDMA相似,实现两个内部存储器的高速数据传递。 为了使EDMA可以不间断的实现数据的搬移,本设计采用了二级乒乓传输的方式,首先在L1 SRAM和L2 SRAM中开辟两个缓冲区,CPU在处理一个当前宏块组数据之前先处理EDMA和IDMA的传输申请,当CPU编码完一个宏块组时,IDMA已将数据搬移至离核最近的L1缓冲区,当CPU继续处理下一个宏块组前再次处理EDMA和IDMA的传输申请。如此以乒乓传递的方式搬移数据可以保证CPU处理数据时最短的等待时间。 优化结果及分析 表2为优化前后的H.264编码器对3个测试序列在DM6446上编码后的结果比较。在表2中,优化后的帧频率比优化前有了较大幅度的提高,这是由于对编码器的运动估计模块进行优化后,有效减少了这一模块所消耗的时钟周期。而对DSP数据搬移方式的优化,减少了DSP核等待数据搬入所消耗的时钟周期。表2中,PSNR的值在优化前后并没有明显变化,说明优化后编码质量未受大的影响。  

    时间:2015-10-24 关键词: 嵌入式开发 tms320dm6446 h.264编码器 优化

  • GNSS接收机中数据传输优化方法设计与应用

    摘要:对于基于FPGA+DSP架构实现的、需要同时接收处理多系统多频点导航卫星信号的GNSS接收机,随着跟踪通道数目成倍增长以及为提升抗多径等性能造成的每通道相关器数目的增加,FPGA和DSP之间需要交互的相关值数据量也将成倍增加。本文在定制的FPGA+DSP的硬件平台上,利用DSP芯片的QDMA功能,消除了连续数据读取间隔的无效时间,并实现了卫星信号处理与相关值数据传输的并行化,显著降低了数据传输对DSP处理时间的占用,使得在同样硬件平台上跟踪通道数由44个提高到96个,满足了项目设计的要求。 引言 随着北斗导航卫星系统(BDS)、伽利略导航卫星系统(Galileo)以及Glonass导航卫星系统的发展,全球导航卫星系统(Global Navigation Satellite Systems,GNSS)接收机工作模式已经从单模单频向多模多频转变,这一趋势在高精度卫星导航接收机以及兼容互操作接收机中体现得更加明显。接收信号数量的增加直接导致接收机通道数量的成倍增加。同时,为了提升抗多径干扰的能力,接收机相关通道通常在典型的三组复相关器的基础上额外增加两组复相关器。此外,为了适应新信号体制下的导频分量与数据分量的同时接收,接收机相关通道内部需要单独一路相关器对数据支路进行数据解调。接收机通道数据增加以及相关器数量的增加直接导致DSP与FPGA之间传输数据量的剧增。 DSP与FPGA之间的通信通常采用EMIF异步总线方式实现,由于传输数据量的成倍增加,数据传输所占用的CPU时间也将成倍增加,最终导致CPU不能在0.505mS内完成所有通道的信号处理任务。 因此,研究如何有效提升FPGA和DSP之间的数据传输速率以降低数据传输对DSP处理时间的占用,对实现多模多频GNSS接收机具有重要意义。 1 接收机硬件架构 定制的基于FPGA+DSP架构的接收机硬件方案如图1所示。 接收机天线采用的是全频段天线,能够接收BDS、GPS、Galileo以及Glonass系统所有频点的卫星导航信号;射频通道RF完成导航信号的放大、下变频以及滤波等工作;基带平台中的A/D转换器对射频通道输出的中频信号进行采样,完成模拟信号到数字信号的转换;FPGA实现导航信号的捕获以及通道相关运算功能;DSP选用TI公司的OMAPL138,完成环路的更新以及定位解算功能。 2 数据传输分析 在接收的导航信号中,有些信号没有导频支路分量(如B1I、L1CA等),但是为了保证积分通道的通用性,FPGA内部积分通道均采用5路复相关器完成导频分量的跟踪,同时具有一路独立的相关器完成数据的解调功能。单通道内的环路结构如图2所示。 与传统的只有三路复相关器的接收机相比较,在图2所示的单通道内,增加了EE与LL两组复相关器、数据支路伪随机码发生器(data code generator)、数据解调器以及IQ切换单元(I,Q switch)。增加两路复相关器是为了能够实现性能良好的抗多径算法;由于在不同信号分量内数据支路与导频支路的相位关系不确定,因此需要在解调数据之前添加IQ切换功能单元。对于没有导频支路的导航信号,在接收机通道使用过程中无需使用IQ切换单元、数据解调相关器以及数据支路伪随机码发生器。 在通道更新之前,OMAPL138需要将FPGA内部完成的5组积分值读取到内部,完成相位延迟锁定环路(PLL)和伪码延迟锁定环路(DLL)的鉴相以及滤波,最后将环路更新的结果反馈至FPGA内部的相关通道中,从而完成一次环路的更新。在下面分析的过程中将误差计算、滤波以及PLL、DLL更新合称为“通道处理”。 DSP执行0.505 ms中断任务的流程如图3所示。中断开始后首先读取所有通道相关积分标志,循环判断通道积分状态标志位,根据1ms相关积分状态标志位,进行相应通道处理。 FPGA与OMAPL138之间通过EIMF总线进行数据传输。EIMF总线具有两种工作模式:同步和异步。程序设计初始阶段,接收机采用异步模式普通寻址方式进行数据传输。在分析数据传输时序的过程中,采用Altera逻辑分析仪软件signalTap对DSP与FPGA之间的异步通信时序进行仿真分析。分析结果如图4所示。 由图4中的片选信号cen可以看出,数据访问的时间由片选低电平以及两次访问数据间的高电平组成。其中,低电平时间主要由EMIF总线时序中的 setup、strobe以及hold时间构成;高电平代表读取数据的切换时间,视为无效时间,这段元效时间严重降低了数据传输速率。通过第一行的采样点以及采样频率可以估计出普通异步访问总线数据速率为3.0 03 MB。0.505 ms内跟踪通道数满足下式: n·Ns/R+n·tsp+δt<0.505 ms (1) 其中,R为EIMF通信速率(MB/s);Ns为单通道数据量(字节);tsp为单通道处理时间(s);δt为OMAPL138查询通道过程中的程序执行时间,在下面计算过程中忽略此时间。 在复相关器数为3(Ns=12字节),跟踪通道数n=12的传统接收机工作模式下,单通道处理时间tsp=4 μs;由式(1)可知,通道更新时间t=n·Ns/R+n·tsp+δt≈96μs,满足t< 0.505 ms,因此OMAPL138能够完成12个通道的跟踪。但是在单通道内复相关器数量为5,同时具有一路解调数据相关器的情况下,单通道积分数据Ns增加至22字节,则跟踪通道数n<44,不能满足项目中跟踪通道数为96的要求。 基于以上分析,下面将重点讨论如何通过缩短无效时间,以及通过数据读取与通道处理并行执行缩短数据传输占用DSP时间两方面来提高数据传输的效率。 3 数据传输优化方法分析与实现 3.1 消除数据读取间隔的无效时间 采用signalTap对memcpy或者QDMA数据通信进行仿真分析,分析结果表明两者在数据传输过程的时序关系一致,能够有效缩短数据访问时间。异步时序模式下QDMA/memcpy通信时序关系如图5所示。 由图5中的片选信号cen可以看出,在采用QDMA或者memcpy进行数据传输时,cen高电平仅出现一次,EMIF总线数据吞吐率提升至6.85 MB/s,缩短了数据传输占用OMAPL138的时间。由式(1)可以得出,跟踪通道数n<70,不能满足设计指标,因此需要通过实现数据传输与通道处理的并行执行进一步缩短数据传输占用OMAPL138时间,实现在0.505 ms内完成96个跟踪通道的更新。 3.2 实现数据传输与通道处理并行执行 与memcpy方法进行数据传输相比较,QDMA数据传输方式能够通过修改软件算法方便地实现数据传输与通道处理并行执行,从而达到进一步缩短数据传输占用OMAPL138时间的目的。采用QDMA方式进行数据传输后的0.505 ms任务流程如图6所示。 图6与图3比较可以看出,在采用QDMA数据传输方式下,数据传输与通道处理任务执行算法得到优化,在查询到第一个通道积分值有效后,采用memcpy方式对该通道的积分数据进行读取,数据读取完成后开始查询下一个积分值有效通道,当查询到下一个有效通道后,将QDMA设置为开始读下一个通道数据;当通道处理完成后,检查QDMA是否完成通道数据的读取,如果完成则切换到下一个通道进行查询,若没有完成,则等待数据传输完成。当96个通道全部查询完成后,开始执行最后一个通道的处理任务,这保证了只有一个通道的积分值有效的情况下能够对这个通道进行处理;若96个通道的积分值均无效,则在查询完积分标志位后直接结束中断任务。 图7的0.505 ms中断内的任务时序图更直观地说明,采用QDMA方式数据传输有效缩短了数据传输占用OMAPL138的时间。传输步骤如下:查询通道状态;读取累积值标志位;通道数据读取;通道处理。 图7中的编号为有效通道的通道号,能够更加方便地看出在0.505 ms内,由于数据传输与通道处理的并行执行,将数据传输占用OMAPL138的时间缩减至一次数据读取的时间,从而完成数据传输的最优化。通道数量与数据传输速率的约束公式变为: 1·Ns/R+n·tsp+δt<0.505 ms (2) 其中,R为OMAPL138与FPGA通信速率(6.85 MB/s);Ns为单通道数据量(22字节);tsp为单通道处理时间(4 μs);δt为OMAPL138查询通道过程中的程序执行时间。 结语 以工程实际为基础,在低功耗的前提下,针对如何有效提升FPGA和DSP之间的数据传输速率以降低数据传输对DSP处理时间的占用问题,通过在当前定制的卫星导航接收机硬件平台上对数据传输进行仿真分析,最终提出对数据传输采用QDMA方式进行优化,消除了连续数据读取间隔的无效时间,并实现了卫星信号处理与相关值数据传输的并行化,显著降低了数据传输对DSP处理时间的占用,使得在同样硬件平台上跟踪通道数由44个提高到96个,满足了项目设计的要求。本文的优化思想并不局限于设计实现基于DSP实现的GNSS接收机,同时为采用嵌入式MCU设计多通道GNSS接收机提供了理论依据。

    时间:2015-09-15 关键词: 数据传输 gnss接收机 通道数量 优化

  • 一种省去电解电容优化LED驱动电路的设计

    一种省去电解电容优化LED驱动电路的设计

    针对现有LED驱动电路存在电解电容限制寿命的不足,提出了一种无电解电容的LED驱动电路的设计方法。该方法采用Panasonic松下MIP553内置PFC可调光LED驱动电路的芯片,与外部非隔离底边斩波电路合成作为基本的电路结构,输出稳定的电流用以满足LED工作的需要。同时设计保护电路来保护负载。实验结果表明,控制器芯片能稳定工作,并且可以实现27V的恒压输出和350mA的恒流输出。 LED(发光二极管)以其节能、环保、高亮度、长寿命等诸多优点成为新一代的绿色照明光源。随着LED照明技术的日渐成熟,它终将用于生活的各个方面,并成为照明光源的新宠。然而,高效率、低成本、高功率因数和长寿命的驱动电源是LED灯发光品质和整体性能的关键。 现在市面上替代一般灯泡的LED灯是白炽灯泡寿命的约40倍,相当于4万小时。由于LED是直流电流驱动零件,通过流过的电流,直接将电能转变为光能,因此也称为光电转换器。因为不存在摩擦、机械损耗,所以在节能方面比一般的光源的效率高。但是,当AC电源接通时,一般是使用整流零件和平滑回路的直流稳定化电源,该平滑回路中必要的电解电容会因周围的温度及自身的发热而上升10℃,而导致寿命减半所以电解电容阻碍了LED照明器具的寿命。 为了提高驱动电源的寿命、简化电路、降低成本以及提高功率密度,有必要去掉电解电容,为此文中提出一种无电解电容的高亮度LED驱动电源。 1 LED电源的基本工作原理 采用BUCK变换器、IPD控制实现开关电源,输出恒定的电流和电压,驱动LED灯。电路的总体框图如图1所示。   主电路部分,在市电之后紧接着接了一个滤波器,它的作用是滤除电源中的高次谐波以及电源中的浪涌,使得控制电路受电源的干扰小。输入整流部分采用一体式的整流桥,通过二极管的单向导通的特性将电平在零点上下浮动的交流电转换为单向的脉动的直流电,再在滤波电容和电感的作用下,输出直流电压。经过MIP553和BUCK电路的调节和控制后输出供LED使用的电压。 2 LED电源的具体设计 2.1 输入电路的设计 为了延长LED驱动电源的使用寿命,使之与LED相匹配,必须要去除电路中的电解电容。 电路的设计指标为:输入交流电压Vm:198—264VAC/50Hz;输出电压Vo:27VDC;输出电流Io:0.35A。 输入电路包括噪声滤波装置、安全保险装置以及输入整流装置,如图2所示。   噪声滤波装置主要由电容C1/C2/C3和电感L1组成,其作用是在小于1MHz的频段内,能够减少电磁干扰(EMI)。此装置也可以链接在AC交流之后,整流装置之前,其滤波效果是一样的。安全保险装置由保险丝和ZNR1组成,保险丝主要防止有危害电路的尖峰电流产生的时候迅速切断电路以保护负载;ZNR1是浪涌吸收器,对于来自输入端的静电和浪涌进行吸收,以此来保护后面的电路。输入整流装置,是将交流电转换成直流电,输入整流桥的选择:整流桥二极管的电压应力为:   考虑裕量,选用TSC GBL205(VR=600V,IFAN=1A)。 2.2 输出电路的设计 输出电路由基本的BUCK电路和一个稳压二极管DD1组成。如图3所示。 2.2.1 BUCK变换器及其优势 Buck变换器又称为降压变换器、串联开关稳压器、三端开关型降压稳压器,是一种输出电压等于或小于输入电压的单管非隔离DC/DC变换器。   工作中的输入电流is,在开关闭合时,is>0;在开关打开时,is=0,故is是脉动的,但输出电流io在电感、二极管、电容的作用下却是连续的、平稳的。特别适合为LED提供工作电流。 FRD1的选择标准:额定电流大于2倍的输出电流,额定电压大于输入电压,其反向恢复时间也要在100ns以内,考虑裕量,FRD1的参数为:15A,600V,trr=50ns。用类似的方法选择T1和Cout,那么其参数分别为:T1:680μH;Cout:1μF,50V。 2.2.2 稳压二极管DD1 在低输入电压的某范围内,若没有像DD1的这种反向装置,那么在开关关断的瞬间将会有反向电流流过IPD,而IPD是不允许有这种电流的,因为这种反向电流将会导致IPD的损坏。 DD1所受到的各应力:IDD>2·Io=2×0.35=0.7A,UDD>Uo,反向恢复时间trr<100ns。考虑裕量,其选择的参数为:3A/60V/75ns。[!--empirenews.page--] 2.2.3 保护电路 MIP553内置过压、过流、过热、LED短路的保护电路,但并无LED开路时保护电路的设计。LED开路时的保护电路的思想主要有稳压二极管保护、三极管保护、偏压线圈保护等,考虑到成本和结构,文中选择具有稳压二极管的保护电路。其电路图如图3所示。当LED开路时,输出电压上升,若输出电路有稳压二极管的保护电路,那么稳压二极管将LED的电压嵌位在二极管的压降之下,这样就能防止输出电容的毁坏。 2.3 控制电路的设计 控制电路由MIP553及其外围电路组成,如图4所示。   MIP553芯片实现宽电压85~277V/AC输入,内置MOS,结构简单、稳定,可不需要电解电容,支持隔离或非隔离方案,单电源输出功率6~30W,恒定电流输出<1A。电源具有过压、过流、过热保护功能,安全稳定性高,体积小,发热量低,电源效率≥80%,功率因数≥95%,THD<20%。 MIP553的漏极电流由引脚CL和EX控制,因此连接这两个引脚的电阻RCL、REX的设置将直接影响漏极电流的大小。最大漏极电流可由REX来确定,考虑到这个最大漏极电流要流经LED,因此设置参考值时应该注意。 REX=(VDD(ON)-VEXH)/IEX=(6.5-2.8)/103=36kΩ (3) 其中,假设输入电压100V,输出电压28V,电流:400mA,最大漏极电流设为1.0A。 CVDD、CEX、CCL的作用是稳定MIP553的运行、抑制外部噪声。因此,其值要选择得当。CVDD,稳定VDD的电压、抑制LED的闪烁,特性不受温度影响、不产生额外的噪声,参考标准值为1~10μF之间;CEX,抑制外部噪声进入EX引脚,其参考标准值在470~1000pF之间;CCL,抑制外部噪声进入CL引脚,如果其值太大的话,那么pF值将会受到严重的影响,因此其值应小于1000pF。 2.4 仿真结果 利用Multisim对电路进行仿真,得到的结果如图5所示。   从图5中可以看出,输出电压稳定在27V,电流稳定在0-35A,符合设计要求。 3 LED电源的挑战 LED作为新型的电光源,在制作大型发光立体字和发光标识中有着明显的优势,其控制电压低,成本低,可靠性高。虽然LED产品在国内外市场有着愈演愈烈的发展趋势,但是LED照明毕竟是新兴的产业,目前还没有广泛的普及,因此LED驱动电源不可避免的在各方面存在着挑战:首先,由于LED的正向电压会随着电流和温度而变化,其“色点”也会随着电流和温度而漂移,为了保证LED的正常工作,就要求其驱动器无论在输入条件和正向电压如何变化的情况下都要限制电流。其次,如果需要LED调光,通常采用的是脉宽调制调光技术,典型的PWM频率是1~3kHz。最后,LED驱动电路的功率处理能力必须充足,且功能强固,可以承受多种故障条件,易于实现。 4 结束语 LED是一种节能、高效、环保的绿色照明,对它的驱动电路研究非常重要。文中介绍了利用MIP553进行设计的LED驱动电源,并通过仿真证明了其输出电流的稳定性,有很好的应用前景。

    时间:2015-06-18 关键词: 电源技术解析 led驱动电路 点解电容 优化

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包