2

기존 실행 파일을 병렬로 실행하는 방법에 관한 솔루션을 생각하려고합니다. 지금까지 제가 말한 것은 지정된 실행 파일을 큐에 넣는 래퍼를 만드는 것입니다 ('server'에 의해 관리 됨). 내가 가진 문제는 출력이 다른 실행 가능한 입력 인 여러 실행 파일을 실행해야 할 때입니다.기존 실행 파일을 병렬로 실행하는 일반적인 방법

예 :

저는 실행 을 그 출력 파일 (이미지) 인. 만들 수있는 방법이 : 나는 누구의 입력 파일 (이 아카이브에 저장합니다, 의 이미지에서 축소판을 생성 등을 고려)

질문은의 목록입니다 다른 실행 B 실행 프로세스가 완료 될 때까지 기다릴 수 있습니까?

표준 방법이 있습니까? 저는 개념보다는 언어에 관심이 있습니다. 솔루션이 크로스 플랫폼이라면 좋겠지 만 지금은 솔루션이 없으므로 아이디어를 자유롭게 공유 할 수 있습니다. C/C++에서 어떻게 든 수행 될 것이라고 가정합니다.

간략화 :


I 어떤 실행 () 백그라운드에서 실행 입력으로 그 출력을 사용하는 다른 실행 ( B)를 가지고있다. 필요한 모든 입력 파일을 사용할 수있을 때까지 B의 실행을 어떻게 차단할 수 있습니까?

참고 : 실행 시스템에서 지속적으로 실행하지만, 입력 파일 중 일부가 B 주기적으로 '수집'된다. 울리

+0

프로세스 간 통신에 사용할 수있는 여러 가지 방법이 있습니다. [다음은 몇 가지 예입니다.] (http : //en.wikipedia.org/wiki/Inter-process_communication) –

+0

@RobertHarvey 나는 IPC에 동의한다. (나는 그것을 사용하고있다.)하지만 ** B ** 실행 파일이 다른 서버에서 실행되는 동안 언급 된 '서버'를 통해 모든 것을 비동기 적으로 실행한다고 상상해 보라. ** A ** 실행 파일이 실행됩니다. 문제는 모든 입력 파일이 완료 될 때까지 ** B ** ** 실행을 차단하는 것입니다. – INS

+0

** B **는 각 하위 프로세스에서 신호를 수신 할 때까지 대기합니다. –

답변

1


어떤 제안을 주셔서 감사합니다,

당신을 위해이 작업을 수행하는 프로그램에 대해 얘기하는 경우 GNU Parallel 당신을 위해이 작업을 수행 할 것입니다. cron 작업 또는 필요한 것으로 생각하는 모든 작업을 실행하도록 설정할 수 있습니다. 우리는 대용량의 텍스트 (또는 코드)를 다시 작성하고 모든 작업을 수행하기 위해 컴퓨터의 코어를 완전히 활용하기 위해 스크립트에서 자주 실행합니다. 종종 스크립트와 sed/awk와 함께 Parallel을 사용하여 실제로 필요한 것을 얻을 수 있습니다. 그러나 프로그래밍 방식으로이 작업을 수행하려는 경우 완전히 명확하지는 않습니다. 따라서 아마도 이것이 최상의 대답은 아닙니다.

+0

실행 파일을 병렬로 실행하면 해결되는 문제입니다. 그러나 다른 문제는 동기화입니다. '의존적 인'모든 작업이 처리 단계를 완료했을 때를 알 수 있습니다. ---> 출력 파일이 존재하도록 보장됩니다 ----> 우리는 출력 파일에 따라 바이너리를 실행할 수 있습니다. – INS

+2

그건 make 도구가 실제로하는 것입니다. 이 도구는 소스 코드를 컴파일하는 데 사용할 수있는 것이 아니라 일반적인 도구입니다. 의존성을 수정하십시오. make -j10은 가능한 한 최대 10 개의 프로세스를 병렬로 실행하고 완료되면 종속 대상이 실행됩니다. 1 개의 프로세스가 여러 개의 다른 프로세스를 기다리는 것처럼 간단하다면, 간단한 쉘 스크립트는 다음을 수행합니다 : for i in $ (seq 10); ./A & 완료 대기; ./B' – nos

+0

@nos 예, make에 대해 알고 있지만 제 경우에는 모든 실행 파일이 즉시 완료됩니다 (백그라운드에서 실행 됨). 파일을 사용할 수있는시기를 알지 못합니다. 앞서 언급했듯이 : ** ** ** 실행 파일이 ** B **의 입력에 사용되는 파일을 생성하지 않기 때문에 모든 프로세스를 기다릴 수 없습니다 ... – INS

0

통상적 인 접근법은 동기화 프리미티브 (예 : 세마포 또는 장벽. 그러나 이것은 언어에 따라 다르지는 않지만 platfrom (일반적으로 OS)과의 상호 작용이 필요합니다.

그러나 C++ 11 표준은 라이브러리 수준에서 표준화 된 스레딩 모델을 배포합니다.

+0

스레딩에 관한 것이 아니라 기존 실행 파일을 실행 중입니다. 문제는 입력을 사용할 수있을 때까지 기다리는 중입니다. – INS

+0

그것이 정확히 무엇인지에 대한 것입니다. 쓰레드는 가벼운 프로세스이며 '실제'프로세스를 요구하지만 원리는 같습니다. 세마포어 같은 것을 사용하십시오. – Matthias

0

나는 자식 노드가 부모 노드의 출력에 의존하는 종속성 트리를 만드는 방법이라고 생각합니다. 그런 다음 병렬로 각 레벨의 트리를 실행할 수 있습니다. 예를 들어

:

P1의 출력을 P2로 진행 P3

P2의 출력 P3의 출력은 P4로 진행 P4

간다. 먼저 P1을 실행해야

     P1 
        /\ 
        P2 P3 
        \/
        P4 

, P2와 P3가 병렬로 실행할 수있는 다음 P4가 마지막으로 실행됩니다 :

는 그런 다음 나무처럼 보인다.

또한 그것은 오래된 언어가 난 트릭을 할 것입니다, C++ 될 필요가 없습니다 확인

편집 : 이전 작업이 다음 일을 시작 끝날 때 당신이 모르는 경우 당신은 모든 설정 시간 간격으로 실행하고자하는 모든 실행 파일을 거쳐 필요로하는 파일이 생성되었는지, 실행 중인지 확인한 후, 다음 반복까지 기다린 후 다시 확인하는 루프를 설정할 수 있습니다.

whenjobs뿐만 아니라 당신이 작업을 지정할 수 있습니다 크론 대체 : 당신은 아마 아무것도 작성하지 않아도

struct Job 
    { 
     bool PreconditionsSatisfied(); 
     void Run(); 
    }; 

    std::vector<Job> jobs; 

    //Fill up with appropriate info 

    while(jobs.size() != 0) 
     { 
     for(int i = 0; i < jobs.size(); i++) 
      { 
      if(jobs[i].PreconditionsSatisfied()) 
       { 
       //start new thread and run job 
       jobs.erase(jobs.begin() + i); 
       i--; 
       } 
      } 
     sleep(TIME_INTERVAL); 
     } 
+0

예, 정확히 제가하려고하는 것입니다. 불행히도 필자의 경우 P2 & P3는 병렬 적으로 (비동기 적으로) 실행되며 P4는 출력이 언제 발생하는지 알지 못한다. 빨리이기 때문에 비동기 적으로 실행 중입니다 ... – INS

1

: (C++에서)

일반적인 생각은 뭔가를 갈 수있다 (잠재적으로 반복)뿐만 아니라 작업 종속성도 고려해야합니다.

0

사람들은 일상적으로 make (또는 다른 빌드 도구)를 사용하여 이러한 작업을 수행합니다. 종속성이있는 입력을 기반으로 작업을 빌드하고, 대부분 - 확실하게 - 이것을 병렬로 수행 할 수 있습니다. 일련의 이미지를 데이터 파일에서 만드는 실행 파일이 있고 처리 할 두 개의 배치 (서로 추가하여 말하기)가 있고 각 배치마다 두 번째 실행 파일을 별도로 실행해야하는 경우, 다음

메이크
execA=./gnuplotwrapper 
execB=convert 

all: figure1.png figure2.png 

# convert txt files to png files using a gnuplot script "gnuplotwrapper" 

%.png: %.txt 
    $(execA) $^ [email protected] 

# take two figures and append them using imagemagick's "convert" 

figure1.png: data1.png data2.png 
    $(execB) $^ +append [email protected] 

figure2.png: data3.png data4.png 
    $(execB) $^ +append [email protected] 

clean: 
    rm -f *.png 

데이터 파일로부터 이미지 파일을 생성하기 위해 실행 A를 사용하고, 실행 B는 이미지 파일을 일괄 처리. 이것을 (말하자면) make -j 4으로 실행하면 make는 최종 결과를 생성하기 위해 최대 4 개의 프로세스를 병렬로 사용하려고 시도합니다 (여기, figure1.png 및 figure2.png).

0

시스템에서 다른 실행 파일을 실행해야하는 경우 가장 깨끗한 해결책은 scheduler을 사용하는 것입니다. Slurm 또는 TORQUE가 좋은 선택이어야합니다.

또한, 요청한 특정 기능은 여러 단계 작업 스케줄링으로 간주됩니다. 스케줄러가 기본적으로 지원하지 않으면 일련의 작업으로 동일한 결과를 얻는 것이 매우 쉽습니다. 성공하면 연속을 제출합니다.

관련 문제