개발 라이브러리 & 툴

Multi Process Programming Concept #2

하늘흐늘 2009. 9. 10. 19:21
반응형

이글은 zdnet에 동영상 강의를 저의 편의성에 맞게 요약하여 놓은 글입니다.
강의자는 James Reiners (Director, Intel Corporation)으로 MPP에 등장 배경에서 부터 개념, 라이브러리 소개등을 하고 있습니다.

Modern CPU Design
Power Consumption
-> 성능을 높이기 위하여 더 높은 전력을 요구하는데 비하여
     더 적은 전력량으로 n개의 CPU를 돌릴 경우 더 높은 성능을 얻을 수 있다.
     즉, 클락을 줄이는 대신에 남는 전력으로 n개의 CPU를 돌리는 것이다.
     i.e. overclock으로 13%의 성능 향상을 얻기 위하여 73%의 전력을 더 사용하여야 함
     최근에는 전력을 더 사용해도 큰 성능 향상을 얻을 수 없음    
     반대로 전력을 덜 사용하고 n개의 CPU를 돌릴 경우 더 높은 성능을 얻을 수 있음
     i.e. 51%의 전력으로 87%의 성능을 유지할 수 있음
     -> 멀티코어가 나오게된 배경이 됨

Size
    -> CPU사이즈가 적어짐에 따라 같은 크기에 몇 개의 CPU를 넣는 것이 가능해졌다.
    
Instruction Level Parallelism
-> CPU클락이 올라가면 더 많은 처리를 할 수 있지만 더 높아진 클락을 바탕으로
     성능의 향상을 보는 프로그램은 적음

Memory
-> CPU클락의 속도 증가에 비하여 Memory 속도 증가는 상대적으로 느림
     이를 만회하기 위하여 더 큰 캐쉬메모리를 사용하게 됨



Key Concepts
2 types Parallelism
    1) Task Parallelism
        여러 개의 작업을 하나씩 각각의 프로세스에게 분배하여 다중 처리
        i.e. Pipelining
             .N개의 CPUs가 N Stages의 작업을 해냄 (Pipe & Filter)
             .1개의 데이터가 N Stages를 통하여 N번 처리됨
    2) Data Parallelism
        데이터를 분할하여 여러개의 프로세스가 처리하도록 분배하여 다중 처리

관련 이론들
암달의 법칙 (1967년)
    병렬처리 되지 않는 부분의 속도 + 병렬 처리로 향상된 부분의 속도
구스타프슨(   Gustafson) (1998년)  
    병렬처리로 향상되는 부분의 양을 늘려서 전체적인 처리량을 늘린다.
    -> 결과적으로 처리 속도가 향상 된다.  (처리량 / 시간의 공식)
    -> 슈퍼컴퓨터 시장에서 처리 능력을 향상시킨 이론적 베이스 가 되었다.
    -> 완벽한 병렬처리는 아니지만 속력의 향상이 있으며
         암달의 법칙에 대한 나름대로의 해결책을 제시하여줌



Three Thinkings for MPP
Scaling
    8, 16코어 등의 환경 변화에 성능이 좋아지는 병렬 설계를 하는가?
Corrrectness
    Race Condition
    Dead Lock
Maintainability
    유지보수를 위해서는 OpenMP나 ThreadingBlock같이 높은 레벨의 추상화를 가지고 있는 라이브러리를 사용하는 것이 좋다.
    그렇지 않을 경우 소수의 첫 개발자들만이 유지 및 보수를 할 수 있는 경우가 생긴다.
   


Several Principles
Think Parallel
    병렬적으로 잘 작동할 수 있도록 설계하라.
Taks not Threads
    쓰레드를 고려하지 않은 단일 쓰레드 환경하에서 작업 중심으로 설계하라.
Tools
    사용 툴이 적절히 지원하는지 점검하자.
Sequential Debug
    한 개의 쓰레드에서도 실행가능한 프로그램을 만들어라.
Limit Use Of Locks
Memory Allocation   
Gustafson Scale Workloads



Message Passing Interface
메임프레임에서 사용하던 개념으로 10개~1000개의 코어를 보유하고 있는 슈퍼 컴퓨터들에서 많이 사용되어짐
각각의 CPU는 독립된 메모리를 가지고 있으며 서로간에 통신하기 위하여 메시지를 이용한다.
MPI_Send, MPI_Recv
한쪽에서 MPI_Send를 호출하여 데이터를 보내면 다른쪽에서는 MPI_Recv를 호출하여 데이터를 받음



Multi Process Programming을 가능하게 하는 3가지 사항
1. 라이브러리에서의 지원
     자신이 사용하는 라이브러리가 MP를 지원하는지를 살펴본다.
     i.e. 인텔 수학라이브러리 MKL
    
2. Open MP    
    컴파일러에 특정 지시자를 사용하여 힌트를 주어 병렬처리를 구현한다.
    i.e. Add pragma omp parallel for private( i, j, k)
    루프에만 한정적으로 사용함 (데이터 병렬처리 작업에 한정)
    많은 컴파일러에서 폭넣은 호환성을 지원함
    openmp.org
   
3. Threading Building Block
    상대적으로 복잡한 병렬 처리 작업을 수행
    threadbuildingblocks.org



Threading Building Block
template 기반의 C++ 라이브러리
Runtime 시스템이 CPU개수를 측정하여 자동으로 병렬로 실행한다.

parallel_reduce,
parallel_scan,
parallel_for,
parallel_while,
parallel_pipeline,
parallel_sort

for(i=begin; i<end; i++)
    output[i]=input[i]*2;

Doublemine mydbl;
mydbl.input=input;
mydbl.output=output;
//자동으로 분할하라.
parallel_for(blocked_input<int> (O, n), mydbl, auto.partitioner());

Container(Highly Concurrent)
Scalable Memory Allocator
Mutual Exclusion
Timing
Task Scheduler



왜 그런지는 모르나, 이 동영상 zdnet에서 찾아 볼 수 없으니 다른 곳에서 찾아봐야 합니다. 그리고 앞 뒤 연관시켜서 잘 듣다보면 강의자는 Intel's Threading Building Block 라이브러리를 은근 슬쩍 추천하고 있습니다.



반응형