Changeset 186 for codes/icosagcm/trunk/src/transfert_mpi.f90
- Timestamp:
- 01/09/14 09:56:11 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/transfert_mpi.f90
r176 r186 8 8 INTEGER :: domain 9 9 INTEGER :: rank 10 INTEGER :: tag 10 11 INTEGER :: size 12 INTEGER :: offset 13 INTEGER :: ireq 11 14 INTEGER,POINTER :: buffer(:) 12 REAL,POINTER :: buffer_r2(:) 13 REAL,POINTER :: buffer_r3(:,:) 14 REAL,POINTER :: buffer_r4(:,:,:) 15 REAL,POINTER :: buffer_r(:) 15 16 INTEGER,POINTER :: src_value(:) 16 17 END TYPE array 17 18 18 19 TYPE t_buffer 19 REAL,POINTER :: r 2(:)20 REAL,POINTER :: r3(:,:)21 REAL,POINTER :: r4(:,:,:)20 REAL,POINTER :: r(:) 21 INTEGER :: size 22 INTEGER :: rank 22 23 END TYPE t_buffer 23 24 … … 39 40 INTEGER :: nsend 40 41 INTEGER :: nreq_mpi 42 INTEGER :: nreq_send 43 INTEGER :: nreq_recv 41 44 TYPE(ARRAY),POINTER :: send(:) 42 45 END TYPE t_request 43 46 44 TYPE(t_request),POINTER :: req_i1(:) 45 TYPE(t_request),POINTER :: req_e1_scal(:) 46 TYPE(t_request),POINTER :: req_e1_vect(:) 47 48 TYPE(t_request),POINTER :: req_i0(:) 49 TYPE(t_request),POINTER :: req_e0_scal(:) 50 TYPE(t_request),POINTER :: req_e0_vect(:) 47 TYPE(t_request),SAVE,POINTER :: req_i1(:) 48 TYPE(t_request),SAVE,POINTER :: req_e1_scal(:) 49 TYPE(t_request),SAVE,POINTER :: req_e1_vect(:) 50 51 TYPE(t_request),SAVE,POINTER :: req_i0(:) 52 TYPE(t_request),SAVE,POINTER :: req_e0_scal(:) 53 TYPE(t_request),SAVE,POINTER :: req_e0_vect(:) 54 55 TYPE t_reorder 56 INTEGER :: ind 57 INTEGER :: rank 58 INTEGER :: tag 59 INTEGER :: isend 60 END TYPE t_reorder 51 61 52 62 TYPE t_message 53 63 TYPE(t_request), POINTER :: request(:) 54 64 INTEGER :: nreq 65 INTEGER :: nreq_send 66 INTEGER :: nreq_recv 67 TYPE(t_reorder), POINTER :: reorder(:) 55 68 INTEGER, POINTER :: mpi_req(:) 56 69 INTEGER, POINTER :: status(:,:) … … 62 75 END TYPE t_message 63 76 64 INTEGER,SAVE :: message_number=0 ;65 66 77 CONTAINS 67 78 79 68 80 SUBROUTINE init_transfert 69 81 USE domain_mod … … 72 84 USE metric 73 85 USE mpipara 86 USE mpi_mod 74 87 IMPLICIT NONE 75 88 INTEGER :: ind,i,j 89 LOGICAL ::ok 76 90 77 91 CALL create_request(field_t,req_i1) … … 410 424 INTEGER :: nb_domain_recv(0:mpi_size-1) 411 425 INTEGER :: nb_domain_send(0:mpi_size-1) 426 INTEGER :: tag_rank(0:mpi_size-1) 412 427 INTEGER :: nb_data_domain_recv(ndomain_glo) 413 428 INTEGER :: list_domain_recv(ndomain_glo) … … 415 430 INTEGER :: list_domain(ndomain) 416 431 417 INTEGER :: rank,i,j 432 INTEGER :: rank,i,j,pos 418 433 INTEGER :: size_,ind_glo,ind_loc, ind_src 419 INTEGER :: isend, irecv, ireq, nreq 434 INTEGER :: isend, irecv, ireq, nreq, nsend, nrecv 420 435 INTEGER, ALLOCATABLE :: mpi_req(:) 421 436 INTEGER, ALLOCATABLE :: status(:,:) 422 437 INTEGER, ALLOCATABLE :: rank_list(:) 438 INTEGER, ALLOCATABLE :: offset(:) 439 LOGICAL,PARAMETER :: debug = .FALSE. 440 441 423 442 IF (.NOT. using_mpi) RETURN 424 443 … … 428 447 nb_data_domain_recv(:) = 0 429 448 nb_domain_recv(:) = 0 449 tag_rank(:)=0 430 450 431 451 DO i=1,req%size … … 486 506 ALLOCATE(status(MPI_STATUS_SIZE,nreq)) 487 507 508 488 509 ireq=0 489 510 DO ind_loc=1,ndomain … … 492 513 ireq=ireq+1 493 514 CALL MPI_ISEND(req%recv(irecv)%domain,1,MPI_INTEGER,req%recv(irecv)%rank,0,comm_icosa, mpi_req(ireq),ierr) 515 IF (debug) PRINT *,"Isend ",req%recv(irecv)%domain, "from ", mpi_rank, "to ",req%recv(irecv)%rank, "tag ",0 494 516 ENDDO 495 517 ENDDO 496 518 519 IF (debug) PRINT *,"------------" 497 520 j=0 498 521 DO rank=0,mpi_size-1 … … 501 524 ireq=ireq+1 502 525 CALL MPI_IRECV(list_domain_send(j),1,MPI_INTEGER,rank,0,comm_icosa, mpi_req(ireq),ierr) 526 IF (debug) PRINT *,"IRecv ",list_domain_send(j), "from ", rank, "to ",mpi_rank, "tag ",0 503 527 ENDDO 504 528 ENDDO 529 IF (debug) PRINT *,"------------" 505 530 506 531 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) … … 517 542 ALLOCATE(req%send(req%nsend)) 518 543 ENDDO 544 545 IF (debug) PRINT *,"------------" 519 546 520 547 ireq=0 … … 525 552 ireq=ireq+1 526 553 CALL MPI_ISEND(mpi_rank,1,MPI_INTEGER,req%recv(irecv)%rank,req%recv(irecv)%domain,comm_icosa, mpi_req(ireq),ierr) 554 IF (debug) PRINT *,"Isend ",mpi_rank, "from ", mpi_rank, "to ",req%recv(irecv)%rank,"tag ",req%recv(irecv)%domain 527 555 ENDDO 556 IF (debug) PRINT *,"------------" 528 557 529 558 DO isend=1,req%nsend 530 559 ireq=ireq+1 531 560 CALL MPI_IRECV(req%send(isend)%rank,1,MPI_INTEGER,MPI_ANY_SOURCE,ind_loc,comm_icosa, mpi_req(ireq),ierr) 561 IF (debug) PRINT *,"IRecv ",req%send(isend)%rank, "from ", "xxx", "to ",mpi_rank, "tag ",ind_loc 532 562 ENDDO 533 563 ENDDO 534 564 565 IF (debug) PRINT *,"------------" 566 535 567 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 536 568 CALL MPI_BARRIER(comm_icosa,ierr) 569 570 IF (debug) PRINT *,"------------" 537 571 538 572 ireq=0 … … 543 577 ireq=ireq+1 544 578 CALL MPI_ISEND(ind_loc,1,MPI_INTEGER,req%recv(irecv)%rank,req%recv(irecv)%domain,comm_icosa, mpi_req(ireq),ierr) 579 IF (debug) PRINT *,"Isend ",ind_loc, "from ", mpi_rank, "to ",req%recv(irecv)%rank,"tag ",req%recv(irecv)%domain 545 580 ENDDO 581 582 IF (debug) PRINT *,"------------" 546 583 547 584 DO isend=1,req%nsend 548 585 ireq=ireq+1 549 586 CALL MPI_IRECV(req%send(isend)%domain,1,MPI_INTEGER,req%send(isend)%rank,ind_loc,comm_icosa, mpi_req(ireq),ierr) 587 IF (debug) PRINT *,"IRecv ",req%send(isend)%domain, "from ", req%send(isend)%rank, "to ",mpi_rank, "tag ",ind_loc 550 588 ENDDO 551 589 ENDDO 590 IF (debug) PRINT *,"------------" 552 591 553 592 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 554 593 CALL MPI_BARRIER(comm_icosa,ierr) 594 IF (debug) PRINT *,"------------" 595 596 ireq=0 597 DO ind_loc=1,ndomain 598 req=>request(ind_loc) 599 600 DO irecv=1,req%nrecv 601 ireq=ireq+1 602 req%recv(irecv)%tag=tag_rank(req%recv(irecv)%rank) 603 tag_rank(req%recv(irecv)%rank)=tag_rank(req%recv(irecv)%rank)+1 604 CALL MPI_ISEND(req%recv(irecv)%tag,1,MPI_INTEGER,req%recv(irecv)%rank,req%recv(irecv)%domain,comm_icosa, mpi_req(ireq),ierr) 605 IF (debug) PRINT *,"Isend ",req%recv(irecv)%tag, "from ", mpi_rank, "to ",req%recv(irecv)%rank,"tag ",req%recv(irecv)%domain 606 ENDDO 607 IF (debug) PRINT *,"------------" 608 609 DO isend=1,req%nsend 610 ireq=ireq+1 611 CALL MPI_IRECV(req%send(isend)%tag,1,MPI_INTEGER,req%send(isend)%rank,ind_loc,comm_icosa, mpi_req(ireq),ierr) 612 IF (debug) PRINT *,"IRecv ",req%send(isend)%tag, "from ", req%send(isend)%rank, "to ",mpi_rank, "tag ",ind_loc 613 ENDDO 614 ENDDO 615 IF (debug) PRINT *,"------------" 616 617 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 618 CALL MPI_BARRIER(comm_icosa,ierr) 619 620 621 IF (debug) PRINT *,"------------" 555 622 556 623 ireq=0 … … 560 627 DO irecv=1,req%nrecv 561 628 ireq=ireq+1 562 CALL MPI_ISEND(req%recv(irecv)%size,1,MPI_INTEGER,req%recv(irecv)%rank,req%recv(irecv)%domain,comm_icosa, mpi_req(ireq),ierr) 629 CALL MPI_ISEND(req%recv(irecv)%size,1,MPI_INTEGER,req%recv(irecv)%rank,req%recv(irecv)%tag,comm_icosa, mpi_req(ireq),ierr) 630 IF (debug) PRINT *,"Isend ",req%recv(irecv)%size, "from ", mpi_rank, "to ",req%recv(irecv)%rank,"tag ",req%recv(irecv)%domain 563 631 ENDDO 632 IF (debug) PRINT *,"------------" 564 633 565 634 DO isend=1,req%nsend 566 635 ireq=ireq+1 567 CALL MPI_IRECV(req%send(isend)%size,1,MPI_INTEGER,req%send(isend)%rank,ind_loc,comm_icosa, mpi_req(ireq),ierr) 636 CALL MPI_IRECV(req%send(isend)%size,1,MPI_INTEGER,req%send(isend)%rank,req%send(isend)%tag,comm_icosa, mpi_req(ireq),ierr) 637 IF (debug) PRINT *,"IRecv ",req%send(isend)%size, "from ", req%send(isend)%rank, "to ",mpi_rank, "tag ",ind_loc 568 638 ENDDO 569 639 ENDDO … … 578 648 ireq=ireq+1 579 649 CALL MPI_ISEND(req%recv(irecv)%value,req%recv(irecv)%size,MPI_INTEGER,& 580 req%recv(irecv)%rank,req%recv(irecv)% domain,comm_icosa, mpi_req(ireq),ierr)650 req%recv(irecv)%rank,req%recv(irecv)%tag,comm_icosa, mpi_req(ireq),ierr) 581 651 ENDDO 582 652 … … 585 655 ALLOCATE(req%send(isend)%value(req%send(isend)%size)) 586 656 CALL MPI_IRECV(req%send(isend)%value,req%send(isend)%size,MPI_INTEGER,& 587 req%send(isend)%rank, ind_loc,comm_icosa, mpi_req(ireq),ierr)657 req%send(isend)%rank,req%send(isend)%tag,comm_icosa, mpi_req(ireq),ierr) 588 658 ENDDO 589 659 ENDDO … … 600 670 ENDDO 601 671 ENDDO 602 603 ! domain is on the same mpi process 672 673 674 ! domain is on the same mpi process => copie memory to memory 604 675 605 676 DO ind_loc=1,ndomain … … 611 682 req_src=>request(req%recv(irecv)%domain) 612 683 DO isend=1,req_src%nsend 613 IF (req_src%send(isend)%rank==mpi_rank .AND. req_src%send(isend)% domain==ind_loc) THEN684 IF (req_src%send(isend)%rank==mpi_rank .AND. req_src%send(isend)%tag==req%recv(irecv)%tag) THEN 614 685 req%recv(irecv)%src_value => req_src%send(isend)%value 615 686 IF ( size(req%recv(irecv)%value) /= size(req_src%send(isend)%value)) THEN 687 PRINT *,ind_loc, irecv, isend, size(req%recv(irecv)%value), size(req_src%send(isend)%value) 616 688 STOP "size(req%recv(irecv)%value) /= size(req_src%send(isend)%value" 617 689 ENDIF … … 624 696 625 697 ! true number of mpi request 698 699 request(:)%nreq_mpi=0 700 request(:)%nreq_send=0 701 request(:)%nreq_recv=0 702 ALLOCATE(rank_list(sum(request(:)%nsend))) 703 ALLOCATE(offset(sum(request(:)%nsend))) 704 offset(:)=0 705 706 nsend=0 626 707 DO ind_loc=1,ndomain 627 708 req=>request(ind_loc) 628 req%nreq_mpi=0629 709 630 710 DO isend=1,req%nsend 631 IF (req%send(isend)%rank/=mpi_rank .OR. .TRUE.) req%nreq_mpi=req%nreq_mpi+1 711 IF (req%send(isend)%rank/=mpi_rank) THEN 712 pos=0 713 DO i=1,nsend 714 IF (req%send(isend)%rank==rank_list(i)) EXIT 715 pos=pos+1 716 ENDDO 717 718 IF (pos==nsend) THEN 719 nsend=nsend+1 720 req%nreq_mpi=req%nreq_mpi+1 721 req%nreq_send=req%nreq_send+1 722 IF (mpi_threading_mode==MPI_THREAD_FUNNELED) THEN 723 rank_list(nsend)=req%send(isend)%rank 724 ELSE 725 rank_list(nsend)=-1 726 ENDIF 727 ENDIF 728 729 pos=pos+1 730 req%send(isend)%ireq=pos 731 req%send(isend)%offset=offset(pos) 732 offset(pos)=offset(pos)+req%send(isend)%size 733 ENDIF 632 734 ENDDO 633 735 ENDDO 736 737 DEALLOCATE(rank_list) 738 DEALLOCATE(offset) 739 740 ALLOCATE(rank_list(sum(request(:)%nrecv))) 741 ALLOCATE(offset(sum(request(:)%nrecv))) 742 offset(:)=0 743 744 nrecv=0 745 DO ind_loc=1,ndomain 746 req=>request(ind_loc) 747 634 748 DO irecv=1,req%nrecv 635 IF (req%recv(irecv)%rank/=mpi_rank .OR. .TRUE.) req%nreq_mpi=req%nreq_mpi+1 749 IF (req%recv(irecv)%rank/=mpi_rank) THEN 750 pos=0 751 DO i=1,nrecv 752 IF (req%recv(irecv)%rank==rank_list(i)) EXIT 753 pos=pos+1 754 ENDDO 755 756 IF (pos==nrecv) THEN 757 nrecv=nrecv+1 758 req%nreq_mpi=req%nreq_mpi+1 759 req%nreq_recv=req%nreq_recv+1 760 IF (mpi_threading_mode==MPI_THREAD_FUNNELED) THEN 761 rank_list(nrecv)=req%recv(irecv)%rank 762 ELSE 763 rank_list(nrecv)=-1 764 ENDIF 765 ENDIF 766 767 pos=pos+1 768 req%recv(irecv)%ireq=nsend+pos 769 req%recv(irecv)%offset=offset(pos) 770 offset(pos)=offset(pos)+req%recv(irecv)%size 771 ENDIF 636 772 ENDDO 637 638 773 ENDDO 774 775 ! get the offsets 776 777 ireq=0 778 DO ind_loc=1,ndomain 779 req=>request(ind_loc) 780 781 DO irecv=1,req%nrecv 782 ireq=ireq+1 783 CALL MPI_ISEND(req%recv(irecv)%offset,1,MPI_INTEGER,& 784 req%recv(irecv)%rank,req%recv(irecv)%tag,comm_icosa, mpi_req(ireq),ierr) 785 ENDDO 786 787 DO isend=1,req%nsend 788 ireq=ireq+1 789 CALL MPI_IRECV(req%send(isend)%offset,1,MPI_INTEGER,& 790 req%send(isend)%rank,req%send(isend)%tag,comm_icosa, mpi_req(ireq),ierr) 791 ENDDO 792 ENDDO 793 794 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 795 639 796 640 797 END SUBROUTINE Finalize_request … … 701 858 END SUBROUTINE transfert_message_seq 702 859 860 861 703 862 704 863 SUBROUTINE init_message_mpi(field,request, message) … … 717 876 TYPE(t_request),POINTER :: req 718 877 INTEGER :: irecv,isend 719 INTEGER :: ireq,nreq 878 INTEGER :: ireq,nreq, nreq_send 720 879 INTEGER :: ind 721 880 INTEGER :: dim3,dim4 722 881 INTEGER :: i,j 882 INTEGER :: message_number 883 ! TYPE(t_reorder),POINTER :: reorder(:) 884 ! TYPE(t_reorder) :: reorder_swap 885 886 !$OMP BARRIER 723 887 !$OMP MASTER 724 888 message%number=message_number 725 889 message_number=message_number+1 726 890 IF (message_number==100) message_number=0 727 891 892 728 893 message%request=>request 729 nreq=sum(request(:)%nsend)+sum(request(:)%nrecv)730 ! message%nreq=nreq731 894 message%nreq=sum(message%request(:)%nreq_mpi) 895 message%nreq_send=sum(message%request(:)%nreq_send) 896 message%nreq_recv=sum(message%request(:)%nreq_recv) 897 nreq=message%nreq 898 732 899 ALLOCATE(message%mpi_req(nreq)) 733 900 ALLOCATE(message%buffers(nreq)) 734 901 ALLOCATE(message%status(MPI_STATUS_SIZE,nreq)) 735 902 message%buffers(:)%size=0 736 903 message%pending=.FALSE. 737 904 message%completed=.FALSE. 738 905 906 DO ind=1,ndomain 907 req=>request(ind) 908 DO isend=1,req%nsend 909 IF (req%send(isend)%rank/=mpi_rank) THEN 910 ireq=req%send(isend)%ireq 911 message%buffers(ireq)%size=message%buffers(ireq)%size+req%send(isend)%size 912 message%buffers(ireq)%rank=req%send(isend)%rank 913 ENDIF 914 ENDDO 915 DO irecv=1,req%nrecv 916 IF (req%recv(irecv)%rank/=mpi_rank) THEN 917 ireq=req%recv(irecv)%ireq 918 message%buffers(ireq)%size=message%buffers(ireq)%size+req%recv(irecv)%size 919 message%buffers(ireq)%rank=req%recv(irecv)%rank 920 ENDIF 921 ENDDO 922 ENDDO 923 924 739 925 IF (field(1)%data_type==type_real) THEN 740 926 741 927 IF (field(1)%ndim==2) THEN 742 743 ireq=0 744 DO ind=1,ndomain 745 req=>request(ind) 746 747 DO isend=1,req%nsend 748 ireq=ireq+1 749 send=>req%send(isend) 750 CALL allocate_mpi_buffer(message%buffers(ireq)%r2,send%size) 751 ENDDO 752 753 DO irecv=1,req%nrecv 754 ireq=ireq+1 755 recv=>req%recv(irecv) 756 CALL allocate_mpi_buffer(message%buffers(ireq)%r2,recv%size) 757 ENDDO 758 759 ENDDO 760 928 929 DO ireq=1,message%nreq 930 CALL allocate_mpi_buffer(message%buffers(ireq)%r,message%buffers(ireq)%size) 931 ENDDO 761 932 762 933 ELSE IF (field(1)%ndim==3) THEN 763 764 ireq=0 765 DO ind=1,ndomain 766 dim3=size(field(ind)%rval3d,2) 767 req=>request(ind) 768 769 DO isend=1,req%nsend 770 ireq=ireq+1 771 send=>req%send(isend) 772 CALL allocate_mpi_buffer(message%buffers(ireq)%r3,send%size,dim3) 773 ENDDO 774 775 DO irecv=1,req%nrecv 776 ireq=ireq+1 777 recv=>req%recv(irecv) 778 CALL allocate_mpi_buffer(message%buffers(ireq)%r3,recv%size,dim3) 779 780 ENDDO 781 782 ENDDO 783 784 934 935 dim3=size(field(1)%rval3d,2) 936 DO ireq=1,message%nreq 937 message%buffers(ireq)%size=message%buffers(ireq)%size*dim3 938 CALL allocate_mpi_buffer(message%buffers(ireq)%r,message%buffers(ireq)%size) 939 ENDDO 940 785 941 ELSE IF (field(1)%ndim==4) THEN 786 787 ireq=0 788 DO ind=1,ndomain 789 dim3=size(field(ind)%rval4d,2) 790 dim4=size(field(ind)%rval4d,3) 791 req=>request(ind) 792 793 DO isend=1,req%nsend 794 ireq=ireq+1 795 send=>req%send(isend) 796 CALL allocate_mpi_buffer(message%buffers(ireq)%r4,send%size,dim3,dim4) 797 ENDDO 798 799 DO irecv=1,req%nrecv 800 ireq=ireq+1 801 recv=>req%recv(irecv) 802 CALL allocate_mpi_buffer(message%buffers(ireq)%r4,recv%size,dim3,dim4) 803 ENDDO 804 805 ENDDO 806 942 dim3=size(field(1)%rval4d,2) 943 dim4=size(field(1)%rval4d,3) 944 DO ireq=1,message%nreq 945 message%buffers(ireq)%size=message%buffers(ireq)%size*dim3*dim4 946 CALL allocate_mpi_buffer(message%buffers(ireq)%r,message%buffers(ireq)%size) 947 ENDDO 807 948 ENDIF 808 949 ENDIF 950 951 952 953 ! ! Reorder the request, so recv request are done in the same order than send request 954 955 ! nreq_send=sum(request(:)%nsend) 956 ! message%nreq_send=nreq_send 957 ! ALLOCATE(message%reorder(nreq_send)) 958 ! reorder=>message%reorder 959 ! ireq=0 960 ! DO ind=1,ndomain 961 ! req=>request(ind) 962 ! DO isend=1,req%nsend 963 ! ireq=ireq+1 964 ! reorder(ireq)%ind=ind 965 ! reorder(ireq)%isend=isend 966 ! reorder(ireq)%tag=req%send(isend)%tag 967 ! ENDDO 968 ! ENDDO 969 970 ! ! do a very very bad sort 971 ! DO i=1,nreq_send-1 972 ! DO j=i+1,nreq_send 973 ! IF (reorder(i)%tag > reorder(j)%tag) THEN 974 ! reorder_swap=reorder(i) 975 ! reorder(i)=reorder(j) 976 ! reorder(j)=reorder_swap 977 ! ENDIF 978 ! ENDDO 979 ! ENDDO 980 ! PRINT *,"reorder ",reorder(:)%tag 981 982 809 983 !$OMP END MASTER 810 984 !$OMP BARRIER 985 811 986 END SUBROUTINE init_message_mpi 987 988 SUBROUTINE Finalize_message_mpi(field,message) 989 USE field_mod 990 USE domain_mod 991 USE mpi_mod 992 USE mpipara 993 USE mpi_mod 994 IMPLICIT NONE 995 TYPE(t_field),POINTER :: field(:) 996 TYPE(t_message) :: message 997 998 TYPE(t_request),POINTER :: req 999 INTEGER :: irecv,isend 1000 INTEGER :: ireq,nreq 1001 INTEGER :: ind 1002 1003 !$OMP BARRIER 1004 !$OMP MASTER 1005 1006 1007 IF (field(1)%data_type==type_real) THEN 1008 1009 IF (field(1)%ndim==2) THEN 1010 1011 DO ireq=1,message%nreq 1012 CALL free_mpi_buffer(message%buffers(ireq)%r) 1013 ENDDO 1014 1015 ELSE IF (field(1)%ndim==3) THEN 1016 1017 DO ireq=1,message%nreq 1018 CALL free_mpi_buffer(message%buffers(ireq)%r) 1019 ENDDO 1020 1021 ELSE IF (field(1)%ndim==4) THEN 1022 1023 DO ireq=1,message%nreq 1024 CALL free_mpi_buffer(message%buffers(ireq)%r) 1025 ENDDO 1026 1027 ENDIF 1028 ENDIF 1029 1030 1031 1032 !$OMP END MASTER 1033 !$OMP BARRIER 1034 1035 1036 END SUBROUTINE Finalize_message_mpi 1037 1038 812 1039 813 1040 SUBROUTINE barrier … … 845 1072 REAL(rstd),POINTER :: rval3d(:,:), src_rval3d(:,:) 846 1073 REAL(rstd),POINTER :: rval4d(:,:,:), src_rval4d(:,:,:) 847 REAL(rstd),POINTER :: buffer_r2(:) 848 REAL(rstd),POINTER :: buffer_r3(:,:) 849 REAL(rstd),POINTER :: buffer_r4(:,:,:) 850 INTEGER,POINTER :: value(:) 851 INTEGER,POINTER :: sgn(:) 852 TYPE(ARRAY),POINTER :: recv,send 853 TYPE(t_request),POINTER :: req 854 INTEGER, ALLOCATABLE :: mpi_req(:) 855 INTEGER, ALLOCATABLE :: status(:,:) 856 INTEGER :: irecv,isend 857 INTEGER :: ireq,ireq_mpi,nreq 858 INTEGER :: ind,n,l,m 859 INTEGER :: dim3,dim4 860 INTEGER,POINTER :: src_value(:) 861 INTEGER,POINTER :: sign(:) 862 863 !$OMP BARRIER 864 865 CALL trace_start("transfert_mpi") 866 867 ! nreq=message%nreq 868 message%field=>field 869 870 !$OMP MASTER 871 IF (message%nreq>0) THEN 872 message%completed=.FALSE. 873 message%pending=.TRUE. 874 ELSE 875 message%completed=.TRUE. 876 message%pending=.FALSE. 877 ENDIF 878 879 !$OMP END MASTER 880 881 IF (field(1)%data_type==type_real) THEN 882 IF (field(1)%ndim==2) THEN 883 884 ireq=0 885 ireq_mpi=0 886 DO ind=1,ndomain 887 rval2d=>field(ind)%rval2d 888 889 req=>message%request(ind) 890 DO isend=1,req%nsend 891 ireq=ireq+1 892 send=>req%send(isend) 893 value=>send%value 894 895 896 IF (send%rank/=mpi_rank .OR. .TRUE.) THEN 897 ireq_mpi=ireq_mpi+1 898 buffer_r2=>message%buffers(ireq)%r2 899 CALL trace_in 900 901 !$OMP DO SCHEDULE(STATIC) 902 DO n=1,send%size 903 buffer_r2(n)=rval2d(value(n)) 904 ENDDO 905 906 CALL trace_out 907 908 !$OMP MASTER 909 CALL MPI_ISSEND(buffer_r2,send%size,MPI_REAL8,send%rank,ind+100*message%number,comm_icosa, message%mpi_req(ireq_mpi),ierr) 910 !$OMP END MASTER 911 912 ENDIF 913 ENDDO 914 915 DO irecv=1,req%nrecv 916 ireq=ireq+1 917 recv=>req%recv(irecv) 918 919 IF (recv%rank==mpi_rank .AND. .FALSE.) THEN 920 value=>recv%value 921 src_value => recv%src_value 922 src_rval2d=>field(recv%domain)%rval2d 923 sgn=>recv%sign 924 !$OMP DO SCHEDULE(STATIC) 925 DO n=1,recv%size 926 rval2d(value(n))=src_rval2d(src_value(n))*sgn(n) 927 ENDDO 928 929 ELSE 930 ireq_mpi=ireq_mpi+1 931 buffer_r2=>message%buffers(ireq)%r2 932 !$OMP MASTER 933 CALL MPI_IRECV(buffer_r2,recv%size,MPI_REAL8,recv%rank,recv%domain+100*message%number,comm_icosa, message%mpi_req(ireq_mpi),ierr) 934 !$OMP END MASTER 935 ENDIF 936 ENDDO 937 938 ENDDO 939 940 ELSE IF (field(1)%ndim==3) THEN 941 942 ireq=0 943 ireq_mpi=0 944 DO ind=1,ndomain 945 dim3=size(field(ind)%rval3d,2) 946 rval3d=>field(ind)%rval3d 947 req=>message%request(ind) 948 949 DO isend=1,req%nsend 950 ireq=ireq+1 951 send=>req%send(isend) 952 value=>send%value 953 954 IF (send%rank/=mpi_rank .OR. .TRUE.) THEN 955 ireq_mpi=ireq_mpi+1 956 buffer_r3=>message%buffers(ireq)%r3 957 958 CALL trace_in 959 960 !$OMP DO SCHEDULE(STATIC) 961 DO n=1,send%size 962 buffer_r3(n,:)=rval3d(value(n),:) 963 ENDDO 964 965 CALL trace_out 966 967 !$OMP MASTER 968 CALL MPI_ISSEND(buffer_r3,send%size*dim3,MPI_REAL8,send%rank,ind+100*message%number,comm_icosa, message%mpi_req(ireq_mpi),ierr) 969 !$OMP END MASTER 970 ENDIF 971 ENDDO 972 973 DO irecv=1,req%nrecv 974 ireq=ireq+1 975 recv=>req%recv(irecv) 976 977 IF (recv%rank==mpi_rank .AND. .FALSE.) THEN 978 value=>recv%value 979 src_value => recv%src_value 980 src_rval3d=>field(recv%domain)%rval3d 981 sgn=>recv%sign 982 !$OMP DO SCHEDULE(STATIC) 983 DO n=1,recv%size 984 rval3d(value(n),:)=src_rval3d(src_value(n),:)*sgn(n) 985 ENDDO 986 987 ELSE 988 ireq_mpi=ireq_mpi+1 989 buffer_r3=>message%buffers(ireq)%r3 990 !$OMP MASTER 991 CALL MPI_IRECV(buffer_r3,recv%size*dim3,MPI_REAL8,recv%rank,recv%domain+100*message%number,comm_icosa, message%mpi_req(ireq_mpi),ierr) 992 !$OMP END MASTER 993 ENDIF 994 ENDDO 995 996 ENDDO 997 998 ELSE IF (field(1)%ndim==4) THEN 999 1000 ireq=0 1001 ireq_mpi=0 1002 DO ind=1,ndomain 1003 dim3=size(field(ind)%rval4d,2) 1004 dim4=size(field(ind)%rval4d,3) 1005 rval4d=>field(ind)%rval4d 1006 req=>message%request(ind) 1007 1008 DO isend=1,req%nsend 1009 ireq=ireq+1 1010 send=>req%send(isend) 1011 value=>send%value 1012 1013 IF (send%rank/=mpi_rank .OR. .TRUE.) THEN 1014 ireq_mpi=ireq_mpi+1 1015 buffer_r4=>message%buffers(ireq)%r4 1016 CALL trace_in 1017 1018 !$OMP DO SCHEDULE(STATIC) 1019 DO n=1,send%size 1020 buffer_r4(n,:,:)=rval4d(value(n),:,:) 1021 ENDDO 1022 1023 CALL trace_out 1024 1025 !$OMP MASTER 1026 CALL MPI_ISSEND(buffer_r4,send%size*dim3*dim4,MPI_REAL8,send%rank,ind+100*message%number,comm_icosa, message%mpi_req(ireq_mpi),ierr) 1027 !$OMP END MASTER 1028 ENDIF 1029 ENDDO 1030 1031 DO irecv=1,req%nrecv 1032 ireq=ireq+1 1033 recv=>req%recv(irecv) 1034 IF (recv%rank==mpi_rank .AND. .FALSE.) THEN 1035 value=>recv%value 1036 src_value => recv%src_value 1037 src_rval4d=>field(recv%domain)%rval4d 1038 sgn=>recv%sign 1039 1040 !$OMP DO SCHEDULE(STATIC) 1041 DO n=1,recv%size 1042 rval4d(value(n),:,:)=src_rval4d(src_value(n),:,:)*sgn(n) 1043 ENDDO 1044 1045 ELSE 1046 ireq_mpi=ireq_mpi+1 1047 buffer_r4=>message%buffers(ireq)%r4 1048 !$OMP MASTER 1049 CALL MPI_IRECV(buffer_r4,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%domain+100*message%number,comm_icosa, message%mpi_req(ireq_mpi),ierr) 1050 !$OMP END MASTER 1051 ENDIF 1052 ENDDO 1053 1054 ENDDO 1055 1056 ENDIF 1057 1058 ENDIF 1059 IF (ireq_mpi /= message%nreq ) THEN 1060 STOP "ireq_mpi /= message%nreq" 1061 ENDIF 1062 1063 CALL trace_end("transfert_mpi") 1064 !$OMP BARRIER 1065 1066 END SUBROUTINE send_message_mpi 1067 1068 SUBROUTINE test_message_mpi(message) 1069 IMPLICIT NONE 1070 TYPE(t_message) :: message 1071 1072 INTEGER :: ierr 1073 !$OMP MASTER 1074 IF (.NOT. message%pending) RETURN 1075 !$OMP END MASTER 1076 1077 !$OMP MASTER 1078 IF (.NOT. message%completed) CALL MPI_TESTALL(message%nreq,message%mpi_req,message%completed,message%status,ierr) 1079 !$OMP END MASTER 1080 END SUBROUTINE test_message_mpi 1081 1082 1083 SUBROUTINE wait_message_mpi(message) 1084 USE field_mod 1085 USE domain_mod 1086 USE mpi_mod 1087 USE mpipara 1088 USE omp_para 1089 USE trace 1090 IMPLICIT NONE 1091 TYPE(t_message) :: message 1092 1093 TYPE(t_field),POINTER :: field(:) 1094 REAL(rstd),POINTER :: rval2d(:) 1095 REAL(rstd),POINTER :: rval3d(:,:) 1096 REAL(rstd),POINTER :: rval4d(:,:,:) 1097 REAL(rstd),POINTER :: buffer_r2(:) 1098 REAL(rstd),POINTER :: buffer_r3(:,:) 1099 REAL(rstd),POINTER :: buffer_r4(:,:,:) 1074 REAL(rstd),POINTER :: buffer_r(:) 1100 1075 INTEGER,POINTER :: value(:) 1101 1076 INTEGER,POINTER :: sgn(:) … … 1106 1081 INTEGER :: irecv,isend 1107 1082 INTEGER :: ireq,nreq 1108 INTEGER :: ind,n,l,m 1109 INTEGER :: dim3,dim4 1083 INTEGER :: ind,i,n,l,m 1084 INTEGER :: dim3,dim4,d3,d4 1085 INTEGER,POINTER :: src_value(:) 1086 INTEGER,POINTER :: sign(:) 1087 INTEGER :: offset,msize,rank 1088 1089 CALL trace_start("transfert_mpi") 1110 1090 1111 1091 !$OMP BARRIER 1112 1092 1113 CALL trace_start("transfert_mpi") 1114 1115 IF (.NOT. message%pending) RETURN 1116 1117 field=>message%field 1118 nreq=message%nreq 1119 1093 1094 !$OMP MASTER 1095 message%field=>field 1096 1097 IF (message%nreq>0) THEN 1098 message%completed=.FALSE. 1099 message%pending=.TRUE. 1100 ELSE 1101 message%completed=.TRUE. 1102 message%pending=.FALSE. 1103 ENDIF 1104 !$OMP END MASTER 1105 !$OMP BARRIER 1106 1120 1107 IF (field(1)%data_type==type_real) THEN 1121 1108 IF (field(1)%ndim==2) THEN 1122 1109 1123 !$OMP MASTER1124 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr)1125 !$OMP END MASTER1126 !$OMP BARRIER1127 1128 ireq=01129 1110 DO ind=1,ndomain 1111 IF (.NOT. assigned_domain(ind)) CYCLE 1112 1130 1113 rval2d=>field(ind)%rval2d 1114 1131 1115 req=>message%request(ind) 1132 1133 1116 DO isend=1,req%nsend 1134 ireq=ireq+1 1135 ENDDO 1136 1137 DO irecv=1,req%nrecv 1138 ireq=ireq+1 1139 recv=>req%recv(irecv) 1140 IF (recv%rank/=mpi_rank .OR. .TRUE.) THEN 1141 buffer_r2=>message%buffers(ireq)%r2 1142 value=>recv%value 1143 sgn=>recv%sign 1144 1145 CALL trace_in 1117 send=>req%send(isend) 1118 value=>send%value 1119 1146 1120 1147 !$OMP DO SCHEDULE(STATIC) 1148 DO n=1,recv%size 1149 rval2d(value(n))=buffer_r2(n)*sgn(n) 1150 ENDDO 1151 1152 CALL trace_out 1121 IF (send%rank/=mpi_rank) THEN 1122 ireq=send%ireq 1123 1124 buffer_r=>message%buffers(ireq)%r 1125 offset=send%offset 1126 1127 DO n=1,send%size 1128 buffer_r(offset+n)=rval2d(value(n)) 1129 ENDDO 1130 1131 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1132 !$OMP CRITICAL 1133 CALL MPI_ISEND(buffer_r,send%size,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1134 !$OMP END CRITICAL 1135 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1136 CALL MPI_ISEND(buffer_r,send%size,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1137 ENDIF 1138 1153 1139 ENDIF 1154 1140 ENDDO 1155 1156 ENDDO 1157 1141 ENDDO 1142 1143 DO ind=1,ndomain 1144 IF (.NOT. assigned_domain(ind)) CYCLE 1145 rval2d=>field(ind)%rval2d 1146 req=>message%request(ind) 1147 1148 DO irecv=1,req%nrecv 1149 recv=>req%recv(irecv) 1150 1151 IF (recv%rank==mpi_rank) THEN 1152 1153 value=>recv%value 1154 src_value => recv%src_value 1155 src_rval2d=>field(recv%domain)%rval2d 1156 sgn=>recv%sign 1157 1158 DO n=1,recv%size 1159 rval2d(value(n))=src_rval2d(src_value(n))*sgn(n) 1160 ENDDO 1161 1162 1163 ELSE 1164 1165 ireq=recv%ireq 1166 buffer_r=>message%buffers(ireq)%r 1167 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1168 !$OMP CRITICAL 1169 CALL MPI_IRECV(buffer_r,recv%size,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1170 !$OMP END CRITICAL 1171 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1172 CALL MPI_IRECV(buffer_r,recv%size,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1173 ENDIF 1174 1175 ENDIF 1176 ENDDO 1177 1178 ENDDO 1179 1158 1180 1159 1181 ELSE IF (field(1)%ndim==3) THEN 1160 1161 !$OMP MASTER 1162 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 1163 !$OMP END MASTER 1164 !$OMP BARRIER 1165 1166 ireq=0 1182 1167 1183 DO ind=1,ndomain 1184 IF (.NOT. assigned_domain(ind)) CYCLE 1185 1186 dim3=size(field(ind)%rval3d,2) 1168 1187 rval3d=>field(ind)%rval3d 1169 1188 req=>message%request(ind) 1170 1189 1171 1190 DO isend=1,req%nsend 1172 ireq=ireq+1 1173 ENDDO 1174 1175 DO irecv=1,req%nrecv 1176 ireq=ireq+1 1177 recv=>req%recv(irecv) 1178 IF (recv%rank/=mpi_rank .OR. .TRUE.) THEN 1179 buffer_r3=>message%buffers(ireq)%r3 1180 value=>recv%value 1181 sgn=>recv%sign 1182 1183 CALL trace_in 1184 1185 !$OMP DO SCHEDULE(STATIC) 1186 DO n=1,recv%size 1187 rval3d(value(n),:)=buffer_r3(n,:)*sgn(n) 1188 ENDDO 1189 1190 CALL trace_out 1191 send=>req%send(isend) 1192 value=>send%value 1193 1194 IF (send%rank/=mpi_rank) THEN 1195 ireq=send%ireq 1196 buffer_r=>message%buffers(ireq)%r 1197 offset=send%offset*dim3 1198 1199 DO d3=1,dim3 1200 DO n=1,send%size 1201 buffer_r(n+offset)=rval3d(value(n),d3) 1202 ENDDO 1203 offset=offset+send%size 1204 ENDDO 1205 1206 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1207 !$OMP CRITICAL 1208 CALL MPI_ISEND(buffer_r,send%size*dim3,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1209 !$OMP END CRITICAL 1210 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1211 CALL MPI_ISEND(buffer_r,send%size*dim3,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1212 ENDIF 1191 1213 ENDIF 1192 1214 ENDDO 1215 ENDDO 1216 1217 DO ind=1,ndomain 1218 IF (.NOT. assigned_domain(ind)) CYCLE 1219 dim3=size(field(ind)%rval3d,2) 1220 rval3d=>field(ind)%rval3d 1221 req=>message%request(ind) 1222 1223 DO irecv=1,req%nrecv 1224 recv=>req%recv(irecv) 1225 1226 IF (recv%rank==mpi_rank) THEN 1227 value=>recv%value 1228 src_value => recv%src_value 1229 src_rval3d=>field(recv%domain)%rval3d 1230 sgn=>recv%sign 1231 1232 DO n=1,recv%size 1233 rval3d(value(n),:)=src_rval3d(src_value(n),:)*sgn(n) 1234 ENDDO 1235 1236 ELSE 1237 ireq=recv%ireq 1238 buffer_r=>message%buffers(ireq)%r 1239 1240 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1241 !$OMP CRITICAL 1242 CALL MPI_IRECV(buffer_r,recv%size*dim3,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1243 !$OMP END CRITICAL 1244 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1245 CALL MPI_IRECV(buffer_r,recv%size*dim3,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1246 ENDIF 1247 ENDIF 1248 ENDDO 1193 1249 1194 1250 ENDDO 1195 1251 1196 1252 ELSE IF (field(1)%ndim==4) THEN 1197 !$OMP MASTER 1198 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 1199 !$OMP END MASTER 1200 !$OMP BARRIER 1201 1202 ireq=0 1253 1203 1254 DO ind=1,ndomain 1255 IF (.NOT. assigned_domain(ind)) CYCLE 1256 1257 dim3=size(field(ind)%rval4d,2) 1258 dim4=size(field(ind)%rval4d,3) 1204 1259 rval4d=>field(ind)%rval4d 1205 1260 req=>message%request(ind) 1206 1261 1207 1262 DO isend=1,req%nsend 1208 ireq=ireq+11209 ENDDO1210 1211 DO irecv=1,req%nrecv1212 ireq=ireq+1 1213 recv=>req%recv(irecv)1214 IF (recv%rank/=mpi_rank .OR. .TRUE.) THEN1215 buffer_r4=>message%buffers(ireq)%r41216 value=>recv%value 1217 sgn=>recv%sign1218 1219 CALL trace_in1220 1221 !$OMP DO SCHEDULE(STATIC) 1222 DO n=1,recv%size1223 rval4d(value(n),:,:)=buffer_r4(n,:,:)*sgn(n)1263 send=>req%send(isend) 1264 value=>send%value 1265 1266 IF (send%rank/=mpi_rank) THEN 1267 1268 ireq=send%ireq 1269 buffer_r=>message%buffers(ireq)%r 1270 offset=send%offset*dim3*dim4 1271 1272 DO d4=1,dim4 1273 DO d3=1,dim3 1274 DO n=1,send%size 1275 buffer_r(n+offset)=rval4d(value(n),d3,d4) 1276 ENDDO 1277 offset=offset+send%size 1278 ENDDO 1224 1279 ENDDO 1225 1280 1226 CALL trace_out 1281 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1282 !$OMP CRITICAL 1283 CALL MPI_ISEND(buffer_r,send%size*dim3*dim4,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1284 !$OMP END CRITICAL 1285 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1286 CALL MPI_ISEND(buffer_r,send%size*dim3*dim4,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1287 ENDIF 1288 1227 1289 ENDIF 1228 1290 ENDDO 1229 1230 ENDDO 1231 1291 ENDDO 1292 1293 DO ind=1,ndomain 1294 IF (.NOT. assigned_domain(ind)) CYCLE 1295 1296 dim3=size(field(ind)%rval4d,2) 1297 dim4=size(field(ind)%rval4d,3) 1298 rval4d=>field(ind)%rval4d 1299 req=>message%request(ind) 1300 1301 DO irecv=1,req%nrecv 1302 recv=>req%recv(irecv) 1303 IF (recv%rank==mpi_rank) THEN 1304 value=>recv%value 1305 src_value => recv%src_value 1306 src_rval4d=>field(recv%domain)%rval4d 1307 sgn=>recv%sign 1308 1309 DO n=1,recv%size 1310 rval4d(value(n),:,:)=src_rval4d(src_value(n),:,:)*sgn(n) 1311 ENDDO 1312 1313 ELSE 1314 1315 ireq=recv%ireq 1316 buffer_r=>message%buffers(ireq)%r 1317 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1318 !$OMP CRITICAL 1319 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1320 !$OMP END CRITICAL 1321 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1322 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1323 ENDIF 1324 1325 ENDIF 1326 ENDDO 1327 ENDDO 1328 1232 1329 ENDIF 1233 1330 1331 IF (mpi_threading_mode==MPI_THREAD_FUNNELED) THEN 1332 !$OMP BARRIER 1333 !$OMP MASTER 1334 1335 DO ireq=1,message%nreq_send 1336 buffer_r=>message%buffers(ireq)%r 1337 msize=message%buffers(ireq)%size 1338 rank=message%buffers(ireq)%rank 1339 CALL MPI_ISEND(buffer_r,msize,MPI_REAL8,rank,1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1340 ENDDO 1341 1342 DO ireq=message%nreq_send+1,message%nreq_send+message%nreq_recv 1343 buffer_r=>message%buffers(ireq)%r 1344 msize=message%buffers(ireq)%size 1345 rank=message%buffers(ireq)%rank 1346 CALL MPI_IRECV(buffer_r,msize,MPI_REAL8,rank,1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1347 ENDDO 1348 1349 !$OMP END MASTER 1350 ENDIF 1234 1351 ENDIF 1352 1353 !$OMP BARRIER 1354 CALL trace_end("transfert_mpi") 1355 1356 END SUBROUTINE send_message_mpi 1357 1358 SUBROUTINE test_message_mpi(message) 1359 IMPLICIT NONE 1360 TYPE(t_message) :: message 1361 1362 INTEGER :: ierr 1235 1363 1236 1364 !$OMP MASTER 1237 message%pending=.FALSE.1365 IF (message%pending .AND. .NOT. message%completed) CALL MPI_TESTALL(message%nreq,message%mpi_req,message%completed,message%status,ierr) 1238 1366 !$OMP END MASTER 1239 1240 CALL trace_end("transfert_mpi") 1241 !$OMP BARRIER 1242 1243 END SUBROUTINE wait_message_mpi 1244 1245 1246 SUBROUTINE transfert_request_mpi(field,request) 1367 END SUBROUTINE test_message_mpi 1368 1369 1370 SUBROUTINE wait_message_mpi(message) 1247 1371 USE field_mod 1248 1372 USE domain_mod 1249 1373 USE mpi_mod 1250 1374 USE mpipara 1375 USE omp_para 1251 1376 USE trace 1252 1377 IMPLICIT NONE 1378 TYPE(t_message) :: message 1379 1253 1380 TYPE(t_field),POINTER :: field(:) 1254 TYPE(t_request),POINTER :: request(:)1255 1381 REAL(rstd),POINTER :: rval2d(:) 1256 1382 REAL(rstd),POINTER :: rval3d(:,:) 1257 1383 REAL(rstd),POINTER :: rval4d(:,:,:) 1258 REAL(rstd),POINTER :: buffer_r2(:) 1259 REAL(rstd),POINTER :: buffer_r3(:,:) 1260 REAL(rstd),POINTER :: buffer_r4(:,:,:) 1384 REAL(rstd),POINTER :: buffer_r(:) 1261 1385 INTEGER,POINTER :: value(:) 1262 1386 INTEGER,POINTER :: sgn(:) … … 1267 1391 INTEGER :: irecv,isend 1268 1392 INTEGER :: ireq,nreq 1269 INTEGER :: ind,n 1270 INTEGER :: dim3,dim4 1393 INTEGER :: ind,n,l,m,i 1394 INTEGER :: dim3,dim4,d3,d4 1395 INTEGER :: offset 1396 1397 IF (.NOT. message%pending) RETURN 1271 1398 1272 1399 CALL trace_start("transfert_mpi") 1273 1400 1401 field=>message%field 1402 nreq=message%nreq 1403 1274 1404 IF (field(1)%data_type==type_real) THEN 1275 1405 IF (field(1)%ndim==2) THEN 1276 1277 nreq=sum(request(:)%nsend)+sum(request(:)%nrecv) 1278 ALLOCATE(mpi_req(nreq))1279 ALLOCATE(status(MPI_STATUS_SIZE,nreq)) 1280 1281 ireq=01406 1407 !$OMP MASTER 1408 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 1409 !$OMP END MASTER 1410 !$OMP BARRIER 1411 1282 1412 DO ind=1,ndomain 1413 IF (.NOT. assigned_domain(ind)) CYCLE 1414 1283 1415 rval2d=>field(ind)%rval2d 1284 1285 req=>request(ind) 1286 DO isend=1,req%nsend 1287 send=>req%send(isend) 1288 1289 ALLOCATE(send%buffer_r2(send%size)) 1290 buffer_r2=>send%buffer_r2 1291 value=>send%value 1292 DO n=1,send%size 1293 buffer_r2(n)=rval2d(value(n)) 1294 ENDDO 1295 1296 ireq=ireq+1 1297 CALL MPI_ISEND(buffer_r2,send%size,MPI_REAL8,send%rank,ind,comm_icosa, mpi_req(ireq),ierr) 1298 ENDDO 1299 1416 req=>message%request(ind) 1300 1417 DO irecv=1,req%nrecv 1301 1418 recv=>req%recv(irecv) 1302 ALLOCATE(recv%buffer_r2(recv%size)) 1303 1304 ireq=ireq+1 1305 CALL MPI_IRECV(recv%buffer_r2,recv%size,MPI_REAL8,recv%rank,recv%domain,comm_icosa, mpi_req(ireq),ierr) 1419 IF (recv%rank/=mpi_rank) THEN 1420 ireq=recv%ireq 1421 buffer_r=>message%buffers(ireq)%r 1422 value=>recv%value 1423 sgn=>recv%sign 1424 offset=recv%offset 1425 DO n=1,recv%size 1426 rval2d(value(n))=buffer_r(n+offset)*sgn(n) 1427 ENDDO 1428 1429 ENDIF 1306 1430 ENDDO 1307 1431 1308 1432 ENDDO 1309 1310 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 1433 1434 1435 ELSE IF (field(1)%ndim==3) THEN 1436 1437 !$OMP MASTER 1438 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 1439 !$OMP END MASTER 1440 !$OMP BARRIER 1441 1311 1442 1312 1443 DO ind=1,ndomain 1313 rval2d=>field(ind)%rval2d 1314 1315 req=>request(ind) 1316 DO isend=1,req%nsend 1317 send=>req%send(isend) 1318 DEALLOCATE(send%buffer_r2) 1319 ENDDO 1320 1444 IF (.NOT. assigned_domain(ind)) CYCLE 1445 1446 rval3d=>field(ind)%rval3d 1447 req=>message%request(ind) 1321 1448 DO irecv=1,req%nrecv 1322 1449 recv=>req%recv(irecv) 1323 buffer_r2=>recv%buffer_r2 1324 value=>recv%value 1325 sgn=>recv%sign 1326 DO n=1,recv%size 1327 rval2d(value(n))=buffer_r2(n)*sgn(n) 1328 ENDDO 1329 DEALLOCATE(recv%buffer_r2) 1450 IF (recv%rank/=mpi_rank) THEN 1451 ireq=recv%ireq 1452 buffer_r=>message%buffers(ireq)%r 1453 value=>recv%value 1454 sgn=>recv%sign 1455 1456 dim3=size(rval3d,2) 1457 offset=recv%offset*dim3 1458 DO d3=1,dim3 1459 DO n=1,recv%size 1460 rval3d(value(n),d3)=buffer_r(n+offset)*sgn(n) 1461 ENDDO 1462 offset=offset+recv%size 1463 ENDDO 1464 ENDIF 1330 1465 ENDDO 1331 1466 1332 1467 ENDDO 1333 1334 1335 ELSE IF (field(1)%ndim==3) THEN 1336 1337 nreq=sum(request(:)%nsend)+sum(request(:)%nrecv) 1338 ALLOCATE(mpi_req(nreq)) 1339 ALLOCATE(status(MPI_STATUS_SIZE,nreq)) 1340 1341 ireq=0 1468 1469 ELSE IF (field(1)%ndim==4) THEN 1470 !$OMP MASTER 1471 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 1472 !$OMP END MASTER 1473 !$OMP BARRIER 1474 1475 1342 1476 DO ind=1,ndomain 1343 dim3=size(field(ind)%rval3d,2) 1344 rval3d=>field(ind)%rval3d 1345 1346 req=>request(ind) 1347 DO isend=1,req%nsend 1348 send=>req%send(isend) 1349 1350 ALLOCATE(send%buffer_r3(send%size,dim3)) 1351 buffer_r3=>send%buffer_r3 1352 value=>send%value 1353 DO n=1,send%size 1354 buffer_r3(n,:)=rval3d(value(n),:) 1355 ENDDO 1356 1357 ireq=ireq+1 1358 CALL MPI_ISEND(buffer_r3,send%size*dim3,MPI_REAL8,send%rank,ind,comm_icosa, mpi_req(ireq),ierr) 1359 ENDDO 1360 1477 IF (.NOT. assigned_domain(ind)) CYCLE 1478 1479 rval4d=>field(ind)%rval4d 1480 req=>message%request(ind) 1361 1481 DO irecv=1,req%nrecv 1362 1482 recv=>req%recv(irecv) 1363 ALLOCATE(recv%buffer_r3(recv%size,dim3)) 1364 1365 ireq=ireq+1 1366 CALL MPI_IRECV(recv%buffer_r3,recv%size*dim3,MPI_REAL8,recv%rank,recv%domain,comm_icosa, mpi_req(ireq),ierr) 1483 IF (recv%rank/=mpi_rank) THEN 1484 ireq=recv%ireq 1485 buffer_r=>message%buffers(ireq)%r 1486 value=>recv%value 1487 sgn=>recv%sign 1488 1489 dim3=size(rval4d,2) 1490 dim4=size(rval4d,3) 1491 offset=recv%offset*dim3*dim4 1492 DO d4=1,dim4 1493 DO d3=1,dim3 1494 DO n=1,recv%size 1495 rval4d(value(n),d3,d4)=buffer_r(n+offset)*sgn(n) 1496 ENDDO 1497 offset=offset+recv%size 1498 ENDDO 1499 ENDDO 1500 ENDIF 1367 1501 ENDDO 1368 1502 1369 1503 ENDDO 1370 1371 CALL MPI_WAITALL(nreq,mpi_req,status,ierr)1372 1373 DO ind=1,ndomain1374 rval3d=>field(ind)%rval3d1375 1376 req=>request(ind)1377 DO isend=1,req%nsend1378 send=>req%send(isend)1379 DEALLOCATE(send%buffer_r3)1380 ENDDO1381 1382 DO irecv=1,req%nrecv1383 recv=>req%recv(irecv)1384 buffer_r3=>recv%buffer_r31385 value=>recv%value1386 sgn=>recv%sign1387 DO n=1,recv%size1388 rval3d(value(n),:)=buffer_r3(n,:)*sgn(n)1389 ENDDO1390 DEALLOCATE(recv%buffer_r3)1391 ENDDO1392 1393 ENDDO1394 1395 ELSE IF (field(1)%ndim==4) THEN1396 1397 nreq=sum(request(:)%nsend)+sum(request(:)%nrecv)1398 ALLOCATE(mpi_req(nreq))1399 ALLOCATE(status(MPI_STATUS_SIZE,nreq))1400 1401 ireq=01402 DO ind=1,ndomain1403 dim3=size(field(ind)%rval4d,2)1404 dim4=size(field(ind)%rval4d,3)1405 rval4d=>field(ind)%rval4d1406 1407 req=>request(ind)1408 DO isend=1,req%nsend1409 send=>req%send(isend)1410 1411 ALLOCATE(send%buffer_r4(send%size,dim3,dim4))1412 buffer_r4=>send%buffer_r41413 value=>send%value1414 DO n=1,send%size1415 buffer_r4(n,:,:)=rval4d(value(n),:,:)1416 ENDDO1417 1418 ireq=ireq+11419 CALL MPI_ISEND(buffer_r4,send%size*dim3*dim4,MPI_REAL8,send%rank,ind,comm_icosa, mpi_req(ireq),ierr)1420 ENDDO1421 1422 DO irecv=1,req%nrecv1423 recv=>req%recv(irecv)1424 ALLOCATE(recv%buffer_r4(recv%size,dim3,dim4))1425 1426 ireq=ireq+11427 CALL MPI_IRECV(recv%buffer_r4,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%domain,comm_icosa, mpi_req(ireq),ierr)1428 ENDDO1429 1430 ENDDO1431 1432 CALL MPI_WAITALL(nreq,mpi_req,status,ierr)1433 1434 DO ind=1,ndomain1435 rval4d=>field(ind)%rval4d1436 1437 req=>request(ind)1438 DO isend=1,req%nsend1439 send=>req%send(isend)1440 DEALLOCATE(send%buffer_r4)1441 ENDDO1442 1443 DO irecv=1,req%nrecv1444 recv=>req%recv(irecv)1445 buffer_r4=>recv%buffer_r41446 value=>recv%value1447 sgn=>recv%sign1448 DO n=1,recv%size1449 rval4d(value(n),:,:)=buffer_r4(n,:,:)*sgn(n)1450 ENDDO1451 DEALLOCATE(recv%buffer_r4)1452 ENDDO1453 1454 ENDDO1455 1504 1456 1505 ENDIF … … 1458 1507 ENDIF 1459 1508 1509 !$OMP MASTER 1510 message%pending=.FALSE. 1511 !$OMP END MASTER 1512 1460 1513 CALL trace_end("transfert_mpi") 1461 1514 !$OMP BARRIER 1515 1516 END SUBROUTINE wait_message_mpi 1517 1518 SUBROUTINE transfert_request_mpi(field,request) 1519 USE field_mod 1520 IMPLICIT NONE 1521 TYPE(t_field),POINTER :: field(:) 1522 TYPE(t_request),POINTER :: request(:) 1523 1524 TYPE(t_message),SAVE :: message 1525 1526 1527 CALL init_message_mpi(field,request, message) 1528 CALL transfert_message_mpi(field,message) 1529 CALL finalize_message_mpi(field,message) 1530 1462 1531 END SUBROUTINE transfert_request_mpi 1532 1533 1463 1534 1464 1535 SUBROUTINE transfert_request_seq(field,request)
Note: See TracChangeset
for help on using the changeset viewer.