2016-08-09 5 views
0

먼저 큰 데이터 파일을 읽고 계산을 수행하는 루트 프로세스를 지정한 프로젝트를 작성하고 두 번째로 계산 된 결과를 다른 모든 프로세스에 브로드 캐스트합니다 프로세스. 여기에 내 코드가있다 : (1) nsample=30000 (2)와 함께 txt 파일에서 임의의 숫자를 읽는다. (2) 다른 프로세스에 브로드 캐스팅 한 몇 가지 규칙에 의해 dens_ent 행렬을 생성한다. Btw, gfortran과 함께 OpenMPI를 사용하고 있습니다.MPI 루트 프로세스의 데이터 누락 처리 후 누락 된 인쇄물

IF (myid==0) THEN 
    OPEN(UNIT=8,FILE='rnseed_ent20.txt') 
    DO i=1,n_sample 
    DO j=1,3 
     READ(8,*) rn(i,j) 
    END DO 
    END DO 
    CLOSE(8) 
END IF 

dens_ent=0.0d0 
DO i=1,n_sample 
IF (myid==0) THEN 
    !Random draws of productivity and savings 
    rn_zb=MC_JOINT_SAMPLE((/-0.1d0,mu_b0/),var,rn(i,1:2)) 
    iz=minloc(abs(log(zgrid)-rn_zb(1)),dim=1) 
    ib=minloc(abs(log(bgrid(1:nb/2))-rn_zb(2)),dim=1) !Find the closest saving grid 
    CALL SUB2IND(j,(/nb,nm,nk,nxi,nz/),(/ib,1,1,1,iz/)) 
    DO iixi=1,nxi 
    DO iiz=1,nz 
     CALL SUB2IND(jj,(/nb,nm,nk,nxi,nz/),(/policybmk_2_statebmk_index(j,:),iixi,iiz/)) 
     dens_ent(jj)=dens_ent(jj)+1.0d0/real(nxi)*markovian(iz,iiz)*merge(1.0d0,0.0d0,vent(j) .GE. -bgrid(ib)+ce) 
     !Density only recorded if the value of entry is greater than b0+ce 
    END DO 
    END DO 
END IF 
END DO 

PRINT *, 'dingdongdingdong',myid 


IF (myid==0) dens_ent=dens_ent/real(n_sample)*Mpo 
IF (myid==0) PRINT *, 'sum_density by joint normal distribution',sum(dens_ent) 

PRINT *, 'BLBLALALALALALA',myid 

CALL MPI_BCAST(dens_ent,N,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,ierr) 

문제가 발생 없음 인쇄 밖에 없으므로 1 IF (myid==0) PRINT *, 'sum_density by joint normal distribution',sum(dens_ent)가 실행되지 보인다. (2) 그런 다음 PRINT *, 'BLBLALALALALALA',myid 등의 메시지를 추가하여 확인하십시오. 다시 루트 프로세스 myid=0에 대한 인쇄가 없습니다. 루트 프로세스가 작동하지 않는 것 같습니다. 이것이 사실 일 수 있습니까? 나는 꽤 혼란 스럽다. PRINT *, 'dingdongdingdong',myid 전에 MPI_BARRIER을 사용하지 않았기 때문입니까?

+1

귀하는이 사이트의 규칙을 지키려합니다. 다음과 같은 특정 규칙이 있습니다. "내 코드는 제발 디버깅 해주세요." 당신은 또한'myid'가 어떻게 계산되는지를 보여주지 않습니다. 즉, 파일 -i/o (일반적으로'STD_OUT'은 6 번 단위가되어야하지만 결코 알지 못함)에 대해 10 이상의 단위를 사용하고 각 ierr 상태 값을 모두 확인하십시오. MPI 호출. – chw21

+0

플러스, 당신은 당신이 얻는 결과에 대해서는 앞으로 곧 나오지 않을 것입니다. 비 루트 프로세스가 "BLABLABLA"를 인쇄합니까? 루트 프로세스가 "dingdong"을 인쇄합니까? 얼마나 많은 프로세스를 실행하고 있습니까? – chw21

+0

이전 주석에 덧붙여,'MPI_BARRIER'보다는'MPI_BCAST'를 의미합니까? – Harald

답변

1

코드 시작 부분에 다음 문장이 누락되었을 가능성이 있습니까? myid

CALL MPI_COMM_RANK (MPI_COMM_WORLD, myid, ierr) 
IF (ierr /= MPI_SUCCESS) THEN 
    STOP "MPI_COMM_RANK failed!" 
END IF 

MPI_COMM_RANK 복귀 IF (성공) (MPI의 갯수가 NP 순위는 0과 NP 내의 값 즉,)에 MPI_COMM_WORLD 통신부 내의 프로세스의 식별자.

0

@ cw21 @Harald 및 @Hristo Iliev 님의 기고에 감사드립니다. 오류는 unit 번호 매기기에 있습니다. 하나 개의 기준은 말한다 :

unit number : This must be present and takes any integer type. Note this ‘number’ identifies the 
file and must be unique so if you have more than one file open then you must specify a different 
unit number for each file. Avoid using 0,5 or 6 as these UNITs are typically picked to be used by 
Fortran as follows. 
– Standard Error = 0 : Used to print error messages to the screen. 
– Standard In = 5 : Used to read in data from the keyboard. 
– Standard Out = 6 : Used to print general output to the screen. 

그래서 내가 작동하지 않는, 1i에 모든 번호 i을 변경; 그 다음 10i으로 변경되었습니다. 그것은 작동하기 시작합니다. 신비스럽게도 @Hristo Iliev가 올바르게 지적한 것처럼 번호가 0,5,6이 아닌 한 코드는 올바르게 작동해야합니다. 나는 왜 1i가 작동하지 않는지 자신에게 설명 할 수 없다. 그러나 여하튼, 루트 프로세스는 이제 결과를 인쇄하고 있습니다.