LLVM (Low Level Virtual Machine) compiler - APPLE 이 사용하는 최적화 컴파일러
"애플 아이폰 속도의 비밀" 이라는 재미있는 article이 있었다.
링크 : http://clien.career.co.kr/zboard/view.php?id=park&page=1&sn1=&divpage=9&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=45644
요약하자면,
애플이 현존하는 컴파일러 기법들을 연구하기 위해 개발된 언어 독립적 컴파일러 컴포넌트인 LLVM 컴파일러를 사용하면서 HW 성능을 SW 로 보상했다는 내용이다.
애플이 LLVM을 사용한 예
- GPU의 가속이 힘든 상황에서 픽셀 셰이더, 버텍스 셰이더를 SW로 효율적으로 애뮬레이션해줌.
- Mac OS X에서 그래픽 가속이 없어도 쓸만한 3D 효과를 보여줌. (MS는 불가능)
LLVM의 장점
- 현재 Xcode 관련해서 모든 컴파일 과정의 최적화에 LLVM 기술을 사용.
- ARM 칩은 RISC 아키텍쳐라서 컴파일러의 최적화에 성능 차이가 큼. (왜 그런거지...;;)
- 심지어 x86에서도 intel icc 컴파일러가 gcc 컴파일러보다 30% 정도 괜찬은 성능을 보임.
무슨말인지 모르는 부분도 있고 확인 안된 부분도 있지만 글쓴이의 말만 들어보면 좋아보임.
그런데 댓글에는 애플 아이폰 속도가 SW (컴파일러의 최적화 성능) 때문만은 아니라고 반박함..
댓글 요약
- LLVM을 애플이 손대서 버그가 많아졌다고 함. (OS X용으로 수정해서?)
- 데스크탑의 경우: intel GMA 계열에선 지원하지 않는 OpenGL 명령을 LLVM이 중간코드를 intel GMA 에 맞춰서 다시 코드를 생성해줘서 이득이 있음.
- Nvidia나 AMD의 그래픽 카드에선 LLVM으로 작성된 OpenGL 스택 이득은 거의 없음.
- 컴파일러의 목적코드의 성능도 intel icc나 MS VC++, GCC보다 속도가 떨어짐. (gcc -O0보단 빠르지만)
- LLVM의 장점은 자바처럼 중간코드를 사용해서 좀 더 유연함.
- 전체를 고치지 않고 기계에 가까운 아랫단만 고쳐서 성능의 이득을 보기가 쉬움. (이득을 얻기 위한 방법이 쉬운것뿐)
- 정리하자면, 유연한 구조와 중간단계에서의 최적화로 성능에 손해를 줄이자!!는 것이 LLVM의 목표
- 아이폰의 어플이 반응속도가 빠른것처럼 보이는 것은 실제 로딩이 다 되기 전에 더미 이미지를 뿌려서 로딩이 빨리 이루어진 것 같은 느낌을 받게 하는것이다.
여러 말들이 많지만 컴파일러 쪽도 상당히 어렵지만 SW 쪽에선 재미있는 분야인것 같다.
특히 최적화..... 공부 좀 해봐야겠다...ㅋ 공부할건 점점 싸여가고, 시간은 점점 없어지는구나.
LLVM Overview :
Low Level Virtual Machine (LLVM) is:
-
A compilation strategy designed to enable effective program optimization across the entire lifetime of a program. LLVM supports effective optimization at compile time, link-time (particularly interprocedural), run-time and offline (i.e., after software is installed), while remaining transparent to developers and maintaining compatibility with existing build scripts.
-
A virtual instruction set - LLVM is a low-level object code representation that uses simple RISC-like instructions, but provides rich, language-independent, type information and dataflow (SSA) information about operands. This combination enables sophisticated transformations on object code, while remaining light-weight enough to be attached to the executable. This combination is key to allowing link-time, run-time, and offline transformations.
-
A compiler infrastructure - LLVM is also a collection of source code that implements the language and compilation strategy. The primary components of the LLVM infrastructure are a GCC-based C & C++ front-end, a link-time optimization framework with a growing set of global and interprocedural analyses and transformations, static back-ends for many popular (and some obscure) architectures, a back-end which emits portable C code, and a Just-In-Time compilers for several architectures.
-
LLVM does not imply things that you would expect from a high-level virtual machine. It does not require garbage collection or run-time code generation (In fact, LLVM makes a great static compiler!). Note that optional LLVM components can be used to build high-level virtual machines and other systems that need these services.
LLVM is a robust system, particularly well suited for developing new mid-level language-independent analyses and optimizations of all sorts, including those that require extensive interprocedural analysis. LLVM is also a great target for front-end development for conventional or research programming languages, including those which require compile-time, link-time, or run-time optimization for effective implementation, proper tail calls or garbage collection. We have an incomplete list of projects which have used LLVM for various purposes, showing that you can get up-and-running quickly with LLVM, giving time to do interesting things, even if you only have a semester in a University course. We also have a list of ideas for projects in LLVM.
댓글
이 글 공유하기
다른 글
-
vi 텍스트 찾기 바꾸기 관련 명령어 모음
vi 텍스트 찾기 바꾸기 관련 명령어 모음
2010.02.23 -
vi를 HEX editor로 사용하기
vi를 HEX editor로 사용하기
2010.02.11 -
linux server 시간 설정하는 방법
linux server 시간 설정하는 방법
2009.12.02 -
VI 유용한 몇 가지 Tips !!
VI 유용한 몇 가지 Tips !!
2009.11.30