2011-03-28 2 views
5

여러 개의 직렬 프로그램을 "병렬로"실행해야하는 경우 (문제가 간단하지만 시간이 오래 걸리기 때문에 동일한 프로그램에 대해 많은 데이터 세트를 읽어야 함) 하나의 노드 만 사용하는 경우 솔루션은 간단합니다 . 내가하는 일은 각 명령 다음에 계속해서 일련의 작업을 앰퍼샌드로 제출하는 것입니다. 작업 스크립트에서 :PBS 일괄 처리 시스템이 노드에서 여러 개의 직렬 작업을 이동합니까?

./program1 & 
./program2 & 
./program3 & 
./program4 

다른 프로세서에서 각 직렬 프로그램을 자연스럽게 실행합니다. 이것은 로그인 서버 나 독립 실행 형 워크 스테이션에서 잘 작동하며 물론 하나의 노드 만 요구하는 일괄 처리 작업에도 적합합니다.

하지만 110 개의 다른 데이터 세트를 읽으려면 동일한 프로그램의 110 개의 다른 인스턴스를 실행해야한다면 어떻게해야합니까? 110 ./program# 명령을 제출하는 스크립트로 여러 노드 (예 : 14)에 제출하면 일괄 처리 시스템이 각기 다른 노드의 다른 프로세서에서 각 작업을 실행합니까, 아니면 동일한 시스템에서 모든 작업을 실행하려고합니까? 8 코어 노드?

다른 데이터를 읽으려고 간단한 MPI 코드를 사용하려고했지만 다양한 오류가 발생하여 110 개의 프로세스 중 약 100 개가 성공하고 다른 프로세스는 충돌합니다. 나는 또한 작업 배열을 고려했지만 내 시스템에서 지원하는지 확실하지 않습니다.

개별 데이터 세트에서 직렬 프로그램을 광범위하게 테스트했습니다. 런타임 오류가 없으며 각 노드에서 사용 가능한 메모리를 초과하지 않습니다.

답변

5

아니요, PBS는 자동으로 노드 사이에 작업을 배포하지 않습니다. 그러나 이것은 일반적인 일이며, 몇 가지 옵션이 있습니다.

  • 가장 쉬운

    당신을 위해 가장 advantagous 어떤면에서는

    1 노드 크기의 덩어리로 작업 무리이며, 개별 작업으로 그 번들을 제출합니다. 이렇게하면 일자리가 더 빨리 시작됩니다. 1 노드 작업은 일반적으로 14 노드 작업보다 빠르게 스케줄됩니다. 14 노드보다 일정에 1 노드 크기의 구멍이 있기 때문입니다. 이는 모든 작업이 대략 동일한 시간이 걸리는 경우에 특히 효과적입니다. 왜냐하면 그 부서를하는 것이 꽤 간단하기 때문입니다.

  • 예를 들어 부기를 단순화하기 위해 모든 작업을 한꺼번에 수행하려는 경우 pbsdsh 명령에 액세스 할 수도 그렇지 않을 수도 있습니다. 그것의 좋은 토론이있다 here. 이를 통해 작업의 모든 프로세서에서 단일 스크립트를 실행할 수 있습니다. 그런 다음 $ PBS_VNODENUM을 쿼리하여 nnodes * ppn 작업 중 어느 것이 해당 작업인지 찾아내는 스크립트를 작성하고 적절한 작업을 실행합니다.

  • pbsdsh가 아닌 경우 Gnu parallel은 이러한 작업을 크게 단순화 할 수있는 또 다른 도구입니다. xargs와 비슷하지만, 익숙하다면 여러 노드를 포함하여 병렬로 명령을 실행할 것입니다. 따라서 14 노드 작업을 제출하고 첫 번째 노드에서 gnu 병렬 스크립트를 실행하게하십시오. 좋은 점은 작업이 모두 같은 길이가 아니더라도 스케줄링을 수행한다는 것입니다. 이러한 종류의 것들에 대해 gnu 병렬을 사용하기 위해 우리 시스템에서 사용자에게 제공하는 조언은 here입니다. gnu parallel이 시스템에 설치되어 있지 않고 어떤 이유 때문에 시스템 관리자가하지 않는다면, 홈 디렉토리에 설정할 수 있습니다. 복잡한 빌드는 아닙니다.

+0

대단히 감사합니다. 지금 제안 사항 중 일부를 구현하고 있습니다. –

+0

+1 Gnu 병렬 - 훌륭한 도구. – Owen

2

job arrays을 고려해야합니다.

간단히, (범위 0-109 당신이 원하는 임의의 정수 범위가 될 수있는,하지만 당신은 당신이 (110 개) 데이터 세트를 가지고 언급) 당신은 당신의 쉘 스크립트에서 #PBS -t 0-109를 삽입 토크는 :

  • 실행 스크립트의 110 개 인스턴스 을 지정된 자원 (스크립트에서 #PBS 태그 또는 제출시 인수로)에 할당하십시오.
  • 0부터 109까지의 고유 한 정수를 각 작업의 환경 변수 PBS_ARRAYID에 할당하십시오.

코드 내에서 환경 변수에 액세스 할 수 있다고 가정하면 각 작업이 데이터 세트 번호 PBS_ARRAYID에서 실행되도록 할 수 있습니다.