Upload
chang-hyun-lee
View
11
Download
0
Embed Size (px)
Citation preview
최적화 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개를모두활용한다면더좋은결과가나올것이다.