弯曲财经:欧债危机告一段落 市场或迎来回调

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享

上周欧债危机的戏剧达到了阶段的高潮,继周末峰会之后,周三抛出了一个欧债危机的解决方案,提出要把救援资金扩大四倍,同时还要让债券投资人自己消耗50%的损失。同时,还暗示说资金也可能来自外储充沛的我国。消息一出,市场疯狂上涨,整个一周都在疯狂上涨中度过,欧洲各大银行的涨幅都在2位数以上。标普从1075点回升到1290左右只用了很短的时间。
美国经济数据也表现强劲,三季度的GDP达到超过预计的2.5%。
市场似乎重回牛市。但是冷静下来一看,会发现欧债危机虽然给出了大纲,细节还没有具体商定。美国的就业率仍然没有起色。市场的短期上涨似乎有些过头了。
在接下来的数周,很可能会有较大幅度的回调震荡。在接下来的数周内,美国的超级债务怎么解决也将成为关注的焦点。美国的共和党和民主党共同导致了美国评级被调低,现在债务问题仍然是扯皮不休。上周一批共和党和民主党议员共同提议,要求把债务削减至少四万亿。但是究竟能否在细节上达成共识,还有待观察。时间所剩不多,相信债务委员会最终会解决这个问题。
另外,就业市场是否会有起色,能否压低居高不下的失业率也是投资者关注的问题之一。美国的经济复苏似乎是一种无就业的复苏,无论企业的利润报表如何出色,其招募的员工并未增加,就业没有多大改善。这个问题也是奥巴马连任的最大障碍。因此,白宫频频推出新的就业刺激计划,无奈屡遭驳回。现在市场会看看白宫究竟还有什么其它的方案可以推出。
QE3的猜测一直没有停止过。最近欧债危机过去了一阵,QE3什么时候又会推出的讨论再次被抬了上来。大部分经济学家认为立即推出的可能不大,但是也不排除这种可能性。所以,投机资金也会利用这个来做点文章。
减轻在高点买入房地产的中产家庭的房贷压力也是美国政府刺激经济的考虑之一。这样可以保障买房者不至于被赶出去,同时又能稳定房价,减少被银行收回重新投放市场的房屋量。
总的来说,经济复苏的前景出现了一丝光明,但是短期内还没有非常强劲的增长。市场在过度买入之后会有回调,最近没有赶上大涨的要买入还有充足的机会。至于是否会跌回到前期的低点则不一定。

(2个打分, 平均:3.00 / 5)

MapCG: Writing Parallel Program Portable between CPU and GPU

(3个打分, 平均:3.33 / 5)

申威1600处理器是自主指令集,系统也得自己编,可喜可贺!

http://bbs.zhongsou.com/3/20111030/2903592.html

人民网济南10月27日电(记者徐锦庚)今天上午,国家超级计算济南中心正式建成挂牌,这是国内首台全部采用国产中央处理器(CPU)和系统软件构建的千万亿次计算机系统,标志着我国成为继美国、日本之后第三个能够采用自主CPU构建千万亿次计算机的国家。山东省省委书记姜异康,山东省省长姜大明,第十一届全国政协教科文卫体委员会主任、中科院院士徐冠华为济南中心揭牌。省委常委、副省长孙伟,省委常委、济南市市委书记焉荣竹,济南市市长张建国出席揭牌仪式。

高性能计算机的研制能力和应用水平是一个国家科技发展水平和综合国力的重要标志之一,也是世界发达国家竞相争夺的科技战略制高点。为此,我国《国家中长期科学和技术发展规划纲要》将千万亿次高效能计算机研制列入了优先主题,科技部明确要求掌握千万亿次高效能计算机研制的关键技术,并将“高效能计算机及网格服务环境”列为“十一五”863重大项目。

国家超级计算济南中心是科技部批准成立的全国3个千万亿次超级计算中心之一,由山东省科学院计算中心负责建设、管理和运营。济南中心使用的神威蓝光千万亿次系统由国家并行计算机工程技术研究中心按照万万亿次架构设计,装机8704片16核的“申威1600”处理器,是在国家“核高基”重大专项支持下、由国家高性能集成电路(上海)设计中心自主研发,采用自主指令集。

经国家权威机构测试,济南中心神威蓝光系统线性系统软件包效率为74.4%。系统全面采用高密度组装和低功耗技术,单机仓组装密度1024个CPU,系统性能功耗比超过741MFLOPS/W(每瓦功耗所获取的运算性能),组装密度和性能功耗比居世界领先水平,系统综合水平处于当今世界领先行列。济南中心的建设成功,实现了国家大型关键信息基础设施核心技术的自主可控目标,符合国家自主创新科技发展战略。

在建设济南中心的同时,山东省科学院始终坚持建设与应用相结合,多次组织项目团队针对海洋、石油、金融、动漫、农业、工业、大型工程等领域或行业的计算需求进行调研,充分挖掘用户应用。近期,为配合“山东半岛蓝色经济区”和“黄河三角洲高效生态经济区”两大国家发展战略,促进国产神威蓝光千万亿次系统应用,山东省科学院在山东省科技厅支持下,设立了“山东省超级计算科技专项”,首期已开展海洋科学、新药研制、气象预报、金融分析、工业仿真等领域中的一些重点课题,并保证应用稳定运行。

山东省科学院依托国家超级计算济南中心,坚持“技术研发、计算服务和人才培养”三位一体的工作思路,引进和培养专业人才,探索万核规模的并行框架、支持语言以及调试环境等前沿技术,深入研究计算模型与算法、并行识别与优化、海量数据处理、虚拟化和平台运维等超级计算关键技术,开发行业重大应用软件,提供高质量的计算服务和技术支持,推动高性能计算技术的应用和发展。

国家超级计算济南中心的成功建设和广泛应用,能够大大提升山东省乃至国家的科技创新能力、推动重大行业应用、促进重点和新兴产业跨越式发展,为国家经济建设贡献力量。

(6个打分, 平均:4.67 / 5)

首台国产超级计算机在济南投入运行

http://news.china.com.cn/rollnews/2011-10/28/content_10861990.htm

首台国产超级计算机在济南投入运行

时间: 2011-10-28 07:48:02 来源: 兰州晚报   发表评论>>
关键词: 投入运行 超级计算机 CPU 国产 系统软件
内容摘要: 10月27日,国家超级计算济南中心正式揭牌,我国首台全部采用国产CPU和系统软件构建的千万亿次计算机系统正式投入运行,标志着我国成为继美国、日本之后能够采用自主CPU构建千万亿次计算机的国家。

据新华社电 10月27日,国家超级计算济南中心正式揭牌,我国首台全部采用国产CPU和系统软件构建的千万亿次计算机系统正式投入运行,标志着我国成为继美国、日本之后能够采用自主CPU构建千万亿次计算机的国家。

济南中心装配的神威蓝光计算机系统,由国家并行计算机工程技术研究中心研制,全机装配8704片由国家高性能集成电路(上海)设计中心自主研发的“申威1600”处理器,组装密度和性能功耗比居世界先进水平,系统综合水平处于当今世界先进行列。济南中心全部采用国产CPU和系统软件,实现了国家大型关键信息基础设施核心技术的自主可控。

(1个打分, 平均:1.00 / 5)

SOSP2011论文集

23rd ACM Symposium on Operating Systems Principles
October 23-26, 2011 — Cascais, Portugal
General Chair: Ted Wobber
Program Chair: Peter Druschel

Introduction
Monday 24th, 08:30-09:00
Welcome and Awards
Monday 24th, 09:00-10:30
Key-Value
Chair: Marvin Theimer

SILT: A Memory-Efficient, High-Performance Key-Value Store
Hyeontaek Lim, Bin Fan, David G. Andersen (CMU), Michael Kaminsky (Intel Labs)

Scalable Consistency in Scatter
Lisa Glendenning, Ivan Beschastnikh, Arvind Krishnamurthy, Thomas Anderson (University of Washington)

Fast Crash Recovery in RAMCloud
Diego Ongaro, Stephen M. Rumble, Ryan Stutsman, John Ousterhout, Mendel Rosenblum (Stanford)
Monday 24th, 11:00-12:30
Storage
Chair: Eddie Kohler

Design Implications for Enterprise Storage Systems via Multi-Dimensional Trace Analysis
Yanpei Chen (UC Berkeley), Kiran Srinivasan, Garth Goodson (NetApp), Randy Katz (UC Berkeley)

Differentiated Storage Services
Michael Mesnier, Jason B. Akers, Feng Chen (Intel), Tian Luo (Ohio State)

A File is Not a File: Understanding the I/O Behavior of Apple Desktop Applications
Tyler Harter, Chris Dragga, Michael Vaughn, Andrea C. Arpaci-Dusseau, Remzi H. Arpaci-Dusseau (University of Wisconsin, Madison)
Monday 24th, 14:00-15:30
Security
Chair: Adrian Perrig

CryptDB: Protecting Confidentiality with Encrypted Query Processing
Raluca Ada Popa, Catherine M. S. Redfield, Nickolai Zeldovich, Hari Balakrishnan (MIT)

Intrusion Recovery for Database-backed Web Applications
Ramesh Chandra, Taesoo Kim, Meelap Shah, Neha Narula, Nickolai Zeldovich (MIT)

Software fault isolation with API integrity and multi-principal modules
Yandong Mao, Haogang Chen (MIT), Dong Zhou (Tsinghua), Xi Wang, Nickolai Zeldovich, M. Frans Kaashoek (MIT)
Monday 24th, 16:00-17:30
Reality
Chair: George Candea

Thialfi: A Client Notification Service for Internet-Scale Applications
Atul Adya, Gregory Cooper, Daniel Myers, Michael Piatek (Google)

Windows Azure Storage: A Highly Available Cloud Storage Service with Strong Consistency
Brad Calder, Ju Wang, Aaron Ogus, Niranjan Nilakantan, Arild Skjolsvold, Sam McKelvie, Yikang Xu, Shashwat Srivastav, Jiesheng Wu, Huseyin Simitci, Jaidev Haridas, Chakravarthy Uddaraju, Hemal Khatri, Andrew Edwards, Vaman Bedekar, Shane Mainali, Rafay Abbasi, Arpit Agarwal, Mian Fahim ul Haq, Muhammad Ikram ul Haq, Deepali Bhardwaj, Sowmya Dayanand, Anitha Adusumilli, Marvin McNett, Sriram Sankaran, Kavitha Manivannan, Leonidas Rigas (Microsoft)

An Empirical Study on Configuration Errors in Commercial and Open Source Systems
Zuoning Yin, Xiao Ma (UIUC), Jing Zheng, Yuanyuan Zhou (UCSD), Lakshmi N. Bairavasundaram, Shankar Pasupathy (NetApp)
Monday 24th, 17:30-19:15
Posters
Tuesday 25th, 09:00-11:00
Virtualization
Chair: Gernot Heiser

Cells: A Virtual Mobile Smartphone Architecture
Jeremy Andrus, Christoffer Dall, Alex Van’t Hof, Oren Laadan, Jason Nieh (Columbia)

Breaking Up is Hard to Do: Security and Functionality in a Commodity Hypervisor
Patrick Colp, Mihir Nanavati (UBC), Jun Zhu (Citrix), William Aiello (UBC), George Coker (NSA), Tim Deegan (Citrix), Peter Loscocco (NSA), Andrew Warfield (UBC)

CloudVisor: Retrofitting Protection of Virtual Machines in Multi-tenant Cloud with Nested Virtualization
Fengzhe Zhang, Jin Chen, Haibo Chen, Binyu Zang (Fudan University)

Atlantis: Robust, Extensible Execution Environments for Web Applications
James Mickens (MSR), Mohan Dhawan (Rutgers)
Tuesday 25th, 11:30-12:30
OS Architecture
Chair: Nickolai Zeldovich

PTask: Operating System Abstractions To Manage GPUs as Compute Devices
Christopher J. Rossbach, Jon Currey (MSR), Mark Silberstein (Technion), Baishakhi Ray, Emmett Witchel (UT Austin)

Logical Attestation: An Authorization Architecture for Trustworthy Computing
Emin Gün Sirer (Cornell), Willem de Bruijn (Google), Patrick Reynolds (BlueStripe Software), Alan Shieh, Kevin Walsh, Dan Williams, Fred B. Schneider (Cornell)
Tuesday 25th, 14:00-16:00
Detection and Tracing
Chair: Rebecca Isaacs

Practical Software Model Checking via Dynamic Interface Reduction
Huayang Guo (MSR and Tsinghua), Ming Wu, Lidong Zhou (MSR), Gang Hu (MSR and Tsinghua), Junfeng Yang (Columbia), Lintao Zhang (MSR)

Detecting failures in distributed systems with the FALCON spy network
Joshua B. Leners, Hao Wu, Wei-Lun Hung (UT Austin), Marcos K. Aguilera (MSR), Michael Walfish (UT Austin)

Secure Network Provenance
Wenchao Zhou, Qiong Fei, Arjun Narayan, Andreas Haeberlen, Boon Thau Loo (University of Pennsylvania), Micah Sherr (Georgetown University)

Fay: Extensible Distributed Tracing from Kernels to Clusters
Úlfar Erlingsson (Google), Marcus Peinado (MSR), Simon Peter (ETH Zürich), Mihai Budiu (MSR)
Tuesday 25th, 16:30-18:00
Work in Progress
Chair: George Candea
Wednesday 26th, 09:00-11:00
Threads and Races
Chair: Bryan Ford

Dthreads: Efficient Deterministic Multithreading
Tongping Liu, Charlie Curtsinger, Emery D. Berger (UMass Amherst)

Efficient Deterministic Multithreading through Schedule Relaxation
Heming Cui, Jingyue Wu, John Gallagher, Huayang Guo, Junfeng Yang (Columbia)

Pervasive Detection of Process Races in Deployed Systems
Oren Laadan, Nicolas Viennot, Chia-che Tsai, Chris Blinn, Junfeng Yang, Jason Nieh (Columbia)

Detecting and Surviving Data Races using Complementary Schedules
Kaushik Veeraraghavan, Peter M. Chen, Jason Flinn, Satish Narayanasamy (University of Michigan)
Wednesday 26th, 11:30-12:30
Geo-Replication
Chair: Ant Rowstron

Transactional storage for geo-replicated systems
Yair Sovran, Russell Power (NYU), Marcos K. Aguilera (MSR), Jinyang Li (NYU)

Don’t Settle for Eventual: Scalable Causal Consistency for Wide-Area Storage with COPS
Wyatt Lloyd, Michael J. Freedman (Princeton), Michael Kaminsky (Intel Labs), David G. Andersen (CMU)
(3个打分, 平均:5.00 / 5)

ISF2011邀请函

(没有打分)

弯曲财经:欧债危机吸引了全部注意力,市场继续反弹

美国市场的注意力完全集中在欧洲债务危机的解决上。上周美国市场持续上涨,投资人期待着欧洲可以在晚些的周日峰会上取得一些进展,并在本周三的再次会议上达成一个彻底的,结构性的,可以保护欧洲免于金融危机的解决方案。市场情绪期盼着这次的会议最终可以解决这个已经长达两年的问题。法德仍然在救援方案上有分歧,但是随着压力的增加(包括美国和中国,以及法国被评级机构列入可能降级的观察名单),相信他们会顾全大局,给出一个能够稳定市场信心的协议。
与此同时,美国经济数据显示了恢复重新加速的趋势。上周公布的月建筑开发商信心指数显示了信心的快速回升,新开工房屋数量也增加了。每周新增申领失业金人数持续下降,仍然在400K左右,但是向下突破这个数字可能近在咫尺。美国虽然没有通过奥巴马的就业刺激方案,但是其它的经济刺激措施,包括减免买房人承担的债务,提升房价等仍在讨论中,关于再次释放流动性QE3的可能性也再次升高。
如果欧债问题可以得到较好的解决,加上美国共和党和民主党如果在最近能够提出一个长期的美国债务解决方案,市场应该有积极的反应。经济数据的趋势向好,本周的市场仍然会被欧债问题的解决所左右。另外,美国在本周也会发布一些重要的经济数据,包括20城市房价指数,三季度GDP,以及消费者信心指数等。这些重要的经济观察指标应该会对市场具有一定的影响。巴菲特之前预测房屋存量会在下半年某个时间点上回落,现在也很可能已经接近这个时间点了。待售房屋存量的快速回落有助于房价的反弹。
总的来讲,市场现在重新回到了升势,但是要持续这个势头,仍然需要债务问题的完善解决和强有力的经济指标来支持。

(1个打分, 平均:3.00 / 5)

《弯曲评论文集》(一)的筹备工作

各位江湖上的朋友,

《弯曲评论》创办以来,有不少的好文章。多谢江湖上的弟兄们秉承着Open Source的精神,将自己的所学反馈于社会。

现在,希望将过去的一些优秀的文章整理成集,并作为GPL Doucment的版权发表。

希望大家支持,并给出文章推荐列表。

(8个打分, 平均:4.50 / 5)

程序分析-原理和实践之控制流分析

排版不好,请包涵。待完成后后一定出一个干净的合集。

2 控制流分析

2.1 控制流图

控制流图是对程序中分支跳转关系的抽象,描述程序所有可能执行路径,定义如下:

图2.1控制流图

控制流图的节点是语句集合,从A到B的边表示语句A执行完后可能直接执行语句B,整个控制流图必须有唯一的入口和出口。这是以每个语句为节点的控制流图,实际操作的控制流图一般以基本块(basic block)为基本节点,每个基本块包括若干条语句,基本块本身有唯一的入口和出口。

2.2 Dominator和Post-dominator

在控制流图中,Dominator描述节点之间在实际执行轨迹中的顺序关系。如果A是B的Dominator,那么意味着从程序入口执行到B的任意路径则一定经过A,称A Dom B,定义如下:

图2.2 Dominance关系定义

Dominance关系具有自反(x Dom x)、传递(x Dom y 且 y Dom z,有x Dom z)和反对称(x Dom y不意味着y Dom x)等性质。如果x Dom y且x!=y,那么称x是y的strict dominator。进一步的,如果x是y的strict dominator(记为Dom!),并且对任意除x以外的y的任意dominator w,有w Dom x,那么称s是y的immediate dominator(记为IDom),直观上,immediate dominator就是dominance关系链上最近的一个。Post-Dominator和Dominator是对偶的,如果x PDom y,那么任意从y到程序出口的路径都必须经过x。

考察dominator关系对一些程序分析很有价值。如检测对变量的初始化语句是否出现在所有对该变量的使用之前,或者在多线程程序中检测是否每一个lock都对应unlock。

根据Dominator关系的上述定义,任意一个节点都有唯一immediate dominator。如果把控制流图中所有其余的边删掉,只保留immediate dominator边,就得到一颗dominator树。给定控制流图,只要求得其dominator树,就能得到节点间的所有dominator关系。下图2.3给出了一个Lingo程序以及对应的dominator树:

图2.3 dominator树举例

接下来的问题,给定控制流图,如何快速找到所有dominator关系,图2.4是一个基本迭代算法:

图2.4 dominator关系求解算法

首先初始化,entry节点的dominator集合初始化为一个元素(entry自身),所有其他节点的集合初始化为整个节点集。接下来进入迭代过程,每次迭代考察每个节点,将该节点所有前驱的集合求交集,整个迭代过程直到解不变为止(即不再有新的Dom关系添加进来)。这个算法不关心不同节点的计算顺序,但事实上由于节点间的依赖关系,合理计算顺序对整个dominator关系求解的性能至关重要。

考虑图2.5的深度优先遍历过程:

图2.5 DFS过程中的先序和后序编号

遍历过程中对节点升序编号,可见有两种基本的方式:先序(pre-order)和后序(post-order)。直观上,分析dominator关系应该采用先序,因为前驱节点应该尽可能先处理,但对于有环(循环)的控制流图仍可能需要多次迭代。直接采用后序违反直观,对任何节点,前驱节点处理之前无法完成处理该节点。但如果将后序倒过来(reverse post-order),就能确保任意节点在其后继节点之前处理。reverse post-order不同于pre-order,更多的分析可以参考文献[1]。

Dominance Tree的高效计算方法如图2.6所示。算法基本框架和图2.4一样,需要留意几点细节。首先初始化时,对入口节点外的节点不是初始化为节点全集而是初始化为空(undefined)。进入迭代过程每轮循环需要遍历所有节点更新dominance关系,对所有节点(入口节点无需处理)采用reverse postorder来顺序处理。对选定的待处理节点b,首先选择第一个处理过(processed)的前驱,所谓处理过就是doms[b]不再是Undefined状态的节点,这一点很重要,否则有环时算法可能终止不了,接下来就是遍历所有处理过的前驱寻找b的immediate dominator,这一步通过intersect(b1,b2)实现。

intersect()过程中的变量都表示后序(post order)的节点编号,目标是找到b1和b2最近的公共前驱节点的编号,内层两个while循环按照reverse postorder的顺序找到reverse postorder编号小 (即postorder编号大) 的公共节点。图2.6的算法给每个节点找到其唯一的immediate dominator,所有这些信息合起来构成一颗dominance tree。

图2.4和2.6的算法都是从入口节点(entry node)出发构造dominator关系集合,一组节点的信息被分析出来的前提是从入口可达,因此这两个算法都分析不到死代码(从入口节点无论什么路径都无法到达)内的dominance关系。这点关系不大,因为人们一般只关注死代码的位置,对其内部结构兴趣不大。

图2.6 Dominance Tree算法

2.3 控制依赖

控制依赖直观上很好理解,但在控制流图的准确定义存在需要注意的细节,定义如图2.7所示。

图2.7控制依赖的定义

这就是说节点y和x之间存在控制依赖需要满足三个条件。第一个条件即存在一条x到y的执行路径P;第二个条件进一步要求x到y之间没有其他控制语句,换言之对路径P上的任意节点n,n到出口的任意路径上一定经过y,也就是说y是n的post dominator。第三个条件要求y一定不是x的strict post dominator,直观上就是说在x和y之间一定有一条流程控制语句,进而使得除了从x到y之外一定还会有跳转到其他地方的路径。例如图2.8所示的程序中,语句5控制依赖于语句4,但语句6和语句4之间没有直接的控制依赖关系,因为4和6直接的语句5是一条控制语句。但另一方面,语句6,7,8都控制依赖于语句5,语句7 PDOM! 语句6,语句8 PDOM! 语句7。

图2.8 控制依赖举例

2.4 循环和强连通子图

控制流分析的另一个应用是检测循环。对控制流图进行深度优先遍历(DFS)能得到一个生成树,生成树中边叫forward edge。另外还有两种边:cross edge和backward edge。backward edge表示控制流图中存在循环。问题是如何区分cross edge和backward edge,下面以图2.9中的程序为例来说明。

图中每条语句用数字标出,显然从语句8到语句3的边回到循环条件,构成回边(backward edge)。语句6到8和语句7到8分别有一条边,这两条边只有一条可能出现在DFS遍历的生成树中,剩下的一条就是交叉边(cross edge)。假设有一条从A到B的边,判断其是交叉边还是回边的方法是:如果在生成树中可以从B到达A,那么该边是回边;否则是交叉边。

图2.9 循环举例

从另一个角度,控制流图中的循环本质上构成了图中的一个强连通子图(Strong connected component)。检测图中强连通子图的标准算法是Tarjan算法,如图2.10所示。

Tarjan算法只需要对图进行一次深度优先遍历即可完成,需要O(n+m)的复杂度,其中n是边数目,m是顶点数目(算法中有对每个顶点的栈操作)。preorder按照优先遍历的顺序对节点编号,n.order表示节点n自身的编号,n.root表示n所在循环根节点的编号,算法先初始化节点所在的根为节点自身的编号。接下来首先顺序处理n所有邻接节点,然后更新n的根节点编号,原因在于可能存在从n的邻接节点到祖先节点(编号可能比n小)的回边,这一步确保能找到最大的强连通子图。递归处理完所有邻接节点后,由每个连通子图的根节点输出该子图的所有节点,每输出一个节点,就将该节点“删除”,这样确保任何节点只可能出现在一个强连通子图中,即不可能出现多个子图交叉的情况。

还有一个实现上的细节:当找到并输出该连通子图的所有节点时,需要子图中每个节点的root域(即让子图中每个节点指向新的根)。如果在图2.10中,repeat/until循环体中增加一个语句才会更准确:v.root = n.order。这样确保连通子图中每个节点的root域指向其所在子图的根节点,否则在存在嵌套循环的时候会有问题。

关于Tarjan算法原理的更多细节请参考文献[2],关于该算法的实现细节请参考本文第二部分基于Clang的实现参考源码。

图2.10 检测强连通子图的Tarjan算法

2.5 自然循环和可化简控制流图

自然循环(natural loops)就是只有单一入口的循环。两个自然循环要么完全不相交,要么嵌套。对于没有goto语句的语言,所有的循环都是自然循环。一般循环可能存在多个到循环体的入口,如通过goto语句直接跳转到一个循环的循环体中。

如果一个控制流图仅通过如下T1和T2两种变换能化简为一个节点,则称该控制流图是可化简的(reducible):

  1. T1: 如果节点n有唯一的前驱,那么将其和其前驱合并为一个节点;
  2. T2: 如果节点存在到自身的边,那么将该边删除。

没有循环的控制流图都是可约简的,对存在循环的控制流图,当且仅当所有循环是自然循环时此图是可化简的。有一些程序分析算法只对可化简的控制流图有效。

[1] Keith D. Cooper, Timothy J. Harvey and Ken Kennedy. “A Simple, Fast Dominance Algorithm”. Software: Practice and Experience, 2001; 4:1-10.
[2] Esko Nuutila, Eljas Soisalon-soininen. “On Finding the Strongly Connected Components in a Directed Graph”. Information Processing Letters, 1994.

(1个打分, 平均:5.00 / 5)

对李先静文章中volatile变量的量化小分析

下面是一段简单的代码,试图对李先静文章中的volatile进行一些量化分析。变量foo是一个static变量。下面分析了non volatile和volatile的不同的汇编语言结果。
static int foo;
void bar(void) {
foo = 0;
while (foo != 255)
;
}
.text
.align 4,0×90
.globl _bar
_bar:
LFB2:
pushq   %rbp
LCFI0:
movq    %rsp, %rbp
LCFI1:
movl    $0, _foo(%rip)//变量初始化为0
L2:
jmp     L2//死循环,因为编译优化,认为foo变量永远是0;
如果对变量做volatile处理,禁止编译优化。

static volatile int foo;
void bar(void) {
foo = 0;
while (foo != 255)
;
}

.text
.align 4,0×90
.globl _bar
_bar:
LFB2:
pushq   %rbp
LCFI0:
movq    %rsp, %rbp
LCFI1:
movl    $0, _foo(%rip) //foo变量赋初值为0
.align 4,0×90
L2:
movl    _foo(%rip), %eax
//必须force做memory的load操作。从而在多CPU下,或者系统
//中有其他逻辑,例如DMA,FPGA操作的情况下,CPU能感知
cmpl    $255, %eax
jne     L2 //如果变量有变化,函数返回
leave//离开while控制逻辑
ret
(没有打分)