|
아래와 같은 간단한 멀티스레드 프로그램이 있다. 각 스레드가 각각의 변수에다 계산을 하는 코드이다. 코드 자체는 제대로 작동은 하지만 최적 성능의 관점에서 보면 문제점이 있는 코드다. 그래서 이런 코드가 멀티코어 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 Jiyoon at 02/04 저도 아들 돌잔치때 돌잡이 .. by 박상욱 at 01/18 미국 대학원 원서 작성중에 p.. by 태클사이야 at 01/13 TO: 박PD 로그인 하지 않아.. by 박응용 at 01/10 http://gigglehd.com/zbx.. by dhunter at 12/28 우와.. 좋네요. 태반이 .. by 윤광배 at 12/17 항상 좋은 글 잘 보고 있습니.. by y2k at 11/23 글이 좋아서 제 블로그에 담.. by 쏭섭 at 11/23 최근 등록된 트랙백
메뉴릿
이글루 파인더
|