ARM이 Version 이 변경이 되면서 부터 Multi Core가 지원이 되며, Core의 갯수가 증가되고, 도 GPU가 제공하면서,
성능이 많이 Upgrade되었지만, CPU의 Core의 갯수가 증가가 되었다고 많은 성능 향상이 되지 않는다고 생각한다.
어차피 Core를 연결하는 내부 Bus Clock은 CPU와 동일 할 것이며, 개별 Core 마다 L1 Cache를 가지고
있다고 하여, Main Core와 Sub Core와 통신 및 스케쥴링을 어떻게 해야 하는지 본인도 아직 잘 모르겠지만,
분명한 것은 코어가 증가한다고 해서 무조건 그 만큼의 성능은 나오지 않는다는 것이다.
한계는 이미 거의 정해져 있다고 보지만 어떻게 좀 더 성능향상을 할지가 궁금할 뿐이다.
앞으로 이부분에 대해서 좀 더 학습을 해보고, 각 개별 부분에 대해 자세히 알아본 후 추후 지속적으로 수정하겠다.
1. ARM Performance Libraries
ARM에서 제공하는
HPC(High Performance Computing)라는 Library와 Open Source를 제공하고 있다.
ARM에서 제공하는 것은 유료인것 같아, Open source만 알아 보자.
https://developer.arm.com/hpc
2. ARM HPC Open source
ARM에서 제공하는 성능 HPC Open Source Packages들이다.
- Compilers
- MPI (Message Passing Interface)
- Maths libraries:
- Utility programs
- Profiling tools
- Python packages
자세한 내용은 아래의 사이트에서 확인하자.
https://developer.arm.com/hpc/hpc-software/hpc-software-subscription/hpc-open-source-packages
흥미로운것은 MPI 이며 이 부분을 어떻게 Programing할지도 관심이다.
2.1 Compilers
MPI를 Compiler를 이용하여 Programing가능하며 일단 간단하게 각각의 Compiler를 알아보자.
GCC or LLVM의 경우도 아래와 같은 구성으로 되어 있으며, Back End에 따라 Cross Compile로 되는지 설정이 된다.
- Frontend: ( lexical analysis, Preprocessing, Syntax analysis 등 일을 한다고 한다)
- Middle end: IR 중간 Code를 생성
- Back end: code generator 실제 실행 코드 및 optimization을 한다고 한다.
Compiler 상위기본구조 가장 보편적으로 많이 사용하는 Open Source Compiler이다.
GCC의 경우 오래전에는 직접 오픈소스를 받아 빌드하여 직접 크로스컴파일러를 구성해야했지만, 이제는 칩벤더 혹은 회사에서
기본제공되어 쉽게 사용하기에도 사용하기도 편하고 메뉴얼은 GCC Manual을 보면 쉽게 자세히 알수 있다.
물론 자세히 나와 있어 세부설정을 비롯하여 내부 Prefix된 명령어도 쉽게 익힐 수 있다.
https://gcc.gnu.org/onlinedocs/
https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/ARM-Options.html#ARM-Options
- LLVM(Low-Level virtual machine)
GCC와 동일하게 컴파일 기능을 제공하며, Java의 JIT 처럼도 중간언어 기능인 비트코드를 지원가능 가능하며,성능 및 소스의 크기는 GCC보다 좋다고 한다.
현재 CLANG이라고, GCC 기반의 LLVM Compiler로 사용하려고 하고 있으며, 주로 iOS or OSX의 App에서 사용한다고 한다.
https://ko.wikipedia.org/wiki/LLVM
http://llvm.org/
https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%AD
http://ji007.tistory.com/entry/LLVM-Low-Level-Virtual-Machine
http://kyejusung.com/2015/11/llvm%EC%9D%B4%EB%9E%80-clang-%EB%B9%84%ED%8A%B8%EC%BD%94%EB%93%9C-%ED%8F%AC%ED%95%A8/
이외에도 ARM 전용 Compiler를 비롯하여 TI DSP 전용 Compiler가 존재하므로 각각의 Manual을 반드시 참조하자
특히 Linker Script 와 컴파일러 내부명령어는 컴파일러 마다 다르므로 반드시 Manual을 확인하자
2.2 Interpreter
가장 대표적인 Interpreter는 아마 Basic일 것이지만, 최근부터 많이 사용되어지는 Python은 사용하기도 쉽고 이해하기도 쉬어서 많이 사용되어진다.
세부설명아래참조
https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0
https://en.wikipedia.org/wiki/Interpreter_(computing)
Python의 경우는 실행시간에 기본적인 Python Interpreter 동작하여 이미 Compile된 Library의 Symbolic Function을 연결하여 동작하는 방식과
내부 별도의 동작방식이 존재하는 것 같다 ( 이부분 별도로 좀 더 알아봐야겠다)
주의해야할 것은 예상하지 못한 Run Time 에러의 문제일 것이며, Script 언어로만 사용되어지기보다
많이 확장이되어 사용되어지므로 많이 알아봐가면서 공부를 해야 할 것 같다.
http://materials.jeremybejarano.com/MPIwithPython/
3. Parallel Programming
https://en.wikipedia.org/wiki/Multi-core_processor
http://elinux.org/images/4/43/Understanding_And_Using_SMP_Multicore_Processors_Anderson.pdf
http://www.springer.com/cda/content/document/cda_downloaddocument/9781441997388-c2.pdf?SGWID=0-0-45-1154842-p174106775
현재 ARM은 효과적인 저전력모드를 제공하기 위해서 Multi Core들을 Big Group 과 Little Group으로 성능차이에 따라 두개의 Multi Core 그룹으로 운영하고 있다.
그리고 칩벤더에 따라 구성은 다 달라지는 것 같으며, 운영방식은 각 SoC or AP를 봐야 할 것 같다.
- Homogeneous vs. heterogeneous multicore
- Homogeneous multicore systems: 동일의 architecture 를 공유하며 사용하며 1개 이상의 Core가 구성
- Heterogeneous multicore systems: 다종의 architecture 를 1개 이상의 Core가 구성
- Symmetric vs. asymmetric multiprocessing
- SMP(symmetric multiprocessing): one kernel, multiple cores
- AMP(asymmetric multiprocessing): multiple kernel, multiple cores (아직 사용된것을 못봄)
흔히 대칭형과 비대칭형 이라고 하며, SMP 방식의 경우 Linux에서 많이 채용되어 사용되어진다.