Download pdf - Optimizing merge program

Transcript

고급시스템프로그래밍Optimizing merge program

컴퓨터공학과20113313 이창현

Merge.c 코드는..

1. 두개의파일을하나로합치는프로그램이다.2. 각파일을한줄씩읽고번갈아가며새로운파일에 write한다.3. 입출력에파일스트림을이용한다.

최적화 1) 파일입출력함수변경

open함수는시스템에서제공해주는버퍼를이용하며, fopen함수는C 표준라이브러리에서할당해주는버퍼를이용한다.

fopen()함수는이중버퍼를사용하며파일에서한번데이터를읽어온후다음번에얼마정도의데이터를가져올지모르기때문에버퍼에미리얼마간의데이터를적재함으로서 system call횟수를줄인다.

하지만 merge.c와같이사용자가파일에서어느정도크기의데이터를가져올지알고있을때, open함수로한번의 system call에서필요한데이터를모두가져오는것이파일read를여러번실행하는것보다 system call 횟수를줄이기에효율적일것이다.

최적화 1) 파일입출력함수변경

파일입출력함수를바꾼모습.read()함수로 100메가크기의파일을

메인메모리로한번에읽어왔다.(merge_read_write.c)

합쳐진파일을 write할때또한 200메가

크기를한번에 write해주었다.

>> 결과:실행시간이절반가량줄어듬

최적화 2) 병렬프로그래밍

오른쪽사진은라즈베리파이내의 CPU 갯

수가 4개임을알려준다.

이와같은다중코어시스템에서는여러개

의스레드를동시에사용하면서실행시간

을단축시킬수있다.

> less /proc/cpuinfo

최적화 2) 병렬프로그래밍

본코드에서는병렬프로그래밍을더쉽게적용하기위해오픈소스라이브러리중하나인 OpenMP를이용했다.그림1은두개의파일을읽는행동을동시에하도록만든 task parallel코드

그림2는 reverse함수 for-loop의각루프가 서로 dependency가없으므로적용시킨data parallel코드 (merge_openmp.c)

그림 1. 파일read 병렬화 그림 2. reverse함수병렬화

최적화 2) 병렬프로그래밍

하지만총실행시간은오히려늘어났다! (약 55초->80초)

이유: reverse함수는수없이많이실행되는함수.실행시킬때마다각스레드에할당시키는것또한 context switch에따른

overhead가발생하며 overhead로발생하는낭비가스레딩으로줄어든

시간보다컸음을의미한다.

결론: 병렬프로그래밍을적용할다른방법을찾아야한다.

최적화 3) reverse 분할

지금까지는파일에서입력받은두버퍼에서한줄씩읽고 reverse후바로출력버퍼에써주었다.원본버퍼를 reverse해주는부분을함수로따로떼어낸후스레드를할당해주면어떨까

=> 결과:오히려시간이늘어났다.(약 55초 => 70초)

reverse함수병렬화

<merge_divide_reverse.c>

최적화 4) write 분할

Race condition때문에두입력버퍼에서한줄씩읽어출력버퍼에쓰는행동을

동시에할수는없다.

출력버퍼에쓰는구간을앞부분과뒷부분으로나눠각각스레드를할당해주면실행시간을좀더줄일수있을것이다.

=> 결과:실행시간이약간줄어들었다. (약 55초 -> 45초)=> 여기에서는스레드 2개까지밖에활용하지못했지만스레드 4개를모두활용한다면더좋은결과가나올것이다.

측정결과

단위: sec

System call이최소화되도록입출력함수를바꿔준것과, 출력버퍼에쓰는구간을나눠각각스레드를할당해준것이실행시간을줄이는데효과가있었다.