레이블이 라즈베리 파이 2인 게시물을 표시합니다. 모든 게시물 표시
레이블이 라즈베리 파이 2인 게시물을 표시합니다. 모든 게시물 표시

2015년 9월 6일 일요일

라즈베리파이2에서 NEON을 사용하기 위해 gcc-5.1.0 컴파일하기

라즈베리 파이에 사용된 프로세서에는 NEON이라는 SIMD (Single Instruction Multiple Data)처리 유닛이 들어있다. 이 NEON을 사용하면 최대 128비트까지 동시에 처리가 가능해 지기 때문에 프로그램 실행에 상당한 성능 향상을 가져올 수 있게 된다. x86계열로 치면 MMX, SSE, AVX 명령등에 이에 해당한다.


char 타입의 연산인 경우 약 5배, short 타입 연산은 약 3배, int 타입 연산은 약 1.7배, float 타입 연산은 약 2.3배 정도로 실행 속도가 향상된다. 즉 반복적인 연산이 많은 scientific computation이나 signal processing, 암호화, 압축, 인코딩 등에 사용하면 매우 유용하다.



부동 소수점만 보면 단정도(single precision)의 경우 라즈베리 파이1이 약 70 MFlops, 라즈베리 파이2에서 NEON을 사용하지 않으며 약 150 MFlops, NEON을 사용하면 약 310 MFlops의 속도가 나온다. 부동 소수점 배정도(double precision)의 경우 라즈베리 파이1이 약 35 MFlops, 라즈베리 파이2에서는 약 150 MFlops정도의 속도가 나오게 된다. (부동소수점 연산에서 배정도의 경우 NEON이 지원하지 않음)

단 컴파일 시 NEON 명령을 지원하도록 하려면 현재 distribution에 포함되어 있는 gcc로는 안되고 NEON을 지원하도록 gcc-5.1.0을 설치해 줘야 한다.

먼저 gcc-5.1.0 소스코드를 다운로드 한다.

$ curl -O http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.1.0/gcc-5.1.0.tar.bz2
$ tar xvf gcc-5.1.0.tar.bz2

gcc를 컴파일 하기 위해서는 디폴트 swap 파티션 용량이 부족하기 때문에 swap 파티션 용량을 늘려줘야 한다.

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

현재 apt-get으로 설치되는 autoconf 버젼은 2.69인데 gcc-5.1.0은 2.64를 사용하도록 설정되어 있다. 그래서 이걸 2.69를 사용하도록 수정해 줘야 한다.

(1) gcc-5.1.0 디렉토리에 있는 configure.ac 파일 안의 AC_PREREQ 값을 '2.64'에서 '2.69'로 수정
(2) gcc-5.1.0/config 디렉토리에 있는 override.m4 파일 안의 _GCC_AUTOCONF_VERSION 값을  '2.64'에서 '2.69'로 수정

GCC-5.1.0에서는 병렬화를 위해 언어확장으로 cilk를 표준으로 사용하므로 cilk도 활성화 시켜 줌

(1) gcc-5.1.0/libcilkrts 디렉토리에 있는 configure.tgt 안의 UNSUPPORTED=1 을 앞에 '#'를 붙여 comment out 시킴 ('1'을 '0'으로 바꾸는건 안됨)
(2) gcc-5.1.0/libcilkrts/runtime/config/generic 디렉토리에 있는 cilk-abi-vla.c 안의 vla_internal_heap_free 함수를 호출하는 부분에서 첫번째 인자를 't'에서 'p'로 수정
(3) gcc-5.1.0/libcilkrts/runtime/config/generic 디렉토리에 있는 os_fence.h 안의 __cilkrts_fence의 정의 부분의 맨 앞에 '//'를 추가해 comment out 시킴
COMMON_SYSDEP void __cilkrts_fence(void); /// < MFENCE instruction
(4) gcc-5.1.0/libcilkrts/runtime/config/generic 디렉토리에 있는 os_fence.h 파일에 아래줄을 추가
#define __cilkrts_fence() __asm__ volatile ("DSB")

빌드를 위해 GMP, MPFR, LIBMPC가 필요하므로 설치해 줌

$ sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev

빌드를 시작

$ mkdir b; cd b
$ ../configure --enable-languages=c,c++ \
--prefix=/usr/local/gcc-5.1.0 \
--target=arm-linux-gnueabihf \
--with-arch=armv7-a \
--with-fpu=vfp \
--with-float=hard \
--build=arm-linux-gnueabihf \
--host=arm-linux-gnueabihf
$ make
$ sudo make install

설치가 완료된 후 gcc-5.1.0을 사용하도록 환경변수를 설정해 준다. '.profile' 또는 '.bashrc' 파일의 맨 마지막에 다음 두 줄을 추가한다.

export PATH=/usr/local/gcc-5.1.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/gcc-5.1.0/lib:$LD_LIBRARY_PATH

라즈베리파이1에서 컴파일 하는 경우 configure 옵션을 다르게 줘야 한다.

$ ../configure --enable-languages=c,c++ \
--prefix=/usr/local/gcc-5.1.0 \
--target=arm-linux-gnueabihf \ 
--with-fpu=vfp \
--with-float=hard \
--build=arm-linux-gnueabihf \
--host=arm-linux-gnueabihf

빌드에는 상당한 인내심이 필요하다. 'make' 명령으로 빌드하는데 라즈베리파이2에서 대략 30시간 정도 걸렸다.

바로 사용하고 싶은 사람들은 아래 링크에서 컴파일 된 gcc-5.1.0을 받아 /usr/local 디렉토리에 풀어주고 환경변수 설정만 하면 된다.

gcc-5.1.0.compiled_for_rpi2.tgz

2015년 2월 4일 수요일

라즈베리 파이 2에서 Windows 10 지원 발표

오늘 받아본 메일에 놀라운 내용이 들어있었다.
MS가 Raspberry Pi 2에서도 Windows 10을 지원한다는 것이다.


기존의 라즈베리는 성능이 딸려 힘들텐데...라는 생각을 하고 있었는데 확인해보니 라즈베리 파이 2라는 보드가 새로 나왔다.


사진으로 봐서는 기존의 B+ 모델과 거의 동일한 형태인데 사양은 많이 좋아졌다.

기존 모델은 BMC2835 SoC를 장착해 700MHz ARM 11 코어를 사용했는데 비해 새 모델은 BCM2836 SoC를 장착해 900MHz quad-core ARM Cortex A7을 사용하기 때문에 기존 모델에 비해 대략 6배 정도의 속도 향상이 있다고 한다. 메모리도 1GB로 이전 모델에 비해 두배가 되었다.

그럼에도 불구하고 가격은 이전 모델과 동일하게 $35라고 한다.

라즈베리 파이 2에서 사용될 윈도우 10은 개발자 커뮤니티에 무료로 제공한다고 하니 앞으로는 DIY에도 윈도우를 사용한 작품들도 늘어날 듯 하다.

윈도우 10 지원은 오늘 발표된 것이고 다음달쯤 상세 사항을 공개한다고 한다.

Can not wait to see Windows 10 working on Raspberry pi 2!!!