728x90
Multicore Programming

Multicore Programming

  • 스레드 : CPU 활용을 위한 기본 단위
    • 멀티프로세스의 단점 : 동일 기능의 각 프로세스마다 code, data, file을 각각 할당하므로 처리 부담 증가
    • multithread
      • 프로세서 내의code, data, file은 공유한 상태로 레지스터, 스택, PC 등은 나누어 할당
      • 멀티프로세싱 대비 연산 비용이 적음
      • 같은 프로세스 자원을 공유하므로 shared memory / message passing보다 자원 공유가 쉬움
  • Multicore programming 시 고려할 점
    • 작업 분할, 데이터 분할, 데이터 의존성
    • 불완전할 시 프로세스 간 데이터 의존으로 인해 속도 저하
  • Concurrency / Parallelism
    • Concurrency : 다수의 작업이 동시에 수행(시분할)
      • 단일 코어에서 task 1, task 2, task 3...을 번갈아가며 조금씩 처리
    • Parallelism : 다수의 작업이 동시에, 독립적으로 수행
      • 코어 1 : task 1 / 코어 2 : task 2 ...
      • data parallel : 동일 데이터를 분할, 각 코어가 동일한 동작 수행 (ex. 1~100까지 더할 때 1~25 / 26~50 / ... 로 연산 데이터를 나눔)
      • task parallel : 작업을 분할하여 각 코어에 할당
  • Amdahl's Law
    • 동시성 프로그래밍으로 얻을 수 있는 성능 향상
    • speedup[S+1SN]1speedup\leq[S+\frac{1-S}{N}]^{-1} ( S : 병렬화 불가 부분, N : 코어 수 )
      • ex. S=25%, N=2 >> speedup은 최대 약 1.6배
      • 코어 N이 무한히 증가 >> 속도는 1/S로 수렴

Multithread model

  • 스레드의 종류
    • User thread : POSIX, window, java thread library
    • Kernel thread
  • Many-to-One
    • user thread : kernel thread = N:1
    • 멀티코어에서도 각 스레드가 병렬 처리되지 않을 수 있음
    • 구현이 쉬움
    • Ex. Solaris, GNU
  • One-to-One
    • user thread : kernel thread = 1:1
    • 병렬 처리 가능, 높은 동시성
    • 높은 Overhead : kernel thread가 많이 할당되어야 함
  • Many-to-Many
    • user thread : kernel thread = N:M
    • 구현이 복잡하여 최근에는 잘 쓰이지 않음
  • two-level : 여러 multithread model을 혼합하여 사용

Thread Library

  • Pthread
    • POSIX 표준에 따른 스레드 생성 및 동기화 API
      • POSIX API는 실제 구현이 아닌 동작 방식만 나타냄
    • UNIX 계열 OS에서 사용
  • Java Thread
    • JVM에 의해 관리
    • thread class의 extend 혹은 Runnable 인터페이스의 implement로 스레드 생성

Implicit Thread

  • Thread 구현에 필요한 노력을 경감
  • Thread Pool
    • 일정량의 스레드를 미리 생성
    • Pool 내의 빈 스레드에 작업 할당
    • 예측 가능한 범위 내에서 스레드 동작 가능
  • Fork-Join
    • 분할-정복법
    • 여러 개의 thread로 나눈 후(fork), 스레드 종료를 대기(join)
  • OpenMP
    • C, C++, 포트란의 컴파일러 명령어와 API
    • #pragma omp parallel로 병렬 처리가 가능한 부분을 선언
#pragma omp parallel for for(i=0;i<N;i++) { c[i] = a[i] + b[i]; // fork-join 방식으로 각 스레드에 0~N의 구간을 나누어 처리 }

Threading Issue

  • 스레드 fork와 exec
    • 프로세스 내의 한 스레드에서 fork > 새로운 프로세스 생성
      • fork 시 복사된 프로세스에는 해당 스레드만 유지하거나, 모든 스레드를 같이 복사할 수 있음
    • exec 호출 : 호출한 main thread 외에는 kill
  • Signal Handling
    • Signal : Linux/Unit의 프로세스 이벤트
      • 인터럽트가 HW적 event라면, Signal은 SW적 Event
      • Signal Handler가 Signal을 전달
      • dehault handler : Process 생성 시 같이 생성
    • Signal의 전달 방식
      • 시그널이 발생한 스레드에 전달
        • memory violation, divide by zero 등
        • Synchronous Signal : 발생한 스레드가 명확한 Signal
      • 프로세스 내의 모든 스레드에 전달
        • Crtl+C 명령어(Linux의 강제 종료 명령어) 등
      • 특정 스레드에 모든 시그널 전달
    • 스레드 동작 시 시그널 유발
      • 시그널을 처리하기 위해 bitmask 사용 (시그널을 처리할 / 하지 않을 스레드 지정)
  • Thread Cancellation
    • 외부에서 스레드를 강제 종료
    • Asynchronous cancellation : 모든 target thread를 즉시 삭제
    • Deferred cancelation : 스레드가 삭제 가능할 때 제거
      • 스레드가 중요 자료를 접근하고 있을 때 삭제 시 문제를 방지하기 위함
      • 기본 cancellation type
  • Thread - Local Storage
    • TLS라고도 함
    • 멀티스레드는 같은 메모리를 참조
    • Local 변수는 함수 내에서만 선언
    • TLS는 특정 스레드 내에서만 사용
  • Scheduler Activation
    • M:M thread model의 Issue
    • Lightweight Process(LWP) : 가상의 process를 통해 user - kernel thread 연결
      • upcall : kernel thread를 갖고 있는 LWP가 user thread에 할당된 경우, 새 LWP를 호출하여 해당 문제를 해결
728x90

+ Recent posts