2010-11-19 2 views
4

데이터의 다른 부분을 분석하기 위해 대형 컴퓨터 클러스터에서 코드를 실행하려고합니다.bash의 matlab 배치 병렬 처리

다른 노드에 작업을 할당하기 위해 2 개의 루프를 만들고 노드에 포함 된 CPU를 할당했습니다.'chnJob()'이라고 쓰는 분석 함수는 데이터를 분석해야하는 부분 (이 경우 'chn'이라는 쉘 변수)을 알기 위해 인덱스를 가져와야합니다.

루프는 다음과 같이이다 :

for NODE in $NODES; do # Loop through nodes 
    for job_idx in {1..$PROCS_PER_NODE}; do # Loop through jobs per node (8 per node) 
     echo "this is the channel $chn" 
     ssh $NODE "matlab -nodisplay -nodesktop -nojvm -nosplash -r 'cd $WORK_DIR; chnJob($chn); quit'" & 
     let chn++ 
     sleep 2 
    done 
done 

내가 CHN 변수가 적절하게 증가되고 있음을 볼 수 있지만, matlab에 함수에 전달 CHN의 값이 항상 CHN의 마지막 값입니다.

아마도 이것은 matlab이 각 노드에서 열 때 많은 시간이 걸리고 bash가 그때까지 루프를 완료했기 때문일 수 있습니다. 따라서 각 MATLAB 인스턴스에 전달되는 값은 마지막 값뿐입니다.

이를 피할 방법이 있습니까? 함수를 호출 할 때 해당 변수의 값을 구울 수 있습니까?

아니면 완전히 다른 문제입니까?

답변

2

배쉬는 중괄호 범위 식의 변수를 처리 할 수 ​​없습니다. 그들은 리터럴이어야합니다 : {1..10}. 지금 가지고있는 방식 때문에 내부 루프는 항상 8 번이 아닌 (또는 PROCS_PER_NODE의 값이 무엇이든) 외부 루프의 반복마다 정확히 한 번 실행됩니다. 결과적으로 chnOriginal_chn에서 NODES * PROCS_PER_NODE까지 가야 할 때 초기 값에서 더하기 NODES으로 변경됩니다.

대신 C 스타일 for 루프를 사용하여 (즉, 당신에게 오프별로 한 문제를 제공하지 않는 경우) 당신은 for 모두 job_idxchn를 증가 할 수

for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++)) 

:

for ((job_idx=1; job_idx<=$PROCS_PER_NODE; job_idx++, chn++)) 
3

나는 그런 일이 일어나지 않는다고 생각합니다. 다음을 실행 해보십시오 :

cnt=0 
for a in 1 2; do 
    for b in 1 2; do 
    echo --- $cnt 
    ssh somehost "echo result: '$cnt'" & 
    let cnt++ 
    done 
done 

sshd이 실행되는 호스트로 somehost를 바꾸십시오. 원격으로 실행되는 echo result: '$cnt'에서 돌아 오는 숫자 0 - 3을 인쇄합니다. 따라서 자체 실행은 정상적으로 작동합니다.

내가 제안 할 수있는 한 가지는 명령 (matlab ...)을 알려진 폴더의 일부 스크립트로 옮긴 다음 해당 스크립트의 전체 경로를 제공하여 위의 루프에서 해당 스크립트를 실행하는 것입니다. 같은 뭔가 : 스크립트에서

ssh $NOTE "/path/to/script.sh $cnt" 

$1 당신에게 당신이 원하는 값 (루프에서 즉 $cnt)을 제공 할 것입니다. 스크립트 시작 부분에 echo $1 >> /tmp/values을 사용하여 /tmp/values 파일의 모든 값을 수집 할 수 있습니다. 물론, 시작하기 전에 rm /tmp/values. 이렇게하면 원하는 모든 값을 얻었는지 확인할 수 있습니다.

0

$ PBS_NODEFILE에 노드 목록 (한 줄에 하나씩)이있는 파일 이름이 포함되어 있으면이 코드가 작동합니다.

seq 1 100 | parallel --slf $PBS_NODEFILE "matlab -nodisplay -nodesktop -nojvm -nosplash -r 'cd $WORK_DIR; chnJob({}); quit'" 

자세히 알아보기 : https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1