|
아래와 같은 간단한 멀티스레드 프로그램이 있다. 각 스레드가 각각의 변수에다 계산을 하는 코드이다. 코드 자체는 제대로 작동은 하지만 최적 성능의 관점에서 보면 문제점이 있는 코드다. 그래서 이런 코드가 멀티코어 CPU에서 빡세게 돌 때는 심각한 성능 저하가 일어날 수 있다. 테스트해보니 아래 코드는 내 컴퓨터 (Core 2 Duo E6400) 에서 약 1.37초가 걸린다. 그러나 문제점을 수정할 경우에는 대략 (릴리즈모드로 컴파일) 1.13초가 걸린다. 약 20%가 넘는 차이다. 만약 그냥 디버그 모드로 컴파일 할 경우에는 그 차이가 3배에 달한다. 한번 문제가 무엇인지 잘 생각해보고 최적의 성능을 얻기 위해 코드를 수정 해보세요. 코드는 윈도우 용이고 리눅스에서도 간단히 pthread로 만들 수 있음. volatile을 쓴 이유는 이 코드를 그대로 최적화 컴파일하면 for 루프가 그냥 사라지게 된다. 왜냐면 data1, data2를 아무도 참조하지 않기 때문에 그냥 날려버린다. 그래서 이걸 막기 위해 최적화를 하지마라는 의미에서 volatile이 필요하다. 이 코드는 듀얼 코어 이상에서만 코드 수정으로 성능 차이를 목격 할 수 있다. 그리고 for 루프에서 계산하는 data1, data2 전역 변수는 다른 스레드가 그 중간 값을 관찰할 수 있어야 한다는 조건이 더 있다. 즉, for 루프 계산을 로컬 변수로 대체하는 것 말고, for 계산 부분에서 전역 변수 업데이트는 그대로 둬야만 한다. #include <windows.H>
최근 등록된 덧글
이 글을 보고 온라인 알고리..
by 김정은 at 02:45 리눅스 커널도 바닐라가 있죠.. by Corund at 07/03 궁금증이 이제야 풀리네요... by 유겸애비 at 07/03 아무래도 mpeg 코덱 특성 .. by object at 07/02 그런 건 아닙니다. 논문 중에.. by object at 07/02 최근에 LCD TV를 구입해서.. by kirrie at 07/02 Supreme Commander의 .. by daybreaker at 07/02 같은 입맛을 가지셨군요... by 덤덤 at 07/02 최근 등록된 트랙백
메뉴릿
|