2015년 4월 6일 월요일

01. 안드로이드와 병렬처리

* 위 블로그는 스터디를 정리한 것이므로 참고용으로만 사용하시길 바랍니다.


    1. 안드로이드 병렬 프로그램의 종류

    • ARM SIMD(NEON)
    • 안드로이드 멀티스레드(MARE, OpenMP)
    • 모바일 GPGPU(Open CL)

     2. ARM SIMD(NEON)

    • 일반적으로 어셈블리 명령어를 기본으로하며, C 언어 형식의 내장함수로 지원한다.
    • CPU의 명령어를 사용하므로 모바일 기기의 하드웨어 특성을 적게받는다.
    • 싱글코어 CPU에서도 빠르게 동작한다.
    • 병렬처리가 간편하다.
    • 벡터 변수의 데이터 크기는 64bit, 128bit 두개가 있다.
    • int8X8_t ~~ int32X2_t  (64bit)
    • int8X16_t ~~ int64X2_t (128bit)
    • SIMD 명령어 지원
    • 독립 레지스터(Q레지스터)
    • 독립 파이프라인
    • 정수와 부동소수점 기능을 모두 지원
    • 데이터 조작의 효율성이 높으며, 최소한의 메모리 접근이 가능
    • 광범위한 멀티미디어 코덱 개발 가능
    • CPU클록 수의 감소
    • 저전력
    • 애플리케이션 코드 효율의 증가

     3. 안드로이드 멀티스레드(MARE, OpenMP)

    • 공유 메모리 병렬 처리 기법을 말한다..
    • 자바의스레드, 퀄컴의 MARE등이 속한다.
    • 병행처리와 헷갈리면 안된다.
    • 기존코드를 재활용 할 수 있다.
    • CPU의 개수가 증가함에 따라 어플리케이션의 성능도 향상된다.

     4. 모바일 GPGPU(Open CL)

    • MIMD에 포함된다.
    • CPU보다 메모리의 용량이 크다
    • C 표준 컴파일러를 확장한 형태이다.
    • 콘텍스트 스위칭이 빠르다.

     5. NEON 애플리케이션의 동작구조

    • 메모리(배열) 변수에 있는 값을 벡터 변수에 대입한다.
    • NEON 명령어 또는 함수를 이용하여 벡터 변수 연산을 실행한다. 벡터변수 연산은 루프를 돌면서 반복해서 연산을 실행한다.
    • 벡터 변수에 저장된 결과를 메모리(배열) 변수로 저장한다.


     6. NEON 적용과정

    • 일반애플리케이션의 디버깅과 테스트를 완료해야한다. 일반 애플리케이션의 버그는 NEON에서도 발견된다.
    • 일반 애플리케이션의 병목 구간 또는 코어 부분을 확인한다.
    • NEON구조에 적당한지 확인한다.
    • 128bit, 64bit에 담을 수 있는 데이터의 개수를 설정한다.
    • 얼마나 성능이 개선될지 예측한다.
    • NEON 애플리케이션의 제작 및 디버깅 기간을 계산한다.
    • 제작하고 나서 NEON과 일반 애플리케이션의 성능을 비교한다.

    7. NEON 사용 방법

    • C언어
    • OpenMAX DL 라이브러리
    • 자동벡터화
    • 어셈블리어
    • 인트린식





댓글 1개: