Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- C
- 멀티쓰레드
- 게임공학과
- 메모리관리
- material
- MultiCore
- Unreal
- Design Pattern
- vector
- c++
- Multithread
- 복사생성자
- 멀티코어 프로그래밍
- Atomic
- sequential
- 멀티코어
- 스마트포인터
- multi-core
- 옵저버 패턴
- 디자인패턴
- 한국산업기술대학교
- 유니크포인터
- EFFECTIVE C++
- 프레임워크
- thread
- stl
- 옵저버
- random access
- observer pattern
- 쓰레드
Archives
- Today
- Total
태크놀로지
멀티쓰레드 프로그램 작성시 주의해야할점 - CPU 본문
멀티쓰레드 프로그램 작성시 주의점
- 컴파일러
- CPU
- 상호배제의 구현
- 메모리 일관성 문제
상호배제
멀티쓰레드 프로그램에서의 문제는 하나의 자원을 여러 쓰레드에서 동시에 사용해서 생기는 경우가 대부분이다. 해결책은 상호배제
임계영역
- Critical Section
- 프로그램중 상호배제로 보호받고 있는 구간
- 오직 하나의 쓰레드만 실행할 수 있음
임계영역 구현 - lock & unlock을 사용해서 lock과 unlock 사이에 임계영역을 둔다.
lock & unlock의 문제점
- 병렬성이 없다.
- 호출하는데 오버헤드가 크다. (cpu를 많이 잡아먹음)
그럼 lock과 unlock을 어떻게 구현해야하나?
- 공유 메모리를 통해서 구현
- 피커슨, 데커, 빵집 알고리즘
-> lock을 시스템 콜로 하는게 아니라 알고리즘으로 구현함 (+특별한 명령어)
피터슨 알고리즘
- 쓰레드 2개만 가능(3개부터 안됨)
- 매개변수로 쓰레드 아이디를 전달받아야함. 또한 쓰레드 아이디는 0 또는1 이라고 가정
코드분석
Flag[myId] = true // 다른 쓰레드가 사용하는거를 막음
victim = myId
while(Flag[other] && victim == myId) // 내 쓰레드가 접근하려할때 다른쓰레드가 접근중인지를 체크
case1
두 쓰레드가 동시에 lock을 실행할 수 있음. 동시에 실행되서 bool 값이 동시에 true가 됨(데드락 발생)
victim = myId로 데드락 문제 해결
mutex와의 성능비교
멀티쓰레드(그냥) 144 / 결과 X
싱글쓰레드 199 / 결과 O
멀티쓰레드(lock) 4051 / 결과 O
싱글쓰레드(lock) 2199 / 결과 O
멀티쓰레드(peterson) 5367 / 결과 X
-> 오히려 mutex보다 더 느리고 결과도 이상함.
피터슨 알고리즘의 문제
- 빈번한 메모리 참조로 인한 성능 문제 flag, victim
- 실제 컴퓨터에서 오동작을 일으킴
결론은 피터슨 알고리즘은 mutex보다 성능과 정확성이 떨어진다.
다음 포스팅 - [실습1 베이커리 알고리즘]
베이커리 알고리즘이란 n개의 쓰레드에서 동기화 구현
- 빵집 알고리즘 구현해보기
- 1억만들기 프로그램 사용
- 쓰레드 1, 2, 4, 8, 16개 일때 실행시간을 구해라
- mutex 있고 없고 버전과 속도 비교
- 제출물
- .cpp
- 실행속도 비교표 (no lock, mutex 사용, 빵집 알고리즘)
- CPU의 종류 (모델명, 코어개수, 클럭)
- 실행시간이 30분 이상 걸리거나 컴퓨터가 버벅거리면 속도 측정 생략 가능
- 이러한 이상 현상이 생기는 원인에 대한 예측 설명
출처
한국산업기술대학교 게임공학부 정내훈 교수님 강의 - 멀티코어 프로그래밍
'멀티코어' 카테고리의 다른 글
메모리 일관성, CPU 메모리 접근방식 (0) | 2020.09.23 |
---|---|
[실습1] 베이커리 알고리즘 (0) | 2020.09.21 |
멀티쓰레드 프로그램 작성시 주의해야할점 - 컴파일러 (0) | 2020.09.16 |
멀티쓰레드 프로그래밍은 어디서 사용되고 있는가? (0) | 2020.09.13 |
멀티쓰레드 프로그래밍으로 덧셈프로그램 만들기 (이외 방법) (0) | 2020.09.13 |