写这篇文章,是为了纠正上篇关于编译技术职业发展的帖子中自己的观点可能带来的误导。
尽量让面临硕士、博士选方向的学弟学妹了解编译知识在未来计算机技术职业生涯中的重要性,以及光明的未来方向。
Continue reading »
《关于并行貌似正确的废话》系列文章:
封装这一永恒的主题,在多核的时代还会永恒下去吗?答案是肯定的!
既然四个核的存储一致性都很难通过高效的机制保证,众核时代,更是如此。这众核肯定是若干个小的,结构简单的,功能不同的核的集合体。未来的程序,单单的串行,这么多核,很难充分的利用。功耗已经很高了,多少个核,就至少是多少倍的功耗提升,仅仅依靠投机也是不行的。
《关于并行貌似正确的废话》系列文章:
怎么办?解铃还需系铃人。既然自动的做不了,程序员就需要有并行的头脑,用并行的语言和开发方式,设计,实现。怎么并行?
或许计算机和程序语言的发展史能给我们一些启发。
LLVM之父,相信有很多人都知道,Chris Lattner。从2000年开始,搞LLVM到现在。LLVM最初的想法还是来自Chris Lattner的导师:Vikram Adve。编译界的大牛。
这篇文章来自CGO 2009的Keynote:《The Next Generation of Compilers》,keynote是学术会议上的精彩环节,一般是该领域的最权威学者做主题演讲,演讲的内容是很前瞻,高屋建瓴性质的。 Continue reading »
上篇文章《前瞻-主流处理器中的数据并行支持(SIMD)>和《前瞻-拿起SIMD的武器I》分别介绍了当今主流CPU中的SIMD扩展 ,以及前人是如何利用SIMD来做优化的,本文<前瞻-拿起SIMD的武器II>将探讨如何使用CPU的向量指令为程序做优化
如何实现?
编程环境
在现在CPU设计中都加入SIMD扩展并不是解决应用性能问题的好方法。如果没有很好的利用途径,再强大的SIMD扩展指令集都是徒劳。接下来,我们从编译器技术和编程方法论上探讨如何使用SIMD指令来实现应用加速。 Continue reading »
距离GCC 4.4的发布一年之久,GNU终于发布GCC 4.5了。新版本带来了很多新特性,包括使用MPC库在编译时完成复杂的算术计算,C++0x支持增强,使用部分Graphite完成自动并行化,支持新的ARM处理器,Intel Atom优化和调优支持,以及AMD Orochi优化支持等。今年稍晚发布的Fedora 14,Ubuntu 10.10,OpenSUSE 11.3,都将有GCC4.5,估计Gentoo马上就会有支持了,磨拳擦掌准备试用喽:)详细支持如下:
总体说明:
- 编译GCC需要MPC库
- 故纸堆里的旧系统和很久没有更新和测试的系统在GCC4.5中被标记为待放弃,包括IRIX, Solaris 7, Tru64 UNIX V5.1.
- GCC4.4中标记为待放弃的支持被放弃
- 移除Itanium 1变种支持,但Itanium2编译的程序能在Itanium1上正确执行
- GCC生成的调试信息包括了更多DWARF 3的特性,甚至包含了DWARF4的一些特性.GDB7.0之前的版本将无法使用这些特性.所以调试GCC4.5编译的程序需要使用GDB7.0及以上版本.也可以使用选项 -gdwarf-s -gstrict-dwarf来禁止生成DWARF4信息,或者-gdwarf-2 -gstrict-dwarf让GCC严格执行DWARF2标准.
- X86上,浮点运算在GCC4.5上使用严格C99语法编译时,可能会运行变慢。这是为了和标准一致,可以通过选项-fexcess-precision=fast来避免严格的标准限制。
- noinline属性不再能阻止整个函数拷贝。但可以通过新的属性noclone做到。
读论文<LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation> CGO 04
1,写在前面的话
全时优化(LifeLong Optimization)对于每个编译爱好者来说,太有魅力了。我在起初也是被这个题目所吸引打算一探究竟。本文是04年LLVM的最早两位开发者Chris Lattner和Vikram Adve所写,发表在04年的CGO上,
先来说说LLVM的历史。2000年LLVM开始开发,2005年Apple雇了Chris Lattner,LLVM也相当于成了Apple的官方支持的编译器。Apple已经将它用在OpenCL的流水线优化,Xcode已经能使用llvm-gcc编译代码。可以说05年之前LLVM一直都是学术界的东西,05年之后用于工业界.而这篇文章写在04年.本博最近听过一个关于LLVM的讨论会,会中有资深人士提到LLVM现在越来越像一个普通的编译器。说这番话的意思是,我们可以从这篇文章里找到LLVM的架构设计和早期的一些实现思想,但请不要迷信LLVM现在有多么神奇,每个架构都会有它的优缺点。
这篇文章,我现在已经读完了理论和介绍部分,性能评测部分还没有读。所以标题里面加了个1,因为接下来,还想作几件事,一是读完文章,二是跟踪一下Chris Lattner最近几年的文章,三是尝试将Open64和LLVM做个对比,最后看看代码。所以敬请期待之后的系列文章。
Continue reading »
今天听了一个博士师兄的论文答辩,试图提高分布式存储并行和共享存储并行中,循环中并行粒度。
分布式存储下的并行,可以简单的理解为片间的并行,集群,很多CPU的计算机中的并行都属于这一类,这类并行强调的是消息传递,因为每个计算单元都有自己的存储空间,且这些存储是相互独立的,靠消息传递的方式来维护存储一致性,这类程序通常使用MPI工具做并行程序开发。这种并行一般是进程之间的并行,每个进程都有独立的资源管理和消息收发,地址空间相互独立。
共享存储下的并行则不同,采用线程间的并行策略,即并行任务之间采用共享存储空间的形式,存储和资源都是共享的。这类并行多存在于现在流行的多核和众核系统中。主要面临的问题是一致性,缓存一致性是最主要的,因为多核系统通常是每个单核有一级cache,而多个核之间又共享二级或者三级cache,据说CPU上30%多的功耗都用在了维持一致性上。片上面积也一半多用来做了cache。OPENMP就是为共享存储而生的编程工具。 Continue reading »
1,因为代码是从svn库里先checkout出来的,为了方面使用mercurial,就先做了清理工作。
删除当前目录下的所有.svn文件夹
find . -name “.svn” -type d -exec rm -rfv ‘{}’ \;
. 当前目录下
-name “.svn” 文件/文件夹名称为.svn
-type d 文件类型为文件夹
-exec 执行之后的命令直到 \;
rm -rfv ‘{}’ 删除find命令找到的所有文件夹 , ‘{}’表示使用find的输出做为rm的输入
Continue reading »
这个错误在于类型不符,可能是宏定义造成的,见下。最多的可能是因为; {} () 没有写对,造成编译器识别错误而出错。根据搜索结果整理如下:
1,宏定义问题
头文件
[code lang="cpp"]
#ifndef MAIN_H_
#define MAIN_H_
#include<map>
#include<string>
#include<vector>
using namespace std;
typedef map< string, vector<string> > pvMap;
typedef map< string, vector<string> >::iterator pviter;
typedef pair<map<string,vector<string> >,bool> insiter;
#endif /* MAIN_H_ */
[/code] Continue reading »

近期评论