Condor는 똑같은 계산을 여러 번 해야 할 때, 여러개의 컴퓨터에 나눠서 프로그램을 시켜주는 프로그램이다. 사실 이것저것 좋은 기능이 많지만, 내가 생각하기에 우리가 쓸 기능만 적어둔다.
시뮬레이션이 필요하다. 양성자를 10^10개 쏘는 시뮬레이션이다. 양성자 1개를 쏘는데 0.01초가 걸린다. 단순 계산으로 양성자 10^10개를 쏘면 10^8초 = 1.67x10^6분 = 2.78x10^4시간 = 1157일 = 3.17년이 걸린다! 말도안돼! 한번 돌려놓고 수료할때까지 기다릴순 없다!
우리 연구실에는 총 72개의 Core가 있으니, 시뮬레이션 코드를 양성자 1.4x10^6개를 쏘개 만들고, 똑같은 일을 72개의 Core에 시키면, 시간을 1/72로 줄일 수 있다! 1157/72일 = 16일이다! 3년 걸릴 일을 16일만에 끝내고 신나게 그림을 그릴 수 있다!
물론 모든 Core가 성능이 같은 것이 아니기 때문에 16일보다는 더 걸리겠지만, 적어도 3년은 걸리지 않는다.
최근 콘도르를 아주 간단하게 사용할 수 있도록 만들어서 공지를 했는데 생각보다 어려워서 공부를 하다가 일단 생각나는 대로 적는다.
먼저 콘도르 명령어를 다음과 같이 대체 했다.
- cstat : 콘도르 상태
- cq : 콘도르 작업 리스트를 보여줌
- csub : 작업파일을 제출
- crm : 작업을 지움
그러나 왜인지 모르지만 crm 는 작동하지 않아서 원래 명령어인 condor_rm 를 사용하기로 하자.
여러개의 작업을 제출한다고 할 때 3가지의 파일이 필요하다.
- 여러개의 작업제출파일과 그 파일들을 제출할 때 사용할 작업제출매크로를 만드는 매크로 파일
- 1.번으로 부터 만들어진 작업제출파일들
- 1.번으로 부터 만들어진 작업제출매크로
그러니 사실상 1번의 매크로 파일만 쓰면 된다. 예를 들면 다음과 같다.
{
ofstream submit_macro("submit.sh");
for (auto i = 0; i < 17; i++)
{
TString name = Form("pBUU%d.sh",i);
ofstream submit_file(name);
submit_file << "# cpu 2" << endl;
submit_file << "# mem 300" << endl;
submit_file << Form("root -q -l -b run_mc.C\\(%d\\)", i) << endl;
submit_macro << "csub " << name << endl;
}
}
여기서 실질적으로 돌리고 싶은 파일은 run_mc.C 이고 매개변수는 숫자 하나로 두었는데 만약에 이게 숫자가 아니라면 배쉬파일로 쓰는게 매우 복잡해지므로 피할 수 있다면 피하는 것을 (매우 강력하게)추천한다. 돌리게 되면 pBUU0.sh, pBUU1.sh ... pBUU16.sh 의 파일이 생기고 submit.sh라는 파일도 생긴다. pBUU[0-16].sh 파일은 각각이 제출 파일이 되고 내용은 다음과 같다.
# cpu 2
# mem 300
root -q -l -b run_mc.C\(0\)
여기서 cpu 2
는 cpu를 두개 사용한다는 뜻이며 mem 300
은 메모리를 300 메가바이트를 사용한다는 뜻이니 자신의 작업에 맞게 변경하면 된다.
submit.sh 는 csub pBUU*.sh
의 나열이다.
csub pBUU0.sh
csub pBUU1.sh
...
csub pBUU16.sh
제출은 터미널에서 이 파일을 실행하면 끝!
> sh submit.sh
작업 진행상황은 cq 명령어로 볼 수 있고 작업결과는
- [작업제출파일 이름]_[날짜].err
- [작업제출파일 이름]_[날짜].log
- [작업제출파일 이름]_[날짜].out
에 지속적으로 업데이트 되므로 파일을 열어보거나 그냥
> tail -f **[작업제출파일 이름]_[날짜].out
등의 명령어로 주시하면 된다.
콘도르를 더 세밀하게 다루고 싶다면 아래 링크를 참고하자. 아래 링크 보다 더 자세하게 다루고 싶다면 그 안에 또 링크가 있다.