20160322

동시성 프로그램의 이해
– mutex_lock이 lock을 얻지 못하면 쓰레드는 더이상 진행하지 못하고 sleep한다. lock을 얻을 수 있게 되면 wake해서 실행을 계속하게 된다. Classical implementation of mutex_lock은 lock을 얻지 못하면 sleep한다. mutex_trylock은 lock을 얻지 못해도 대기하지 않는다. 대신에 mutex_trylock은 lock의 상태를 반환한다. 이에 기반하여 코드를 진행할 수 있다. mutex_trylock을 사용하면 오버헤드를 줄일 수 있다. 경우를 잘 고려해야 한다.

Condition variable은 쓰레드 사이에 통신을 위한 방법이다. 사용 방식은 단순하다. 특정 조건을 사용해 쓰레드의 진행을 조작할 수 있고, 다른 쓰레드가 해당 조건을 설정해줄 수 있다.
-> Interrupt는 하드웨어와 커널의 통신 방식,
-> signal은 커널과 프로세스의 통신 방식,
-> condition variable은 쓰레드와 쓰레드 사이의 통신 방식이라는 차이가 있다.

Condition variable을 사용해 producer, consumer 관계 표현 가능. pthread_cond_wait이 호출되면 sleep 상태로 변하는데, 이 때 미리 잡은 lock을 반환하고 sleep한다. 그리고 wake할 때 lock을 잡으며 wake한다. lock을 잡고 sleep하면 deadlock에 빠진다. multiple buffer가 있을 때 어떻게 구현할 수 있는지도 생각해보라.

read-write lock. 많은 경우에 여러 개의 reader와 한 개의 writer로 구성된다. read-write lock은 한 개의 writer가 쓸 수 있고, 여러 개의 reader가 동시에 읽는 것을 지원하는 locking mechanism이다. multiple reader single writer임에도 기존의 lock 사용하면 성능 저하 발생. rwlock의 구현에는 reader의 수를 유지하는 카운터, writer가 있는지 정보 유지하는 변수, 읽기 또는 쓰기 진행 가능 여부 변수, 기다리는 writer를 기억해두기 위한 변수 등이 필요하다.

pthread_cond_signal은 해당 조건에 맞는 한 개의 쓰레드를 깨운다. pthread_cond_broadcast는 해당 조건에 맞는 모든 쓰레드를 깨운다. 슬라이드의 코드에서는 writer가 우선순위를 갖는다. 슬라이드의 코드에 버그가 있다. writer가 있는 중에 한 개의 reader가 들어오는 상황을 가정하자. 이 때 reader 수가 증가하지 않아, writer가 unlock해도 reader가 진행할 수 없음.

Barrier는 모든 쓰레드가 해당 barrier에 도달하기를 기다린 뒤에 진행한다. 쓰레드들이 도착할 때마다 공유 변수를 증가시키고, 맨 마지막 쓰레드가 공유 변수 값이 threshold에 도달하면 진행시킨다. log barrier가 더 빠르다.

– OpenMP는 프로그래밍을 쉽게 할 수 있도록 해준다. pthread와 유사하게 동작한다. OpenMP의 초기 버전은 fork-join model이다. Cilk는 tree/graph(spawn) model을 사용한다. 아래와 같이 pragma를 사용해 병렬화할 수 있다.

#pragma omp directive [clause list]

– 예를 들어서 설명해보자.

#pragma omp parallel num_threads(8) private (a) shared (b)

8개의 쓰레드를 사용해 다음에 나오는 문장을 병렬화하고, a는 쓰레드별로 갖는 변수, b는 쓰레드끼리 공유하는 변수이다. pragma 뒤에 if문을 사용해 conditional parallelization이 가능하다. num_threads를 사용해 concurrency를 조절할 수 있다. firstprivate은 해당 변수를 병렬화 이전에 초기화하는 것을 의미한다. private은 변수를 초기화하지 않으므로, 병렬화 코드 안에서 초기화해야 한다. reduction은 쓰레드가 반환되면 그 결과가 어떻게 합쳐질 것인지를 나타낸다.

Advertisements
Tagged with: , , , , , , , , , ,
Posted in 1) Memo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 88,534 hits
%d bloggers like this: