본문 바로가기

Server/Unix, Linux

쉘 스크립트를 이용한 C 코드 병렬처리

반응형

연구의 효율을 위해선 병렬처리가 필수적이다. 병렬 처리를 하는 방법은 다양하다. 여러 방법 중, 이 글에선 아주 기초적인 수준의 병렬처리를 1대의 서버에서 스크립트 단계에서 arg를 이용해 처리하고자 한다.


0. 서론

 계산 결과를 빠르게 얻기 위해서는 프로그램에서 단순히 반복되서 처리되는 부분을 나눠서 처리하면 된다. 이러한 방법을 병렬 처리라 한다.

병렬처리에 대한 방법은 여러가지가 있다. C프로그램 내에서 자체적으로 하는 방법도 있고, que를 관리하는 torque와 같은 매니저를 이용한 방법도 있다. torque를 이용하는 방법은 클라우딩 컴퓨팅까지 가능해서 프로그램 설정을 잘 해놓으면, 여러대의 서버에서 할당 해놓은 CPU들을 통해 분산처리까지 가능하다. 하지만 초보자 수준에서는 매우 어려운 것이 사실이다. 따라서, 이번 포스팅에서는 그리 어렵지 않은, 쉘 스크립트를 통한 1대의 서버에서의 다수의 CPU를 가지고 계산하는 방법에 대해 포스팅하고자 한다. 코드 전문은 글 끝에 첨부되어있다.


1. 핵심 코드 설명

#!/bin/sh

글의 맨 앞에서, 어떤 스크립트를 사용하는지를 알려준다. /bin/bash, /bin/sh 가 가장 대중적이다.


temp=$(date '+%Y%m%d')

temp에 현재 날짜를 년월일(20170411)과 같은 방식으로 저장한다.

*스크립트에서 변수에 값을 넣을때는 띄어쓰기를 하면 안된다. 즉, temp = $... 과 같이 입력하면 에러가 발생한다.

그 아래 부분은 데이터 백업과정


g++ ~ 

은 컴파일 하는 과정


index=6

while [ $index -lt 20 ]

do

...

done

index를 6부터 시작해서, 20까지 do와 done 사이를 수행한다는 것이다.

-lt는 less than의 줄임말로 20보다 작을 때 실행한다는 것이다.

다른 옵션으로 자주 쓰는 것은 -le는 작거나 같을 때로 less or equal(?) 정도로 생각하면 될 듯 하다.


./a.out $index > $index.proc &

실행을 할 때 C코드에 arg를 넘기는 방식으로 짜놓아서 인자를 넘겨주고, 그 실행 결과를 6.proc, 10.proc 등에 저장하는데, 끝에 &를 붙인 것은 background로 실행한다는 뜻이다.


sleep 2

내가 짜 놓은 코드는 mt19937ar을 이용한 난수생성기를 이용하는데, 이때 난수의 시드값을 time을 이용하여 넘겨주는데, 이 때 같은 시드를 사용하지 않기 위해 안전하게 2초간 스크립트를 대기 시킨다.


index=$(($index+4))

인덱스를 4씩 증가시킨다.


WORK_PID=`jobs -l | awk '{print $2}'`

jobs 명령은 현재 내 터미널(?) (정확히는 현재 실행시킨 PID에 속한 하위 잡들을 보여주는 것으로 알고 있다.)에서 실행중인 모든 jobs을 보여준다. 이 때 위와 같이 실행하면 job의 PID를 모두 넘겨준다.


wait $WORK_PID

이제 여기서 실행시킨 PID 들이 남아있다면 프로그램이 기다리게 된다. 즉, 모든 job이 완료된다면 WORK_PID에 남아있는 값이 없어지고, 그렇게 되면 이 부분이 실행이 완료된다.


echo "Scrpit End! :)"

이제 모든 스크립트가 끝났기 때문에 기분 좋게 echo함수를 통해 터미널에 다음의 문구를 출력하는 것이다.


2. 스크립트 실행 방법

** 이러한 스크립트를 돌릴 때는 먼저 파일을 저장 한 후에, 실행 권한을 주어야 한다.


dos2unix <스크립트파일>

가끔 윈도우에서 서브라임텍스트같은 것을 이용하여 코드를 수정하게 되면 눈에는 잘 보이지 않는 숨겨진 문자들이 들어가서 유닉스에서 잘 인식이 안되는 경우가 있다. (변수 명에 ^M \r ?와 같은 이상한 문자들이 들어간다든지의 현상) 이런 경우 저러한 인코딩을 유닉스 파일로 바꾸어주면 잘 된다. 즉, 이 단계는 선택사항이다. 필자는 서브라임텍스트3에서 원격으로 파일을 편집하기 때문에 이와 같은 현상이 발생하여 현재 단계가 필요했다.


chmod +x <스크립트파일>

먼저 chmod를 통해 +x 옵션으로 실행권한을 준다. 


./<스크립트파일>

이제 스크립트 파일을 실행하면 된다. 또는 sh <스크립트파일> 로도 실행할 수 있다.






반응형