Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mpi理解isend和irecv_Mpi - Fatal编程技术网

mpi理解isend和irecv

mpi理解isend和irecv,mpi,Mpi,我有两个进程(0和1),0得到一个随机数,如果不是MOD(number,2)==0,如果它比前面的进程大,那么它将(ISEND)发送到进程1 进程1接收数字(RECV)并必须计算它是否为素数。如果它是一个素数,那么进程1将它发送(ISEND)给进程0。进程0将其保存为最高质数(不是最终质数,他生成了大量必须检查的随机数) 因此,在进程1检查接收到的数字是否为素数的同时,进程0已经在另一个随机数上。 关键是,进程0可能会覆盖ISEND中的数据,因为进程1正在进行自己的工作,并且没有接收数据。我想要

我有两个进程(0和1),0得到一个随机数,如果不是MOD(number,2)==0,如果它比前面的进程大,那么它将(ISEND)发送到进程1

进程1接收数字(RECV)并必须计算它是否为素数。如果它是一个素数,那么进程1将它发送(ISEND)给进程0。进程0将其保存为最高质数(不是最终质数,他生成了大量必须检查的随机数)

因此,在进程1检查接收到的数字是否为素数的同时,进程0已经在另一个随机数上。 关键是,进程0可能会覆盖ISEND中的数据,因为进程1正在进行自己的工作,并且没有接收数据。我想要这个

PROGRAM mpi_NonBlocking
USE MPI
IMPLICIT NONE

INTEGER :: ierr, myid ,npe, istatus(MPI_STATUS_SIZE), num, num_copy, best_prime=1, resto, i, n, now(3), req11
integer,parameter :: seed = 86456, numbers=200 
INTEGER :: req1(numbers), req2(numbers)
LOGICAL :: flag, res


CALL MPI_INIT(ierr)

CALL MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,npe,ierr)

IF (npe/=2) THEN
    WRITE(*,*)'avviare il programma con 2 processi (-np 2 ./mpi_NonBlocking)'

ELSE

    IF (myid == 0) THEN

        OPEN(22,FILE='uomo_0.txt', STATUS="UNKNOWN", FORM= "FORMATTED")
        OPEN(24,FILE='uomo_00.txt', STATUS="UNKNOWN", FORM= "FORMATTED")
        CALL ITIME(now)
        WRITE(*,*)
        CALL SRAND(now(3))

        DO n=1, numbers

            req1(n)=0
            req2(n)=0
            num=IRAND()
            WRITE(24,*)'random number',num
            IF (num>best_prime) THEN
                resto=MOD(num,2)
                IF (resto==0 .and. num/=2) THEN
                    WRITE(24,*)'CYCLE'
                    CYCLE
                END IF
            END IF

            WRITE(22,*)'uomo 0 SEND',num,'non-blocking'
            WRITE(24,*)'uomo 0 SEND',num,'non-blocking'
            CALL MPI_ISEND(num,1,MPI_INTEGER,1,1,MPI_COMM_WORLD,req1(n),ierr)
            WRITE(24,*)num,req1(n)
            CALL MPI_IRECV(best_prime,1,MPI_INTEGER,1,0,MPI_COMM_WORLD,req2(n),ierr)

        END DO

        CLOSE(22)


        CALL MPI_SEND(-1,1,MPI_INTEGER,1,1,MPI_COMM_WORLD,ierr)
        PRINT *,'best_prime is',best_prime

        !DO i=1, numbers
            !WRITE(24,*)'TEST isend',i,'flag value',req2(i)
            !CALL MPI_TEST(req2(i),flag,istatus,ierr)
            !IF (flag .eqv. .false.) THEN
                !WRITE(24,*)'uomo 0 RECV',i,'non-blocking FAIL'
            !ELSE IF    (flag .eqv. .true.) THEN
                !WRITE(24,*)'uomo 0 RECV',i,'non-blocking SUCCESS'
            !END IF
        !END DO

        CLOSE(24)


    ELSE


        OPEN(23,FILE='uomo_1.txt', STATUS="UNKNOWN", FORM= "FORMATTED")
        OPEN(25,FILE='uomo_11.txt', STATUS="UNKNOWN", FORM= "FORMATTED")
        DO n=1, numbers

            CALL MPI_RECV(num,1,MPI_INTEGER,0,myid,MPI_COMM_WORLD,istatus,ierr)
            WRITE(23,*)'uomo 1 RECV',num
            WRITE(25,*)'uomo 1 RECV',num
            IF (num==-1) THEN
                WRITE(23,*)'ABORT'
                WRITE(25,*)'ABORT'
                CALL EXIT(0)
            END IF

            res=.true.
            num_copy=NINT(SQRT(REAL(num)))
            WRITE(25,*)'sqrt',num_copy,'di num',num
            DO i=3, num_copy, +2

                resto=MOD(num,i)
                IF (resto==0) THEN
                    res= .false.
                    WRITE(25,*)'num',num,'no numero primo'
                    EXIT     !not numero primo
                END IF
            END DO

            IF (res .eqv. .true.) THEN
                WRITE(25,*)'num',num,'PRIMO'
                WRITE(25,*)'uomo 1 SEND',num,'non-blocking' 
                CALL MPI_ISEND(num,1,MPI_INTEGER,0,0,MPI_COMM_WORLD,req11,ierr)
            END IF

        END DO
        CLOSE(23)
        CLOSE(25)

    END IF

END IF

CALL MPI_FINALIZE(ierr)
END PROGRAM
问题是,发生了越位,但进程1继续多次接收从进程0发送的最后一个号码:它继续准确地接收,直到他达到进程0的isend调用数为止

 105) uomo 0 SEND  1310474405 non-blocking
 106) uomo 0 SEND   551041203 non-blocking
 107) uomo 0 SEND  1400012957 non-blocking
 108) uomo 0 SEND   907501537 non-blocking
 109) uomo 0 SEND   949471365 non-blocking

 61) uomo 1 RECV   792320847
 62) uomo 1 RECV  2137864129
 63) uomo 1 RECV  1888232175
 64) uomo 1 RECV     4829859
 65) uomo 1 RECV  2082851615
 66) uomo 1 RECV   949471365
 67) uomo 1 RECV   949471365
 68-109) uomo 1 RECV   949471365
 110) uomo1 RECV   -1
 111) ABORT

“但进程0继续多次接收从进程0发送的最后一个数字”。那里好像有个打字错误。你能澄清一下吗?输入错误。过程1继续。。