0

나는 (내가 CentOS는 5.5 OS에 있어요), 하나 개의 마스터와 슬레이브가 PVM의 코드를 구축을 위해 노력하고노예 PVM (병렬 가상 머신)에서 작동하지 않는 이유는

내가 명령을 실행

Spawning 3 worker tasks ... SUCCESSFUL 
     I got 100.000000 from 1; (expecting 100.000000) 
     I got 200.000000 from 0; (expecting 200.000000) 
     I got 300.000000 from 2; (expecting 300.000000) 

을하지만 그것은이 오류를 제공하는 이유

pvm> [1:t80002] EOF 
[1:t80001] Spawning 6 worker tasks..... 
[1:t80001] Trouble spawning slaves. Aborting.Error codes are: 
[1:t80001] TID 3 -7 
[1:t80001] TID 4 -7 
[1:t80001] TID 5 -7 
[1:t80001] libpvm [t80005] : pvm_mcast() : Bad parameter 
[1:t80003] EOF 
[1:t80004] EOF 

을 보여줍니다 - : aimk master1 slave1, 출력 이하로 줄 것으로 예상된다? 왜 노예들이 효과가 없습니까? 내 코드가 아래 있습니다.이 문제에서 도와주세요.

Master1.c

static char rcsid[] = 
"$Id: master1.c,v 1.4 1997/07/09 13:25:09 pvmsrc Exp $"; 
#include <stdio.h> 
#include "pvm3.h" 
#define SLAVENAME "slave1" 

main() 
{ 
    int mytid;     /* my task id */ 
    int tids[32];    /* slave task ids */ 
    int n, nproc, numt, i, who, msgtype, nhost, narch; 
    float data[100], result[32]; 
    struct pvmhostinfo *hostp; 

    /* enroll in pvm */ 
    mytid = pvm_mytid(); 

    /* Set number of slaves to start */ 
    pvm_config(&nhost, &narch, &hostp); 
    nproc = nhost * 3; 
    if(nproc > 32) nproc = 32 ; 
    printf("Spawning %d worker tasks ... " , nproc); 

    /* start up slave tasks */ 
    numt=pvm_spawn(SLAVENAME, (char**)0, 0, "", nproc, tids); 
    if(numt < nproc){ 
     printf("\n Trouble spawning slaves. Aborting. Error codes are:\n"); 
     for(i=numt ; i<nproc ; i++) { 
      printf("TID %d %d\n",i,tids[i]); 
     } 
     for(i=0 ; i<numt ; i++){ 
      pvm_kill(tids[i]); 
     } 
     pvm_exit(); 
     exit(1); 
    } 
    printf("SUCCESSFUL\n"); 


    /* Begin User Program */ 
    n = 100; 
    /* initialize_data(data, n); */ 
    for(i=0 ; i<n ; i++){ 
     data[i] = 1.0; 
    } 

    /* Broadcast initial data to slave tasks */ 
    pvm_initsend(PvmDataDefault); 
    pvm_pkint(&nproc, 1, 1); 
    pvm_pkint(tids, nproc, 1); 
    pvm_pkint(&n, 1, 1); 
    pvm_pkfloat(data, n, 1); 
    pvm_mcast(tids, nproc, 0); 

    /* Wait for results from slaves */ 
    msgtype = 5; 
    for(i=0 ; i<nproc ; i++){ 
     pvm_recv(-1, msgtype); 
     pvm_upkint(&who, 1, 1); 
     pvm_upkfloat(&result[who], 1, 1); 
     printf("I got %f from %d; ",result[who],who); 
     if (who == 0) 
      printf("(expecting %f)\n", (nproc - 1) * 100.0); 
     else 
      printf("(expecting %f)\n", (2 * who - 1) * 100.0); 

    } 
    /* Program Finished exit PVM before stopping */ 
    pvm_exit(); 
} 

slave1.c 분명히

static char rcsid[] = 
"$Id: slave1.c,v 1.2 1997/07/09 13:25:18 pvmsrc Exp $"; 
#include <stdio.h> 
#include "pvm3.h" 

main() 
{ 
    int mytid;  /* my task id */ 
    int tids[32]; /* task ids */ 
    int n, me, i, nproc, master, msgtype; 
    float data[100], result; 
    float work(); 

    /* enroll in pvm */ 
    mytid = pvm_mytid(); 

    /* Receive data from master */ 
    msgtype = 0; 
    pvm_recv(-1, msgtype); 
    pvm_upkint(&nproc, 1, 1); 
    pvm_upkint(tids, nproc, 1); 
    pvm_upkint(&n, 1, 1); 
    pvm_upkfloat(data, n, 1); 

    /* Determine which slave I am (0 -- nproc-1) */ 
    for(i=0; i<nproc ; i++) 
     if(mytid == tids[i]){ me = i; break; } 

    /* Do calculations with data */ 
    result = work(me, n, data, tids, nproc); 

    /* Send result to master */ 
    pvm_initsend(PvmDataDefault); 
    pvm_pkint(&me, 1, 1); 
    pvm_pkfloat(&result, 1, 1); 
    msgtype = 5; 
    master = pvm_parent(); 
    pvm_send(master, msgtype); 

    /* Program finished. Exit PVM before stopping */ 
    pvm_exit(); 
} 

float 
work(me, n, data, tids, nproc) 
    /* Simple example: slaves exchange data with left neighbor (wrapping) */ 
    int me, n, *tids, nproc; 
    float *data; 
{ 
    int i, dest; 
    float psum = 0.0; 
    float sum = 0.0; 
    for(i=0 ; i<n ; i++){ 
     sum += me * data[i]; 
    } 
    /* illustrate node-to-node communication */ 
    pvm_initsend(PvmDataDefault); 
    pvm_pkfloat(&sum, 1, 1); 
    dest = me+1; 
    if(dest == nproc) dest = 0; 
    pvm_send(tids[dest], 22); 
    pvm_recv(-1, 22); 
    pvm_upkfloat(&psum, 1, 1); 

    return(sum+psum); 
} 

답변

0

PVM은 당신의 노예 '실행 파일을 찾을 수 없습니다. 출력의이 부분을 검사 :

[1:t80001] TID 3 -7 
[1:t80001] TID 4 -7 
[1:t80001] TID 5 -7 

모든 작업 ID는 PvmNoFile입니다 -7을합니다. SLAVENAME (귀하의 경우 slave1)이 절대 파일 경로 (귀하의 경우는 아님)이거나 PVM 검색 경로에있는 실행 파일의 이름인지 확인하십시오. 기본적으로 PVM 검색 경로는 다음과 같습니다 $HOME은 사용자의 홈 디렉토리 경로와 $PVM_ARCH입니다

$HOME/pvm3/bin/$PVM_ARCH/ 

는 PVM 아키텍처의 이름입니다.

+0

오케이, 나는 당신의 지시를 따르고 그 후에 나는 당신에게 대답 할 것입니다. – devsda

+0

x86을 실행하는 리눅스에서 아키텍처 이름은 대부분 'LINUX'입니다. –

+0

제 시스템에서 LINUX64입니다. – devsda