- Timestamp:
- 07/25/19 11:36:36 (5 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/parallel/transfert_mpi_legacy.f90
r962 r963 1 MODULE transfert_mpi_ mod1 MODULE transfert_mpi_legacy_mod 2 2 USE genmod 3 3 USE field_mod 4 4 IMPLICIT NONE 5 5 6 6 TYPE array 7 7 INTEGER,POINTER :: value(:)=>null() … … 17 17 INTEGER,POINTER :: src_value(:)=>null() 18 18 END TYPE array 19 19 20 20 TYPE t_buffer 21 21 REAL,POINTER :: r(:) 22 22 INTEGER :: size 23 23 INTEGER :: rank 24 END TYPE t_buffer 25 24 END TYPE t_buffer 25 26 26 TYPE t_request 27 27 INTEGER :: type_field … … 45 45 TYPE(ARRAY),POINTER :: send(:) 46 46 END TYPE t_request 47 47 48 48 TYPE(t_request),SAVE,POINTER :: req_i1(:) 49 49 TYPE(t_request),SAVE,POINTER :: req_e1_scal(:) 50 50 TYPE(t_request),SAVE,POINTER :: req_e1_vect(:) 51 51 TYPE(t_request),SAVE,POINTER :: req_z1_scal(:) 52 52 53 53 TYPE(t_request),SAVE,POINTER :: req_i0(:) 54 54 TYPE(t_request),SAVE,POINTER :: req_e0_scal(:) … … 60 60 INTEGER :: tag 61 61 INTEGER :: isend 62 END TYPE t_reorder 63 62 END TYPE t_reorder 63 64 64 TYPE t_message 65 65 CHARACTER(LEN=100) :: name ! for debug … … 71 71 INTEGER, POINTER :: mpi_req(:) 72 72 INTEGER, POINTER :: status(:,:) 73 TYPE(t_buffer),POINTER :: buffers(:) 73 TYPE(t_buffer),POINTER :: buffers(:) 74 74 TYPE(t_field),POINTER :: field(:) 75 75 LOGICAL :: completed … … 80 80 END TYPE t_message 81 81 82 83 INTERFACE bcast_mpi84 MODULE PROCEDURE bcast_mpi_c, &85 bcast_mpi_i,bcast_mpi_i1,bcast_mpi_i2,bcast_mpi_i3,bcast_mpi_i4, &86 bcast_mpi_r,bcast_mpi_r1,bcast_mpi_r2,bcast_mpi_r3,bcast_mpi_r4, &87 bcast_mpi_l,bcast_mpi_l1,bcast_mpi_l2,bcast_mpi_l3,bcast_mpi_l488 END INTERFACE89 90 82 integer :: profile_mpi_copies, profile_mpi_waitall, profile_mpi_omp_barrier 91 83 92 84 CONTAINS 93 94 85 86 95 87 SUBROUTINE init_transfert 96 88 USE profiling_mod … … 119 111 DO j=jj_begin,jj_end 120 112 CALL request_add_point(ind,ii_end+1,j,req_i1) 121 ENDDO 113 ENDDO 122 114 DO i=ii_begin,ii_end 123 115 CALL request_add_point(ind,i,jj_end+1,req_i1) 124 ENDDO 116 ENDDO 125 117 126 118 DO j=jj_begin,jj_end+1 127 119 CALL request_add_point(ind,ii_begin-1,j,req_i1) 128 ENDDO 129 120 ENDDO 121 130 122 ENDDO 131 123 132 124 CALL finalize_request(req_i1) 133 125 … … 137 129 DO ind=1,ndomain 138 130 CALL swap_dimensions(ind) 139 131 140 132 DO i=ii_begin,ii_end 141 133 CALL request_add_point(ind,i,jj_begin,req_i0) … … 144 136 DO j=jj_begin,jj_end 145 137 CALL request_add_point(ind,ii_end,j,req_i0) 146 ENDDO 147 138 ENDDO 139 148 140 DO i=ii_begin,ii_end 149 141 CALL request_add_point(ind,i,jj_end,req_i0) 150 ENDDO 142 ENDDO 151 143 152 144 DO j=jj_begin,jj_end 153 145 CALL request_add_point(ind,ii_begin,j,req_i0) 154 ENDDO 155 146 ENDDO 147 156 148 ENDDO 157 158 CALL finalize_request(req_i0) 149 150 CALL finalize_request(req_i0) 159 151 160 152 … … 169 161 DO j=jj_begin,jj_end 170 162 CALL request_add_point(ind,ii_end+1,j,req_e1_scal,left) 171 ENDDO 163 ENDDO 172 164 DO j=jj_begin,jj_end 173 165 CALL request_add_point(ind,ii_end+1,j-1,req_e1_scal,lup) 174 ENDDO 175 166 ENDDO 167 176 168 DO i=ii_begin,ii_end 177 169 CALL request_add_point(ind,i,jj_end+1,req_e1_scal,ldown) 178 170 CALL request_add_point(ind,i-1,jj_end+1,req_e1_scal,rdown) 179 ENDDO 171 ENDDO 180 172 181 173 DO j=jj_begin,jj_end 182 174 CALL request_add_point(ind,ii_begin-1,j,req_e1_scal,right) 183 ENDDO 175 ENDDO 184 176 DO j=jj_begin,jj_end 185 177 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_scal,rdown) 186 ENDDO 178 ENDDO 187 179 188 180 ENDDO … … 200 192 CALL request_add_point(ind,i,jj_end,req_e0_scal,right) 201 193 ENDDO 202 194 203 195 DO j=jj_begin+1,jj_end-1 204 196 CALL request_add_point(ind,ii_begin,j,req_e0_scal,rup) 205 197 CALL request_add_point(ind,ii_end,j,req_e0_scal,rup) 206 ENDDO 198 ENDDO 207 199 208 200 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e0_scal,left) … … 216 208 217 209 218 210 219 211 CALL create_request(field_u,req_e1_vect,.TRUE.) 220 212 DO ind=1,ndomain … … 227 219 DO j=jj_begin,jj_end 228 220 CALL request_add_point(ind,ii_end+1,j,req_e1_vect,left) 229 ENDDO 221 ENDDO 230 222 DO j=jj_begin,jj_end 231 223 CALL request_add_point(ind,ii_end+1,j-1,req_e1_vect,lup) 232 ENDDO 233 224 ENDDO 225 234 226 DO i=ii_begin,ii_end 235 227 CALL request_add_point(ind,i,jj_end+1,req_e1_vect,ldown) 236 228 CALL request_add_point(ind,i-1,jj_end+1,req_e1_vect,rdown) 237 ENDDO 229 ENDDO 238 230 239 231 DO j=jj_begin,jj_end 240 232 CALL request_add_point(ind,ii_begin-1,j,req_e1_vect,right) 241 ENDDO 233 ENDDO 242 234 DO j=jj_begin,jj_end 243 235 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_vect,rdown) 244 ENDDO 245 246 247 ENDDO 236 ENDDO 237 238 239 ENDDO 248 240 249 241 CALL finalize_request(req_e1_vect) 250 251 242 243 252 244 CALL create_request(field_u,req_e0_vect,.TRUE.) 253 245 DO ind=1,ndomain 254 246 CALL swap_dimensions(ind) 255 247 256 248 DO i=ii_begin+1,ii_end-1 257 249 CALL request_add_point(ind,i,jj_begin,req_e0_vect,right) 258 250 CALL request_add_point(ind,i,jj_end,req_e0_vect,right) 259 251 ENDDO 260 252 261 253 DO j=jj_begin+1,jj_end-1 262 254 CALL request_add_point(ind,ii_begin,j,req_e0_vect,rup) 263 255 CALL request_add_point(ind,ii_end,j,req_e0_vect,rup) 264 ENDDO 256 ENDDO 265 257 266 258 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e0_vect,left) … … 268 260 CALL request_add_point(ind,ii_begin+1,jj_end,req_e0_vect,left) 269 261 CALL request_add_point(ind,ii_end,jj_begin+1,req_e0_vect,ldown) 270 271 ENDDO 262 263 ENDDO 272 264 273 265 CALL finalize_request(req_e0_vect) … … 283 275 DO j=jj_begin,jj_end 284 276 CALL request_add_point(ind,ii_end+1,j,req_z1_scal,vlup) 285 ENDDO 277 ENDDO 286 278 DO j=jj_begin,jj_end 287 279 CALL request_add_point(ind,ii_end+1,j-1,req_z1_scal,vup) 288 ENDDO 289 280 ENDDO 281 290 282 DO i=ii_begin,ii_end 291 283 CALL request_add_point(ind,i,jj_end+1,req_z1_scal,vdown) 292 284 CALL request_add_point(ind,i-1,jj_end+1,req_z1_scal,vrdown) 293 ENDDO 285 ENDDO 294 286 295 287 DO j=jj_begin,jj_end 296 288 CALL request_add_point(ind,ii_begin-1,j,req_z1_scal,vrup) 297 ENDDO 289 ENDDO 298 290 DO j=jj_begin,jj_end 299 291 CALL request_add_point(ind,ii_begin-1,j,req_z1_scal,vrdown) 300 ENDDO 292 ENDDO 301 293 302 294 ENDDO … … 305 297 306 298 END SUBROUTINE init_transfert 307 299 308 300 SUBROUTINE create_request(type_field,request,vector) 309 301 USE domain_mod … … 313 305 TYPE(t_request),POINTER :: request(:) 314 306 LOGICAL,OPTIONAL :: vector 315 307 316 308 TYPE(t_request),POINTER :: req 317 309 TYPE(t_domain),POINTER :: d 318 310 INTEGER :: ind 319 311 INTEGER :: max_size 320 312 321 313 ALLOCATE(request(ndomain)) 322 314 … … 346 338 ALLOCATE(req%target_sign(req%max_size)) 347 339 ENDDO 348 340 349 341 END SUBROUTINE create_request 350 342 … … 352 344 IMPLICIT NONE 353 345 TYPE(t_request),POINTER :: req 354 346 355 347 INTEGER,POINTER :: src_domain(:) 356 348 INTEGER,POINTER :: src_ind(:) … … 380 372 ALLOCATE(req%target_j(req%max_size*2)) 381 373 ALLOCATE(req%target_sign(req%max_size*2)) 382 374 383 375 req%src_domain(1:req%max_size)=src_domain(:) 384 376 req%src_ind(1:req%max_size)=src_ind(:) … … 389 381 req%target_j(1:req%max_size)=target_j(:) 390 382 req%target_sign(1:req%max_size)=target_sign(:) 391 383 392 384 req%max_size=req%max_size*2 393 385 394 386 DEALLOCATE(src_domain) 395 387 DEALLOCATE(src_ind) … … 403 395 END SUBROUTINE reallocate_request 404 396 405 397 406 398 SUBROUTINE request_add_point(ind,i,j,request,pos) 407 399 USE domain_mod … … 413 405 TYPE(t_request),POINTER :: request(:) 414 406 INTEGER,INTENT(IN),OPTIONAL :: pos 415 407 416 408 INTEGER :: src_domain 417 409 INTEGER :: src_iim,src_i,src_j,src_n,src_pos,src_delta 418 410 TYPE(t_request),POINTER :: req 419 411 TYPE(t_domain),POINTER :: d 420 412 421 413 req=>request(ind) 422 414 d=>domain(ind) 423 415 424 416 IF (req%max_size==req%size) CALL reallocate_request(req) 425 417 req%size=req%size+1 … … 444 436 src_delta=domain(ind)%delta(i,j) 445 437 src_pos=domain(ind)%edge_assign_pos(pos-1,i,j)+1 446 438 447 439 req%target_ind(req%size)=(j-1)*d%iim+i+d%u_pos(pos) 448 440 … … 464 456 src_pos=domain(ind)%vertex_assign_pos(pos-1,i,j)+1 465 457 466 458 467 459 req%target_ind(req%size)=(j-1)*d%iim+i+d%z_pos(pos) 468 460 req%target_sign(req%size)=1 … … 471 463 ENDIF 472 464 END SUBROUTINE request_add_point 473 474 465 466 475 467 SUBROUTINE Finalize_request(request) 476 468 USE mpipara … … 497 489 LOGICAL,PARAMETER :: debug = .FALSE. 498 490 499 491 500 492 IF (.NOT. using_mpi) RETURN 501 493 502 494 DO ind_loc=1,ndomain 503 495 req=>request(ind_loc) 504 496 505 497 nb_data_domain_recv(:) = 0 506 498 nb_domain_recv(:) = 0 507 499 tag_rank(:)=0 508 500 509 501 DO i=1,req%size 510 502 ind_glo=req%src_domain(i) 511 503 nb_data_domain_recv(ind_glo)=nb_data_domain_recv(ind_glo)+1 512 504 ENDDO 513 505 514 506 DO ind_glo=1,ndomain_glo 515 507 IF ( nb_data_domain_recv(ind_glo) > 0 ) nb_domain_recv(domglo_rank(ind_glo))=nb_domain_recv(domglo_rank(ind_glo))+1 … … 532 524 ENDIF 533 525 ENDDO 534 526 535 527 req%recv(:)%size=0 536 528 irecv=0 … … 545 537 ENDDO 546 538 547 nb_domain_recv(:) = 0 539 nb_domain_recv(:) = 0 548 540 DO ind_loc=1,ndomain 549 541 req=>request(ind_loc) 550 542 551 543 DO irecv=1,req%nrecv 552 544 rank=req%recv(irecv)%rank … … 554 546 ENDDO 555 547 ENDDO 556 557 CALL MPI_Alltoall(nb_domain_recv,1,MPI_INTEGER,nb_domain_send,1,MPI_INTEGER,comm_icosa,ierr) 558 548 549 CALL MPI_Alltoall(nb_domain_recv,1,MPI_INTEGER,nb_domain_send,1,MPI_INTEGER,comm_icosa,ierr) 550 559 551 560 552 ALLOCATE(list_domain_send(sum(nb_domain_send))) 561 553 562 554 nreq=sum(nb_domain_recv(:))+sum(nb_domain_send(:)) 563 555 ALLOCATE(mpi_req(nreq)) 564 556 ALLOCATE(status(MPI_STATUS_SIZE,nreq)) 565 557 566 558 567 559 ireq=0 … … 575 567 ENDDO 576 568 577 IF (debug) PRINT *,"------------" 569 IF (debug) PRINT *,"------------" 578 570 j=0 579 571 DO rank=0,mpi_size-1 … … 585 577 ENDDO 586 578 ENDDO 587 IF (debug) PRINT *,"------------" 588 579 IF (debug) PRINT *,"------------" 580 589 581 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 590 582 591 583 list_domain(:)=0 592 584 DO i=1,sum(nb_domain_send) … … 594 586 list_domain(ind_loc)=list_domain(ind_loc)+1 595 587 ENDDO 596 588 597 589 DO ind_loc=1,ndomain 598 590 req=>request(ind_loc) … … 601 593 ENDDO 602 594 603 IF (debug) PRINT *,"------------" 604 605 ireq=0 595 IF (debug) PRINT *,"------------" 596 597 ireq=0 606 598 DO ind_loc=1,ndomain 607 599 req=>request(ind_loc) 608 600 609 601 DO irecv=1,req%nrecv 610 602 ireq=ireq+1 … … 612 604 IF (debug) PRINT *,"Isend ",mpi_rank, "from ", mpi_rank, "to ",req%recv(irecv)%rank,"tag ",req%recv(irecv)%domain 613 605 ENDDO 614 IF (debug) PRINT *,"------------" 615 606 IF (debug) PRINT *,"------------" 607 616 608 DO isend=1,req%nsend 617 609 ireq=ireq+1 … … 621 613 ENDDO 622 614 623 IF (debug) PRINT *,"------------" 615 IF (debug) PRINT *,"------------" 624 616 625 617 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 626 618 CALL MPI_BARRIER(comm_icosa,ierr) 627 619 628 IF (debug) PRINT *,"------------" 629 630 ireq=0 620 IF (debug) PRINT *,"------------" 621 622 ireq=0 631 623 DO ind_loc=1,ndomain 632 624 req=>request(ind_loc) 633 625 634 626 DO irecv=1,req%nrecv 635 627 ireq=ireq+1 … … 638 630 ENDDO 639 631 640 IF (debug) PRINT *,"------------" 641 632 IF (debug) PRINT *,"------------" 633 642 634 DO isend=1,req%nsend 643 635 ireq=ireq+1 … … 646 638 ENDDO 647 639 ENDDO 648 IF (debug) PRINT *,"------------" 649 640 IF (debug) PRINT *,"------------" 641 650 642 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 651 643 CALL MPI_BARRIER(comm_icosa,ierr) 652 IF (debug) PRINT *,"------------" 644 IF (debug) PRINT *,"------------" 653 645 654 646 ireq=0 655 647 DO ind_loc=1,ndomain 656 648 req=>request(ind_loc) 657 649 658 650 DO irecv=1,req%nrecv 659 651 ireq=ireq+1 … … 663 655 IF (debug) PRINT *,"Isend ",req%recv(irecv)%tag, "from ", mpi_rank, "to ",req%recv(irecv)%rank,"tag ",req%recv(irecv)%domain 664 656 ENDDO 665 IF (debug) PRINT *,"------------" 666 657 IF (debug) PRINT *,"------------" 658 667 659 DO isend=1,req%nsend 668 660 ireq=ireq+1 … … 671 663 ENDDO 672 664 ENDDO 673 IF (debug) PRINT *,"------------" 674 665 IF (debug) PRINT *,"------------" 666 675 667 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 676 668 CALL MPI_BARRIER(comm_icosa,ierr) 677 669 678 670 679 IF (debug) PRINT *,"------------" 680 681 ireq=0 671 IF (debug) PRINT *,"------------" 672 673 ireq=0 682 674 DO ind_loc=1,ndomain 683 675 req=>request(ind_loc) 684 676 685 677 DO irecv=1,req%nrecv 686 678 ireq=ireq+1 … … 688 680 IF (debug) PRINT *,"Isend ",req%recv(irecv)%size, "from ", mpi_rank, "to ",req%recv(irecv)%rank,"tag ",req%recv(irecv)%domain 689 681 ENDDO 690 IF (debug) PRINT *,"------------" 691 682 IF (debug) PRINT *,"------------" 683 692 684 DO isend=1,req%nsend 693 685 ireq=ireq+1 … … 699 691 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 700 692 701 ireq=0 693 ireq=0 702 694 DO ind_loc=1,ndomain 703 695 req=>request(ind_loc) 704 696 705 697 DO irecv=1,req%nrecv 706 698 ireq=ireq+1 … … 708 700 req%recv(irecv)%rank,req%recv(irecv)%tag,comm_icosa, mpi_req(ireq),ierr) 709 701 ENDDO 710 702 711 703 DO isend=1,req%nsend 712 704 ireq=ireq+1 … … 721 713 DO ind_loc=1,ndomain 722 714 req=>request(ind_loc) 723 715 724 716 DO irecv=1,req%nrecv 725 717 req%recv(irecv)%value(:)=req%recv(irecv)%buffer(:) … … 727 719 DEALLOCATE(req%recv(irecv)%buffer) 728 720 ENDDO 729 ENDDO 730 721 ENDDO 722 731 723 732 724 ! domain is on the same mpi process => copie memory to memory 733 725 734 726 DO ind_loc=1,ndomain 735 727 req=>request(ind_loc) 736 728 737 729 DO irecv=1,req%nrecv 738 730 739 731 IF (req%recv(irecv)%rank==mpi_rank) THEN 740 732 req_src=>request(req%recv(irecv)%domain) … … 749 741 ENDDO 750 742 ENDIF 751 743 752 744 ENDDO 753 745 ENDDO 754 746 755 747 ! true number of mpi request 756 748 … … 761 753 ALLOCATE(offset(sum(request(:)%nsend))) 762 754 offset(:)=0 763 755 764 756 nsend=0 765 757 DO ind_loc=1,ndomain … … 773 765 pos=pos+1 774 766 ENDDO 775 767 776 768 IF (pos==nsend) THEN 777 769 nsend=nsend+1 … … 784 776 ENDIF 785 777 ENDIF 786 778 787 779 pos=pos+1 788 780 req%send(isend)%ireq=pos … … 795 787 DEALLOCATE(rank_list) 796 788 DEALLOCATE(offset) 797 789 798 790 ALLOCATE(rank_list(sum(request(:)%nrecv))) 799 791 ALLOCATE(offset(sum(request(:)%nrecv))) 800 792 offset(:)=0 801 793 802 794 nrecv=0 803 795 DO ind_loc=1,ndomain … … 811 803 pos=pos+1 812 804 ENDDO 813 805 814 806 IF (pos==nrecv) THEN 815 807 nrecv=nrecv+1 … … 822 814 ENDIF 823 815 ENDIF 824 816 825 817 pos=pos+1 826 818 req%recv(irecv)%ireq=nsend+pos … … 829 821 ENDIF 830 822 ENDDO 831 ENDDO 832 833 ! get the offsets 834 835 ireq=0 823 ENDDO 824 825 ! get the offsets 826 827 ireq=0 836 828 DO ind_loc=1,ndomain 837 829 req=>request(ind_loc) 838 830 839 831 DO irecv=1,req%nrecv 840 832 ireq=ireq+1 … … 842 834 req%recv(irecv)%rank,req%recv(irecv)%tag,comm_icosa, mpi_req(ireq),ierr) 843 835 ENDDO 844 836 845 837 DO isend=1,req%nsend 846 838 ireq=ireq+1 … … 851 843 852 844 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 853 854 855 END SUBROUTINE Finalize_request 845 846 847 END SUBROUTINE Finalize_request 856 848 857 849 … … 867 859 TYPE(t_message) :: message 868 860 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: name 869 !$OMP MASTER 861 !$OMP MASTER 870 862 message%request=>request 871 863 IF(PRESENT(name)) THEN … … 874 866 message%name = 'unknown' 875 867 END IF 876 !$OMP END MASTER 877 !$OMP BARRIER 868 !$OMP END MASTER 869 !$OMP BARRIER 878 870 879 871 END SUBROUTINE init_message_seq … … 891 883 892 884 CALL transfert_request_seq(field,message%request) 893 885 894 886 END SUBROUTINE send_message_seq 895 887 896 888 SUBROUTINE test_message_seq(message) 897 889 IMPLICIT NONE 898 890 TYPE(t_message) :: message 899 891 END SUBROUTINE test_message_seq 900 901 892 893 902 894 SUBROUTINE wait_message_seq(message) 903 895 IMPLICIT NONE 904 896 TYPE(t_message) :: message 905 906 END SUBROUTINE wait_message_seq 907 908 SUBROUTINE transfert_message_seq(field,message) 909 USE field_mod 910 USE domain_mod 911 USE mpi_mod 912 USE mpipara 913 USE omp_para 914 USE trace 915 IMPLICIT NONE 916 TYPE(t_field),POINTER :: field(:) 917 TYPE(t_message) :: message 918 919 CALL send_message_seq(field,message) 920 921 END SUBROUTINE transfert_message_seq 922 923 924 925 897 898 END SUBROUTINE wait_message_seq 899 926 900 SUBROUTINE init_message_mpi(field,request, message, name) 927 901 USE field_mod … … 931 905 USE mpi_mod 932 906 IMPLICIT NONE 933 907 934 908 TYPE(t_field),POINTER :: field(:) 935 909 TYPE(t_request),POINTER :: request(:) … … 960 934 IF (message_number==100) message_number=0 961 935 962 936 963 937 message%request=>request 964 938 message%nreq=sum(message%request(:)%nreq_mpi) … … 979 953 DO isend=1,req%nsend 980 954 IF (req%send(isend)%rank/=mpi_rank) THEN 981 ireq=req%send(isend)%ireq 955 ireq=req%send(isend)%ireq 982 956 message%buffers(ireq)%size=message%buffers(ireq)%size+req%send(isend)%size 983 957 message%buffers(ireq)%rank=req%send(isend)%rank … … 986 960 DO irecv=1,req%nrecv 987 961 IF (req%recv(irecv)%rank/=mpi_rank) THEN 988 ireq=req%recv(irecv)%ireq 962 ireq=req%recv(irecv)%ireq 989 963 message%buffers(ireq)%size=message%buffers(ireq)%size+req%recv(irecv)%size 990 964 message%buffers(ireq)%rank=req%recv(irecv)%rank … … 997 971 998 972 IF (field(1)%ndim==2) THEN 999 973 1000 974 DO ireq=1,message%nreq 1001 975 CALL allocate_mpi_buffer(message%buffers(ireq)%r,message%buffers(ireq)%size) 1002 976 ENDDO 1003 977 1004 978 ELSE IF (field(1)%ndim==3) THEN 1005 979 1006 980 dim3=size(field(1)%rval3d,2) 1007 981 DO ireq=1,message%nreq … … 1009 983 CALL allocate_mpi_buffer(message%buffers(ireq)%r,message%buffers(ireq)%size) 1010 984 ENDDO 1011 985 1012 986 ELSE IF (field(1)%ndim==4) THEN 1013 987 dim3=size(field(1)%rval4d,2) … … 1017 991 CALL allocate_mpi_buffer(message%buffers(ireq)%r,message%buffers(ireq)%size) 1018 992 ENDDO 1019 ENDIF 993 ENDIF 1020 994 ENDIF 1021 1022 1023 995 996 997 1024 998 ! ! Reorder the request, so recv request are done in the same order than send request 1025 999 1026 ! nreq_send=sum(request(:)%nsend) 1000 ! nreq_send=sum(request(:)%nsend) 1027 1001 ! message%nreq_send=nreq_send 1028 1002 ! ALLOCATE(message%reorder(nreq_send)) … … 1050 1024 ! ENDDO 1051 1025 ! PRINT *,"reorder ",reorder(:)%tag 1052 1053 1026 1027 1054 1028 !$OMP END MASTER 1055 !$OMP BARRIER 1029 !$OMP BARRIER 1056 1030 1057 1031 END SUBROUTINE init_message_mpi 1058 1059 SUBROUTINE Finalize_message_mpi( field,message)1032 1033 SUBROUTINE Finalize_message_mpi(message) 1060 1034 USE field_mod 1061 1035 USE domain_mod … … 1064 1038 USE mpi_mod 1065 1039 IMPLICIT NONE 1066 TYPE(t_field),POINTER :: field(:)1067 1040 TYPE(t_message) :: message 1068 1041 … … 1076 1049 DO ireq=1,message%nreq 1077 1050 CALL free_mpi_buffer(message%buffers(ireq)%r) 1078 ENDDO 1051 ENDDO 1079 1052 ENDIF 1080 1053 … … 1110 1083 !$OMP BARRIER 1111 1084 1112 1085 1113 1086 END SUBROUTINE Finalize_message_mpi 1114 1115 1116 1117 SUBROUTINE barrier1118 USE mpi_mod1119 USE mpipara1120 IMPLICIT NONE1121 1122 CALL MPI_BARRIER(comm_icosa,ierr)1123 1124 END SUBROUTINE barrier1125 1126 SUBROUTINE transfert_message_mpi(field,message)1127 USE field_mod1128 IMPLICIT NONE1129 TYPE(t_field),POINTER :: field(:)1130 TYPE(t_message) :: message1131 1132 CALL send_message_mpi(field,message)1133 CALL wait_message_mpi(message)1134 1135 END SUBROUTINE transfert_message_mpi1136 1087 1137 1088 … … 1184 1135 TYPE(t_field),POINTER :: field(:) 1185 1136 TYPE(t_message) :: message 1186 REAL(rstd),POINTER :: rval2d(:), src_rval2d(:) 1187 REAL(rstd),POINTER :: rval3d(:,:), src_rval3d(:,:) 1188 REAL(rstd),POINTER :: rval4d(:,:,:), src_rval4d(:,:,:) 1189 REAL(rstd),POINTER :: buffer_r(:) 1190 INTEGER,POINTER :: value(:) 1191 INTEGER,POINTER :: sgn(:) 1192 TYPE(ARRAY),POINTER :: recv,send 1137 REAL(rstd),POINTER :: rval2d(:), src_rval2d(:) 1138 REAL(rstd),POINTER :: rval3d(:,:), src_rval3d(:,:) 1139 REAL(rstd),POINTER :: rval4d(:,:,:), src_rval4d(:,:,:) 1140 REAL(rstd),POINTER :: buffer_r(:) 1141 INTEGER,POINTER :: value(:) 1142 INTEGER,POINTER :: sgn(:) 1143 TYPE(ARRAY),POINTER :: recv,send 1193 1144 TYPE(t_request),POINTER :: req 1194 1145 INTEGER :: irecv,isend … … 1240 1191 DO ind=1,ndomain 1241 1192 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE 1242 1193 1243 1194 rval2d=>field(ind)%rval2d 1244 1195 1245 1196 req=>message%request(ind) 1246 1197 DO isend=1,req%nsend … … 1248 1199 value=>send%value 1249 1200 1250 1201 1251 1202 IF (send%rank/=mpi_rank) THEN 1252 1203 ireq=send%ireq … … 1264 1215 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1265 1216 CALL abort_acc("mpi_threading_mode==MPI_THREAD_SERIALIZED") 1266 !$OMP CRITICAL 1217 !$OMP CRITICAL 1267 1218 CALL MPI_ISEND(buffer_r,send%size,MPI_REAL8,send%rank, & 1268 1219 send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) … … 1273 1224 send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1274 1225 ENDIF 1275 1226 1276 1227 ENDIF 1277 1228 ENDDO 1278 1229 ENDDO 1279 1230 1280 1231 DO ind=1,ndomain 1281 1232 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE 1282 1233 rval2d=>field(ind)%rval2d 1283 req=>message%request(ind) 1234 req=>message%request(ind) 1284 1235 1285 1236 DO irecv=1,req%nrecv … … 1301 1252 1302 1253 ELSE 1303 1254 1304 1255 ireq=recv%ireq 1305 1256 buffer_r=>message%buffers(ireq)%r 1306 1257 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1307 1258 CALL abort_acc("mpi_threading_mode==MPI_THREAD_SERIALIZED") 1308 !$OMP CRITICAL 1259 !$OMP CRITICAL 1309 1260 CALL MPI_IRECV(buffer_r,recv%size,MPI_REAL8,recv%rank, & 1310 1261 recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) … … 1315 1266 recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1316 1267 ENDIF 1317 1268 1318 1269 ENDIF 1319 1270 ENDDO 1320 1271 1321 1272 ENDDO 1322 1323 1273 1274 1324 1275 ELSE IF (field(1)%ndim==3) THEN 1325 1276 max_req=0 … … 1328 1279 IF (req%nsend>max_req) max_req=req%nsend 1329 1280 ENDDO 1330 1281 1331 1282 DO ind=1,ndomain 1332 1283 IF (.NOT. assigned_domain(ind) ) CYCLE … … 1337 1288 rval3d=>field(ind)%rval3d 1338 1289 req=>message%request(ind) 1339 1290 1340 1291 DO isend=1,req%nsend 1341 1292 send=>req%send(isend) … … 1366 1317 1367 1318 ENDIF 1368 1319 1369 1320 IF (is_omp_level_master) THEN 1370 1321 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1371 1322 CALL abort_acc("mpi_threading_mode==MPI_THREAD_SERIALIZED") 1372 !$OMP CRITICAL 1323 !$OMP CRITICAL 1373 1324 CALL MPI_ISEND(buffer_r,send%size*dim3,MPI_REAL8,send%rank, & 1374 1325 send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) … … 1400 1351 1401 1352 ENDDO 1402 1353 1403 1354 DO ind=1,ndomain 1404 1355 IF (.NOT. assigned_domain(ind) ) CYCLE … … 1432 1383 ireq=recv%ireq 1433 1384 buffer_r=>message%buffers(ireq)%r 1434 1385 1435 1386 IF (is_omp_level_master) THEN 1436 1387 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN … … 1446 1397 ENDIF 1447 1398 ENDIF 1448 ENDIF 1399 ENDIF 1449 1400 ENDDO 1450 1401 1451 1402 ENDDO 1452 1403 … … 1458 1409 IF (req%nsend>max_req) max_req=req%nsend 1459 1410 ENDDO 1460 1411 1461 1412 DO ind=1,ndomain 1462 1413 IF (.NOT. assigned_domain(ind) ) CYCLE … … 1524 1475 ENDIF 1525 1476 ENDDO 1526 1477 1527 1478 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED.OR.mpi_threading_mode==MPI_THREAD_MULTIPLE .AND. omp_level_size>1) THEN 1528 1479 DO isend=req%nsend+1,max_req … … 1535 1486 1536 1487 ENDDO 1537 1488 1538 1489 DO ind=1,ndomain 1539 1490 IF (.NOT. assigned_domain(ind) ) CYCLE 1540 1491 1541 1492 dim3=size(field(ind)%rval4d,2) 1542 1493 CALL distrib_level(1,dim3, lbegin,lend) … … 1565 1516 call exit_profile(profile_mpi_copies) 1566 1517 CALL trace_end("copy_data") 1567 1518 1568 1519 ELSE 1569 1520 … … 1573 1524 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1574 1525 CALL abort_acc("mpi_threading_mode==MPI_THREAD_SERIALIZED") 1575 !$OMP CRITICAL 1526 !$OMP CRITICAL 1576 1527 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank, & 1577 recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1528 recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1578 1529 !$OMP END CRITICAL 1579 1530 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1580 1531 CALL abort_acc("mpi_threading_mode==MPI_THREAD_MULTIPLE") 1581 1532 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank, & 1582 recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1533 recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1583 1534 ENDIF 1584 1535 ENDIF … … 1587 1538 ENDDO 1588 1539 1589 ENDIF 1540 ENDIF 1590 1541 1591 1542 IF (mpi_threading_mode==MPI_THREAD_FUNNELED .OR. mpi_threading_mode==MPI_THREAD_SINGLE) THEN … … 1629 1580 1630 1581 !$OMP END MASTER 1631 ENDIF 1582 ENDIF 1632 1583 ENDIF 1633 1584 CALL enter_profile(profile_mpi_omp_barrier) … … 1638 1589 1639 1590 CALL exit_profile(id_mpi) 1640 1591 1641 1592 END SUBROUTINE send_message_mpi 1642 1593 1643 1594 SUBROUTINE test_message_mpi(message) 1644 1595 IMPLICIT NONE 1645 1596 TYPE(t_message) :: message 1646 1597 1647 1598 INTEGER :: ierr 1648 1599 … … 1652 1603 !$OMP END MASTER 1653 1604 END SUBROUTINE test_message_mpi 1654 1655 1605 1606 1656 1607 SUBROUTINE wait_message_mpi(message) 1657 1608 USE profiling_mod … … 1666 1617 1667 1618 TYPE(t_field),POINTER :: field(:) 1668 REAL(rstd),POINTER :: rval2d(:) 1669 REAL(rstd),POINTER :: rval3d(:,:) 1670 REAL(rstd),POINTER :: rval4d(:,:,:) 1671 REAL(rstd),POINTER :: buffer_r(:) 1672 INTEGER,POINTER :: value(:) 1673 INTEGER,POINTER :: sgn(:) 1674 TYPE(ARRAY),POINTER :: recv 1619 REAL(rstd),POINTER :: rval2d(:) 1620 REAL(rstd),POINTER :: rval3d(:,:) 1621 REAL(rstd),POINTER :: rval4d(:,:,:) 1622 REAL(rstd),POINTER :: buffer_r(:) 1623 INTEGER,POINTER :: value(:) 1624 INTEGER,POINTER :: sgn(:) 1625 TYPE(ARRAY),POINTER :: recv 1675 1626 TYPE(t_request),POINTER :: req 1676 1627 INTEGER :: irecv … … 1689 1640 field=>message%field 1690 1641 nreq=message%nreq 1691 1642 1692 1643 IF (field(1)%data_type==type_real) THEN 1693 1644 IF (field(1)%ndim==2) THEN … … 1703 1654 DO ind=1,ndomain 1704 1655 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE 1705 1656 1706 1657 rval2d=>field(ind)%rval2d 1707 1658 req=>message%request(ind) … … 1717 1668 !$acc parallel loop default(present) async if (field(ind)%ondevice) 1718 1669 DO n=1,msize 1719 rval2d(value(n))=buffer_r(n+offset)*sgn(n) 1670 rval2d(value(n))=buffer_r(n+offset)*sgn(n) 1720 1671 ENDDO 1721 1672 1722 1673 ENDIF 1723 1674 ENDDO 1724 1675 1725 1676 ENDDO 1726 1677 call exit_profile(profile_mpi_copies) … … 1736 1687 call exit_profile(profile_mpi_waitall) 1737 1688 1738 1689 1739 1690 DO ind=1,ndomain 1740 1691 IF (.NOT. assigned_domain(ind) ) CYCLE … … 1749 1700 value=>recv%value 1750 1701 sgn=>recv%sign 1751 1702 1752 1703 dim3=size(rval3d,2) 1753 1704 1754 1705 CALL distrib_level(1,dim3, lbegin,lend) 1755 1706 msize=recv%size … … 1757 1708 call enter_profile(profile_mpi_copies) 1758 1709 CALL trace_start("copy_from_buffer") 1759 1710 1760 1711 IF (req%vector) THEN 1761 1712 !$acc parallel loop default(present) async if (field(ind)%ondevice) … … 1764 1715 !$acc loop 1765 1716 DO n=1,msize 1766 rval3d(value(n),d3)=buffer_r(n+offset)*sgn(n) 1717 rval3d(value(n),d3)=buffer_r(n+offset)*sgn(n) 1767 1718 ENDDO 1768 1719 ENDDO … … 1773 1724 !$acc loop 1774 1725 DO n=1,msize 1775 rval3d(value(n),d3)=buffer_r(n+offset) 1726 rval3d(value(n),d3)=buffer_r(n+offset) 1776 1727 ENDDO 1777 1728 ENDDO 1778 1729 ENDIF 1779 1730 1780 1731 CALL trace_end("copy_from_buffer") 1781 1732 call exit_profile(profile_mpi_copies) 1782 1733 ENDIF 1783 1734 ENDDO 1784 1735 1785 1736 ENDDO 1786 1737 … … 1794 1745 call exit_profile(profile_mpi_waitall) 1795 1746 1796 1747 1797 1748 DO ind=1,ndomain 1798 1749 IF (.NOT. assigned_domain(ind) ) CYCLE … … 1822 1773 !$acc loop 1823 1774 DO n=1,msize 1824 rval4d(value(n),d3,d4)=buffer_r(n+offset)*sgn(n) 1775 rval4d(value(n),d3,d4)=buffer_r(n+offset)*sgn(n) 1825 1776 ENDDO 1826 1777 ENDDO … … 1830 1781 ENDIF 1831 1782 ENDDO 1832 1783 1833 1784 ENDDO 1834 1835 ENDIF 1836 1785 1786 ENDIF 1787 1837 1788 ENDIF 1838 1789 … … 1843 1794 ! CALL trace_end("wait_message_mpi") 1844 1795 !$OMP BARRIER 1845 1796 1846 1797 CALL exit_profile(id_mpi) 1847 1798 1848 1799 END SUBROUTINE wait_message_mpi 1849 1800 1850 SUBROUTINE transfert_request_mpi(field,request) 1851 USE field_mod 1852 IMPLICIT NONE 1853 TYPE(t_field),POINTER :: field(:) 1854 TYPE(t_request),POINTER :: request(:) 1855 1856 TYPE(t_message),SAVE :: message 1857 1858 1859 CALL init_message_mpi(field,request, message) 1860 CALL transfert_message_mpi(field,message) 1861 CALL finalize_message_mpi(field,message) 1862 1863 END SUBROUTINE transfert_request_mpi 1864 1865 1866 1801 1867 1802 SUBROUTINE transfert_request_seq(field,request) 1868 1803 USE field_mod … … 1871 1806 TYPE(t_field),POINTER :: field(:) 1872 1807 TYPE(t_request),POINTER :: request(:) 1873 REAL(rstd),POINTER :: rval2d(:) 1874 REAL(rstd),POINTER :: rval3d(:,:) 1875 REAL(rstd),POINTER :: rval4d(:,:,:) 1808 REAL(rstd),POINTER :: rval2d(:) 1809 REAL(rstd),POINTER :: rval3d(:,:) 1810 REAL(rstd),POINTER :: rval4d(:,:,:) 1876 1811 INTEGER :: ind 1877 1812 TYPE(t_request),POINTER :: req 1878 1813 INTEGER :: n 1879 1814 1880 1815 DO ind=1,ndomain 1881 1816 req=>request(ind) … … 1883 1818 rval3d=>field(ind)%rval3d 1884 1819 rval4d=>field(ind)%rval4d 1885 1820 1886 1821 IF (field(ind)%data_type==type_real) THEN 1887 1822 IF (field(ind)%ndim==2) THEN … … 1901 1836 ENDDO 1902 1837 ENDIF 1903 ENDIF 1838 ENDIF 1904 1839 1905 1840 ENDDO 1906 1841 1907 1842 END SUBROUTINE transfert_request_seq 1908 1909 1910 SUBROUTINE gather_field(field_loc,field_glo) 1911 USE field_mod 1912 USE domain_mod 1913 USE mpi_mod 1914 USE mpipara 1915 IMPLICIT NONE 1916 TYPE(t_field),POINTER :: field_loc(:) 1917 TYPE(t_field),POINTER :: field_glo(:) 1918 INTEGER, ALLOCATABLE :: mpi_req(:) 1919 INTEGER, ALLOCATABLE :: status(:,:) 1920 INTEGER :: ireq,nreq 1921 INTEGER :: ind_glo,ind_loc 1922 1923 IF (.NOT. using_mpi) THEN 1924 1925 DO ind_loc=1,ndomain 1926 IF (field_loc(ind_loc)%ndim==2) field_glo(ind_loc)%rval2d=field_loc(ind_loc)%rval2d 1927 IF (field_loc(ind_loc)%ndim==3) field_glo(ind_loc)%rval3d=field_loc(ind_loc)%rval3d 1928 IF (field_loc(ind_loc)%ndim==4) field_glo(ind_loc)%rval4d=field_loc(ind_loc)%rval4d 1929 ENDDO 1930 1931 ELSE 1932 1933 nreq=ndomain 1934 IF (mpi_rank==0) nreq=nreq+ndomain_glo 1935 ALLOCATE(mpi_req(nreq)) 1936 ALLOCATE(status(MPI_STATUS_SIZE,nreq)) 1937 1938 1939 ireq=0 1940 IF (mpi_rank==0) THEN 1941 DO ind_glo=1,ndomain_glo 1942 ireq=ireq+1 1943 1944 IF (field_glo(ind_glo)%ndim==2) THEN 1945 CALL MPI_IRECV(field_glo(ind_glo)%rval2d,size(field_glo(ind_glo)%rval2d) , MPI_REAL8 , & 1946 domglo_rank(ind_glo),domglo_loc_ind(ind_glo), comm_icosa, mpi_req(ireq), ierr) 1947 1948 ELSE IF (field_glo(ind_glo)%ndim==3) THEN 1949 CALL MPI_IRECV(field_glo(ind_glo)%rval3d,size(field_glo(ind_glo)%rval3d) , MPI_REAL8 , & 1950 domglo_rank(ind_glo),domglo_loc_ind(ind_glo), comm_icosa, mpi_req(ireq), ierr) 1951 1952 ELSE IF (field_glo(ind_glo)%ndim==4) THEN 1953 CALL MPI_IRECV(field_glo(ind_glo)%rval4d,size(field_glo(ind_glo)%rval4d) , MPI_REAL8 , & 1954 domglo_rank(ind_glo),domglo_loc_ind(ind_glo), comm_icosa, mpi_req(ireq), ierr) 1955 ENDIF 1956 1957 ENDDO 1958 ENDIF 1959 1960 DO ind_loc=1,ndomain 1961 ireq=ireq+1 1962 1963 IF (field_loc(ind_loc)%ndim==2) THEN 1964 CALL MPI_ISEND(field_loc(ind_loc)%rval2d,size(field_loc(ind_loc)%rval2d) , MPI_REAL8 , & 1965 0, ind_loc, comm_icosa, mpi_req(ireq), ierr) 1966 ELSE IF (field_loc(ind_loc)%ndim==3) THEN 1967 CALL MPI_ISEND(field_loc(ind_loc)%rval3d,size(field_loc(ind_loc)%rval3d) , MPI_REAL8 , & 1968 0, ind_loc, comm_icosa, mpi_req(ireq), ierr) 1969 ELSE IF (field_loc(ind_loc)%ndim==4) THEN 1970 CALL MPI_ISEND(field_loc(ind_loc)%rval4d,size(field_loc(ind_loc)%rval4d) , MPI_REAL8 , & 1971 0, ind_loc, comm_icosa, mpi_req(ireq), ierr) 1972 ENDIF 1973 1974 ENDDO 1975 1976 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 1977 1978 ENDIF 1979 1980 END SUBROUTINE gather_field 1981 1982 SUBROUTINE bcast_field(field_glo) 1983 USE field_mod 1984 USE domain_mod 1985 USE mpi_mod 1986 USE mpipara 1987 IMPLICIT NONE 1988 TYPE(t_field),POINTER :: field_glo(:) 1989 INTEGER :: ind_glo 1990 1991 IF (.NOT. using_mpi) THEN 1992 1993 ! nothing to do 1994 1995 ELSE 1996 1997 DO ind_glo=1,ndomain_glo 1998 1999 IF (field_glo(ind_glo)%ndim==2) THEN 2000 CALL MPI_BCAST(field_glo(ind_glo)%rval2d, size(field_glo(ind_glo)%rval2d) , MPI_REAL8, 0, comm_icosa, ierr) 2001 ELSE IF (field_glo(ind_glo)%ndim==3) THEN 2002 CALL MPI_BCAST(field_glo(ind_glo)%rval3d, size(field_glo(ind_glo)%rval3d) , MPI_REAL8, 0, comm_icosa, ierr) 2003 ELSE IF (field_glo(ind_glo)%ndim==4) THEN 2004 CALL MPI_BCAST(field_glo(ind_glo)%rval4d, size(field_glo(ind_glo)%rval4d) , MPI_REAL8, 0, comm_icosa, ierr) 2005 ENDIF 2006 2007 ENDDO 2008 ENDIF 2009 2010 END SUBROUTINE bcast_field 2011 2012 SUBROUTINE scatter_field(field_glo,field_loc) 2013 USE field_mod 2014 USE domain_mod 2015 USE mpi_mod 2016 USE mpipara 2017 IMPLICIT NONE 2018 TYPE(t_field),POINTER :: field_glo(:) 2019 TYPE(t_field),POINTER :: field_loc(:) 2020 INTEGER, ALLOCATABLE :: mpi_req(:) 2021 INTEGER, ALLOCATABLE :: status(:,:) 2022 INTEGER :: ireq,nreq 2023 INTEGER :: ind_glo,ind_loc 2024 2025 IF (.NOT. using_mpi) THEN 2026 2027 DO ind_loc=1,ndomain 2028 IF (field_loc(ind_loc)%ndim==2) field_loc(ind_loc)%rval2d=field_glo(ind_loc)%rval2d 2029 IF (field_loc(ind_loc)%ndim==3) field_loc(ind_loc)%rval3d=field_glo(ind_loc)%rval3d 2030 IF (field_loc(ind_loc)%ndim==4) field_loc(ind_loc)%rval4d=field_glo(ind_loc)%rval4d 2031 ENDDO 2032 2033 ELSE 2034 2035 nreq=ndomain 2036 IF (mpi_rank==0) nreq=nreq+ndomain_glo 2037 ALLOCATE(mpi_req(nreq)) 2038 ALLOCATE(status(MPI_STATUS_SIZE,nreq)) 2039 2040 2041 ireq=0 2042 IF (mpi_rank==0) THEN 2043 DO ind_glo=1,ndomain_glo 2044 ireq=ireq+1 2045 2046 IF (field_glo(ind_glo)%ndim==2) THEN 2047 CALL MPI_ISEND(field_glo(ind_glo)%rval2d,size(field_glo(ind_glo)%rval2d) , MPI_REAL8 , & 2048 domglo_rank(ind_glo),domglo_loc_ind(ind_glo), comm_icosa, mpi_req(ireq), ierr) 2049 2050 ELSE IF (field_glo(ind_glo)%ndim==3) THEN 2051 CALL MPI_ISEND(field_glo(ind_glo)%rval3d,size(field_glo(ind_glo)%rval3d) , MPI_REAL8 , & 2052 domglo_rank(ind_glo),domglo_loc_ind(ind_glo), comm_icosa, mpi_req(ireq), ierr) 2053 2054 ELSE IF (field_glo(ind_glo)%ndim==4) THEN 2055 CALL MPI_ISEND(field_glo(ind_glo)%rval4d,size(field_glo(ind_glo)%rval4d) , MPI_REAL8 , & 2056 domglo_rank(ind_glo),domglo_loc_ind(ind_glo), comm_icosa, mpi_req(ireq), ierr) 2057 ENDIF 2058 2059 ENDDO 2060 ENDIF 2061 2062 DO ind_loc=1,ndomain 2063 ireq=ireq+1 2064 2065 IF (field_loc(ind_loc)%ndim==2) THEN 2066 CALL MPI_IRECV(field_loc(ind_loc)%rval2d,size(field_loc(ind_loc)%rval2d) , MPI_REAL8 , & 2067 0, ind_loc, comm_icosa, mpi_req(ireq), ierr) 2068 ELSE IF (field_loc(ind_loc)%ndim==3) THEN 2069 CALL MPI_IRECV(field_loc(ind_loc)%rval3d,size(field_loc(ind_loc)%rval3d) , MPI_REAL8 , & 2070 0, ind_loc, comm_icosa, mpi_req(ireq), ierr) 2071 ELSE IF (field_loc(ind_loc)%ndim==4) THEN 2072 CALL MPI_IRECV(field_loc(ind_loc)%rval4d,size(field_loc(ind_loc)%rval4d) , MPI_REAL8 , & 2073 0, ind_loc, comm_icosa, mpi_req(ireq), ierr) 2074 ENDIF 2075 2076 ENDDO 2077 2078 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 2079 2080 ENDIF 2081 2082 END SUBROUTINE scatter_field 2083 2084 SUBROUTINE trace_in 2085 USE trace 2086 IMPLICIT NONE 2087 2088 CALL trace_start("transfert_buffer") 2089 END SUBROUTINE trace_in 2090 2091 SUBROUTINE trace_out 2092 USE trace 2093 IMPLICIT NONE 2094 2095 CALL trace_end("transfert_buffer") 2096 END SUBROUTINE trace_out 2097 2098 2099 2100 2101 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2102 !! Definition des Broadcast --> 4D !! 2103 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2104 2105 !! -- Les chaine de charactï¿œre -- !! 2106 2107 SUBROUTINE bcast_mpi_c(var1) 2108 IMPLICIT NONE 2109 CHARACTER(LEN=*),INTENT(INOUT) :: Var1 2110 2111 CALL bcast_mpi_cgen(Var1,len(Var1)) 2112 2113 END SUBROUTINE bcast_mpi_c 2114 2115 !! -- Les entiers -- !! 2116 2117 SUBROUTINE bcast_mpi_i(var) 2118 USE mpipara 2119 IMPLICIT NONE 2120 INTEGER,INTENT(INOUT) :: Var 2121 2122 INTEGER :: var_tmp(1) 2123 2124 IF (is_mpi_master) var_tmp(1)=var 2125 CALL bcast_mpi_igen(Var_tmp,1) 2126 var=var_tmp(1) 2127 2128 END SUBROUTINE bcast_mpi_i 2129 2130 SUBROUTINE bcast_mpi_i1(var) 2131 IMPLICIT NONE 2132 INTEGER,INTENT(INOUT) :: Var(:) 2133 2134 CALL bcast_mpi_igen(Var,size(Var)) 2135 2136 END SUBROUTINE bcast_mpi_i1 2137 2138 SUBROUTINE bcast_mpi_i2(var) 2139 IMPLICIT NONE 2140 INTEGER,INTENT(INOUT) :: Var(:,:) 2141 2142 CALL bcast_mpi_igen(Var,size(Var)) 2143 2144 END SUBROUTINE bcast_mpi_i2 2145 2146 SUBROUTINE bcast_mpi_i3(var) 2147 IMPLICIT NONE 2148 INTEGER,INTENT(INOUT) :: Var(:,:,:) 2149 2150 CALL bcast_mpi_igen(Var,size(Var)) 2151 2152 END SUBROUTINE bcast_mpi_i3 2153 2154 SUBROUTINE bcast_mpi_i4(var) 2155 IMPLICIT NONE 2156 INTEGER,INTENT(INOUT) :: Var(:,:,:,:) 2157 2158 CALL bcast_mpi_igen(Var,size(Var)) 2159 2160 END SUBROUTINE bcast_mpi_i4 2161 2162 2163 !! -- Les reels -- !! 2164 2165 SUBROUTINE bcast_mpi_r(var) 2166 USE mpipara 2167 IMPLICIT NONE 2168 REAL,INTENT(INOUT) :: Var 2169 REAL :: var_tmp(1) 2170 2171 IF (is_mpi_master) var_tmp(1)=var 2172 CALL bcast_mpi_rgen(Var_tmp,1) 2173 var=var_tmp(1) 2174 2175 END SUBROUTINE bcast_mpi_r 2176 2177 SUBROUTINE bcast_mpi_r1(var) 2178 IMPLICIT NONE 2179 REAL,INTENT(INOUT) :: Var(:) 2180 2181 CALL bcast_mpi_rgen(Var,size(Var)) 2182 2183 END SUBROUTINE bcast_mpi_r1 2184 2185 SUBROUTINE bcast_mpi_r2(var) 2186 IMPLICIT NONE 2187 REAL,INTENT(INOUT) :: Var(:,:) 2188 2189 CALL bcast_mpi_rgen(Var,size(Var)) 2190 2191 END SUBROUTINE bcast_mpi_r2 2192 2193 SUBROUTINE bcast_mpi_r3(var) 2194 IMPLICIT NONE 2195 REAL,INTENT(INOUT) :: Var(:,:,:) 2196 2197 CALL bcast_mpi_rgen(Var,size(Var)) 2198 2199 END SUBROUTINE bcast_mpi_r3 2200 2201 SUBROUTINE bcast_mpi_r4(var) 2202 IMPLICIT NONE 2203 REAL,INTENT(INOUT) :: Var(:,:,:,:) 2204 2205 CALL bcast_mpi_rgen(Var,size(Var)) 2206 2207 END SUBROUTINE bcast_mpi_r4 2208 2209 !! -- Les booleans -- !! 2210 2211 SUBROUTINE bcast_mpi_l(var) 2212 USE mpipara 2213 IMPLICIT NONE 2214 LOGICAL,INTENT(INOUT) :: Var 2215 LOGICAL :: var_tmp(1) 2216 2217 IF (is_mpi_master) var_tmp(1)=var 2218 CALL bcast_mpi_lgen(Var_tmp,1) 2219 var=var_tmp(1) 2220 2221 END SUBROUTINE bcast_mpi_l 2222 2223 SUBROUTINE bcast_mpi_l1(var) 2224 IMPLICIT NONE 2225 LOGICAL,INTENT(INOUT) :: Var(:) 2226 2227 CALL bcast_mpi_lgen(Var,size(Var)) 2228 2229 END SUBROUTINE bcast_mpi_l1 2230 2231 SUBROUTINE bcast_mpi_l2(var) 2232 IMPLICIT NONE 2233 LOGICAL,INTENT(INOUT) :: Var(:,:) 2234 2235 CALL bcast_mpi_lgen(Var,size(Var)) 2236 2237 END SUBROUTINE bcast_mpi_l2 2238 2239 SUBROUTINE bcast_mpi_l3(var) 2240 IMPLICIT NONE 2241 LOGICAL,INTENT(INOUT) :: Var(:,:,:) 2242 2243 CALL bcast_mpi_lgen(Var,size(Var)) 2244 2245 END SUBROUTINE bcast_mpi_l3 2246 2247 SUBROUTINE bcast_mpi_l4(var) 2248 IMPLICIT NONE 2249 LOGICAL,INTENT(INOUT) :: Var(:,:,:,:) 2250 2251 CALL bcast_mpi_lgen(Var,size(Var)) 2252 2253 END SUBROUTINE bcast_mpi_l4 2254 2255 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2256 !! DEFINITION DES FONCTIONS DE TRANSFERT GENERIQUES ! 2257 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2258 2259 SUBROUTINE bcast_mpi_cgen(var,nb) 2260 USE mpi_mod 2261 USE mpipara 2262 IMPLICIT NONE 2263 2264 CHARACTER(LEN=*),INTENT(INOUT) :: Var 2265 INTEGER,INTENT(IN) :: nb 2266 2267 IF (.NOT. using_mpi) RETURN 2268 2269 CALL MPI_BCAST(Var,nb,MPI_CHARACTER,mpi_master,comm_icosa,ierr) 2270 2271 END SUBROUTINE bcast_mpi_cgen 2272 2273 2274 2275 SUBROUTINE bcast_mpi_igen(var,nb) 2276 USE mpi_mod 2277 USE mpipara 2278 IMPLICIT NONE 2279 INTEGER,INTENT(IN) :: nb 2280 INTEGER,DIMENSION(nb),INTENT(INOUT) :: Var 2281 2282 IF (.NOT. using_mpi) RETURN 2283 2284 CALL MPI_BCAST(Var,nb,MPI_INTEGER,mpi_master,comm_icosa,ierr) 2285 2286 END SUBROUTINE bcast_mpi_igen 2287 2288 2289 2290 2291 SUBROUTINE bcast_mpi_rgen(var,nb) 2292 USE mpi_mod 2293 USE mpipara 2294 IMPLICIT NONE 2295 INTEGER,INTENT(IN) :: nb 2296 REAL,DIMENSION(nb),INTENT(INOUT) :: Var 2297 2298 IF (.NOT. using_mpi) RETURN 2299 2300 CALL MPI_BCAST(Var,nb,MPI_REAL8,mpi_master,comm_icosa,ierr) 2301 2302 END SUBROUTINE bcast_mpi_rgen 2303 2304 2305 2306 2307 SUBROUTINE bcast_mpi_lgen(var,nb) 2308 USE mpi_mod 2309 USE mpipara 2310 IMPLICIT NONE 2311 INTEGER,INTENT(IN) :: nb 2312 LOGICAL,DIMENSION(nb),INTENT(INOUT) :: Var 2313 2314 IF (.NOT. using_mpi) RETURN 2315 2316 CALL MPI_BCAST(Var,nb,MPI_LOGICAL,mpi_master,comm_icosa,ierr) 2317 2318 END SUBROUTINE bcast_mpi_lgen 2319 2320 2321 END MODULE transfert_mpi_mod 2322 2323 2324 2325 2326 1843 1844 1845 END MODULE transfert_mpi_legacy_mod 1846 1847 1848 1849 1850
Note: See TracChangeset
for help on using the changeset viewer.