2013-06-08 4 views
0

호를 명령으로 여러 번 호출하는 스크립트를 실행하고 있습니다. mpirun에 대한 각 호출은 자체 디렉토리에 출력을 기록하지만 주어진 실행이 이전 실행 출력 디렉토리의 데이터를 사용하는 방식에 종속됩니다.slurm에서 실행되는 mpi 프로그램의 조기 종료 제어?

mpi 프로그램은 내부적으로 몇 가지 수렴 조건이 충족 될 경우 종료되는 반복 최적화 알고리즘을 수행합니다. 가끔 알고리즘이 그 기준이 아직 충족되지 않은 상태에 이르게되지만 출력 (디스크에 연속적으로 쓰여짐)을 플로팅함으로써 중요한 것들이 수렴되었다는 것을 쉽게 알 수 있습니다. 추가 반복은 더 이상 최종 결과의 본질을 변경하지 않을 것입니다.

내가 찾고있는 것은 제어 된 방식으로 실행을 수동으로 종료하고 외부 스크립트를 다음 mpirun 호출로 진행시키는 방법입니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까? 실제로 계산이 수행되는 노드에 직접 액세스 할 수는 없지만 모든 slurms 명령과 개별 작업 디렉토리에 대한 액세스 권한이 있습니다. mpi 프로그램의 전체 소스 코드에 액세스 할 수 있습니다.

수동으로 실행을 종료하려면 수동으로 과 같은 특수한 이름의 파일을 작업 디렉토리에 넣습니다. 이는 touch killme으로 쉽게 수행 할 수 있습니다. mpi 프로그램은이 파일의 존재를 정기적으로 확인하고 제어되는 방식으로 종료됩니다. 바깥 쪽 스크립트 또는 슬럼 (slurm)은 여기에 전혀 관여하지 않을 것이고 스크립트는 다음 mpirun 호출로 계속 진행할 것입니다. 이 솔루션에 대해 어떻게 생각하십니까? 당신은 더 나은 것을 생각할 수 있습니까?

+1

그런 일 동안, 알고리즘,하지만 (continuosly 디스크에 기록) 출력을 음모에 의해 그 기준이 매우 아직 충족되지 않은 상태에 도달 한 아주 쉽게 말할 수 있습니다 중요한 일이 수렴하고 더 많은 반복이 더 이상 최종 결과의 성격을 바꾸지 않을 것입니다 .' 왜 당신이 수렴 기준을 개선하지 않습니까? 또는 명시 적 사용자 종료를 원하십니까? 마스터 프로세스에서 SIGNAL을 수락하고 모든 것을 올바르게 종료하면 그럴 수 있습니다. – Bort

+1

알 수없는 경우를 대비하여 [scancel] (https://computing.llnl.gov/tutorials/linux_clusters/man/scancel.txt)을 사용하여 slurm에서 실행중인 작업에 신호를 보낼 수 있습니다. – Bort

+0

감사합니다.'scancel '과 함께 전달 된 신호를 다루는 데 대해 살펴 보겠습니다. 그러나이 특별한 경우에는 수렴 기준을 개선하는 것이 어려울 수 있습니다 ... –

답변

1

다음은 신호로 SIGUSR1을 얻기위한 간단한 코드 단편입니다. 자세한 설명은 here입니다. `모든 한 번에

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <string.h> 
#include <unistd.h> 

void sighandler(int signum, siginfo_t *info, void *ptr) { 
    fprintf(stderr, "Received signal %d\n", signum); 
    fprintf(stderr, "Signal originates from process %lu\n", 
      (unsigned long) info->si_pid); 
    fprintf(stderr, "Shutting down properly.\n"); 
    exit(0); 
} 

int main(int argc, char** argv) { 
    struct sigaction act; 
    printf("pid %lu\n", (unsigned long) getpid()); 

    memset(&act, 0, sizeof(act)); 

    act.sa_sigaction = sighandler; 
    act.sa_flags = SA_SIGINFO; 

    sigaction(SIGUSR1, &act, NULL); 

    while (1) { 
    }; 

    return 0; 
} 
+0

사이드 노트 : 재진입 기능이 아니므로 신호 처리기에서 'fprintf'를 사용하면 안됩니다. – damienfrancois

관련 문제