Changeset 1779 for palm/trunk/SOURCE/pmc_client.f90
- Timestamp:
- Mar 3, 2016 8:01:28 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/pmc_client.f90
r1765 r1779 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! kind=dp replaced by wp, dim_order removed 23 ! array management changed from linked list to sequential loop 23 24 ! 24 25 ! Former revisions: … … 50 51 USE kinds 51 52 USE PMC_general, ONLY: ClientDef, DA_NameDef, DA_Namelen, PMC_STATUS_OK, PMC_DA_NAME_ERR, PeDef, ArrayDef, & 52 DA_Desclen, DA_Namelen, PMC_G_SetName, PMC_ G_GetName53 DA_Desclen, DA_Namelen, PMC_G_SetName, PMC_MAX_ARRAY 53 54 USE PMC_handle_communicator, ONLY: m_model_comm,m_model_rank,m_model_npes, m_to_server_comm 54 55 USE PMC_MPI_wrapper, ONLY: PMC_Send_to_Server, PMC_Recv_from_Server, PMC_Time, & … … 58 59 SAVE 59 60 60 ! data local to this MODULE61 61 Type(ClientDef) :: me 62 !-- TO_DO: what is the meaning of this? Could variables declared in this module 63 !-- also have single precision? 64 ! INTEGER, PARAMETER :: dp = wp 65 66 INTEGER, save :: myIndex = 0 !Counter and unique number for Data Arrays 62 63 INTEGER :: next_array_in_list = 0 64 INTEGER :: myIndex = 0 !Counter and unique number for Data Arrays 67 65 68 66 ! INTERFACE section … … 81 79 END INTERFACE PMC_C_Get_2D_index_list 82 80 81 INTERFACE PMC_C_clear_next_array_list 82 MODULE procedure PMC_C_clear_next_array_list 83 END INTERFACE PMC_C_clear_next_array_list 84 83 85 INTERFACE PMC_C_GetNextArray 84 86 MODULE procedure PMC_C_GetNextArray … … 105 107 106 108 PUBLIC PMC_ClientInit , PMC_Set_DataArray_Name, PMC_C_Get_2D_index_list 107 PUBLIC PMC_C_GetNextArray, PMC_C_Set_DataArray 108 PUBLIC PMC_C_setInd_and_AllocMem , PMC_C_GetBuffer, PMC_C_PutBuffer ! ,PMC_C_GetServerType109 PUBLIC PMC_C_GetNextArray, PMC_C_Set_DataArray, PMC_C_clear_next_array_list 110 PUBLIC PMC_C_setInd_and_AllocMem , PMC_C_GetBuffer, PMC_C_PutBuffer 109 111 110 112 CONTAINS … … 130 132 CALL MPI_Intercomm_merge (me%inter_comm, .true., me%intra_comm, istat); 131 133 CALL MPI_Comm_rank (me%intra_comm, me%intra_rank, istat); 132 133 134 ALLOCATE (me%PEs(me%inter_npes)) 134 135 136 ! 137 !-- Allocate for all Server PEs an array of TYPE ArrayDef to store information of transfer array 135 138 do i=1,me%inter_npes 136 NULLIFY(me%PEs(i)%Arrays)139 ALLOCATE(me%PEs(i)%array_list(PMC_MAX_ARRAY)) 137 140 end do 138 141 … … 142 145 END SUBROUTINE PMC_ClientInit 143 146 144 SUBROUTINE PMC_Set_DataArray_Name (ServerArrayDesc, ServerArrayName, ClientArrayDesc, ClientArrayName, istat , LastEntry)147 SUBROUTINE PMC_Set_DataArray_Name (ServerArrayDesc, ServerArrayName, ClientArrayDesc, ClientArrayName, istat) 145 148 IMPLICIT none 146 149 character(len=*),INTENT(IN) :: ServerArrayName … … 149 152 character(len=*),INTENT(IN) :: ClientArrayDesc 150 153 INTEGER,INTENT(OUT) :: istat 151 LOGICAL,INTENT(IN),optional :: LastEntry152 154 153 155 !-- local variables … … 192 194 CALL PMC_Bcast ( myName%NameOnClient, myPE, comm=m_to_server_comm) 193 195 194 if(present (LastEntry)) then195 CALL PMC_Set_DataArray_Name_LastEntry ( LastEntry = LastEntry)196 end if197 198 196 CALL PMC_G_SetName (me, myName%couple_index, myName%NameOnClient) 199 197 … … 231 229 INTEGER(KIND=MPI_ADDRESS_KIND) :: disp !: Displacement Unit (Integer = 4, floating poit = 8 232 230 INTEGER,DIMENSION(me%inter_npes*2) :: NrEle !: Number of Elements of a horizontal slice 233 TYPE(PeDef),POINTER :: aPE !: Pointer to PeDef str zcture231 TYPE(PeDef),POINTER :: aPE !: Pointer to PeDef structure 234 232 INTEGER(KIND=MPI_ADDRESS_KIND) :: WinSize !: Size of MPI window 2 (in bytes) 235 233 INTEGER,DIMENSION(:),POINTER :: myInd … … 299 297 END SUBROUTINE PMC_C_Get_2D_index_list 300 298 299 SUBROUTINE PMC_C_clear_next_array_list 300 IMPLICIT none 301 302 next_array_in_list = 0 303 304 return 305 END SUBROUTINE PMC_C_clear_next_array_list 306 307 ! List handling is still required to get minimal interaction with pmc_interface 301 308 LOGICAL function PMC_C_GetNextArray (myName) 302 309 character(len=*),INTENT(OUT) :: myName 303 310 304 311 !-- local variables 305 INTEGER :: MyCoupleIndex 306 LOGICAL :: MyLast !Last Array in List 307 character(len=DA_Namelen) :: loName 308 309 loName = 'NoName ' 310 MyLast = .true. 311 312 CALL PMC_G_GetName (me, MyCoupleIndex, loName, MyLast) 313 314 myName = trim(loName) 315 316 PMC_C_GetNextArray = .NOT. MyLast ! Return true if valid array 317 318 return 312 TYPE(PeDef),POINTER :: aPE 313 TYPE(ArrayDef),POINTER :: ar 314 315 next_array_in_list = next_array_in_list+1 316 317 !-- Array Names are the same on all client PE, so take first PE to get the name 318 aPE => me%PEs(1) 319 320 if(next_array_in_list > aPE%Nr_arrays) then 321 PMC_C_GetNextArray = .false. !all arrays done 322 return 323 end if 324 325 ar => aPE%array_list(next_array_in_list) 326 327 myName = ar%name 328 329 PMC_C_GetNextArray = .true. ! Return true if legal array 330 return 319 331 END function PMC_C_GetNextArray 320 332 321 333 SUBROUTINE PMC_C_Set_DataArray_2d (array) 334 322 335 IMPLICIT none 323 !-- TO_DO: is double precision absolutely required here? 324 REAL(kind=dp),INTENT(IN),DIMENSION(:,:) :: array 325 !-- local variables 326 INTEGER :: NrDims 327 INTEGER,DIMENSION (4) :: dims 328 INTEGER :: dim_order 329 TYPE(c_ptr) :: array_adr 330 INTEGER :: i 331 TYPE(PeDef),POINTER :: aPE 332 TYPE(ArrayDef),POINTER :: ar 336 337 REAL(wp), INTENT(IN) ,DIMENSION(:,:) :: array 338 339 INTEGER :: NrDims 340 INTEGER,DIMENSION (4) :: dims 341 TYPE(c_ptr) :: array_adr 342 INTEGER :: i 343 TYPE(PeDef),POINTER :: aPE 344 TYPE(ArrayDef),POINTER :: ar 333 345 334 346 … … 338 350 dims(1) = size(array,1) 339 351 dims(2) = size(array,2) 340 dim_order = 2341 352 342 353 array_adr = c_loc(array) … … 344 355 do i=1,me%inter_npes 345 356 aPE => me%PEs(i) 346 ar => aPE% Arrays357 ar => aPE%array_list(next_array_in_list) !actual array is last array in list 347 358 ar%NrDims = NrDims 348 359 ar%A_dim = dims 349 ar%dim_order = dim_order350 360 ar%data = array_adr 351 361 end do … … 355 365 356 366 SUBROUTINE PMC_C_Set_DataArray_3d (array) 367 357 368 IMPLICIT none 358 !-- TO_DO: is double precision absolutely required here? 359 REAL(kind=dp),INTENT(IN),DIMENSION(:,:,:) :: array 360 !-- local variables 361 INTEGER :: NrDims 362 INTEGER,DIMENSION (4) :: dims 363 INTEGER :: dim_order 364 TYPE(c_ptr) :: array_adr 365 INTEGER :: i 366 TYPE(PeDef),POINTER :: aPE 367 TYPE(ArrayDef),POINTER :: ar 369 370 REAL(wp),INTENT(IN),DIMENSION(:,:,:) :: array 371 372 INTEGER :: NrDims 373 INTEGER,DIMENSION (4) :: dims 374 TYPE(c_ptr) :: array_adr 375 INTEGER :: i 376 TYPE(PeDef),POINTER :: aPE 377 TYPE(ArrayDef),POINTER :: ar 368 378 369 379 dims = 1 … … 373 383 dims(2) = size(array,2) 374 384 dims(3) = size(array,3) 375 dim_order =33376 385 377 386 array_adr = c_loc(array) … … 379 388 do i=1,me%inter_npes 380 389 aPE => me%PEs(i) 381 ar => aPE% Arrays390 ar => aPE%array_list(next_array_in_list) !actual array is last array in list 382 391 ar%NrDims = NrDims 383 392 ar%A_dim = dims 384 ar%dim_order = dim_order385 393 ar%data = array_adr 386 394 end do … … 393 401 IMPLICIT none 394 402 395 INTEGER :: i, ierr 403 INTEGER :: i, ierr, j 396 404 INTEGER :: arlen, myIndex, tag 397 405 INTEGER(idp) :: bufsize ! Size of MPI data Window … … 412 420 tag = 200 413 421 414 do while (PMC_C_GetNextArray (myName))415 ar => aPE% Arrays422 do j=1,aPE%Nr_arrays 423 ar => aPE%array_list(j) 416 424 417 425 ! Receive Index from client … … 419 427 CALL MPI_Recv (myIndex, 1, MPI_INTEGER, i-1, tag, me%inter_comm, MPI_STATUS_IGNORE, ierr) 420 428 421 if(ar% dim_order == 33) then ! PALM has k in first dimension429 if(ar%NrDims == 3) then ! PALM has k in first dimension 422 430 bufsize = max(bufsize,ar%A_dim(1)*ar%A_dim(2)*ar%A_dim(3)) ! determine max, because client buffer is allocated only once 423 431 else … … 442 450 aPE => me%PEs(i) 443 451 444 do while (PMC_C_GetNextArray (myName))445 ar => aPE% Arrays452 do j=1,aPE%Nr_arrays 453 ar => aPE%array_list(j) 446 454 ar%SendBuf = base_ptr 447 455 end do … … 452 460 453 461 SUBROUTINE PMC_C_GetBuffer (WaitTime) 462 454 463 IMPLICIT none 455 REAL(kind=dp),INTENT(OUT),optional :: WaitTime 464 465 REAL(wp), INTENT(OUT), optional :: WaitTime 456 466 457 467 !-- local variables 458 INTEGER :: ip, ij, ierr459 INTEGER :: nr! Number of Elements to getb from server460 INTEGER ::myIndex461 REAL( kind=dp) ::t1,t2462 TYPE(PeDef),POINTER ::aPE463 TYPE(ArrayDef),POINTER ::ar464 INTEGER,DIMENSION(1) ::buf_shape465 REAL( kind=wp),POINTER,DIMENSION(:) ::buf466 REAL( kind=wp),POINTER,DIMENSION(:,:) ::data_2d467 REAL( kind=wp),POINTER,DIMENSION(:,:,:) ::data_3d468 character(len=DA_Namelen) ::myName469 INTEGER(kind=MPI_ADDRESS_KIND) ::target_disp468 INTEGER :: ip, ij, ierr, j 469 INTEGER :: nr ! Number of Elements to getb from server 470 INTEGER :: myIndex 471 REAL(wp) :: t1,t2 472 TYPE(PeDef),POINTER :: aPE 473 TYPE(ArrayDef),POINTER :: ar 474 INTEGER,DIMENSION(1) :: buf_shape 475 REAL(wp),POINTER,DIMENSION(:) :: buf 476 REAL(wp),POINTER,DIMENSION(:,:) :: data_2d 477 REAL(wp),POINTER,DIMENSION(:,:,:) :: data_3d 478 character(len=DA_Namelen) :: myName 479 INTEGER(kind=MPI_ADDRESS_KIND) :: target_disp 470 480 471 481 t1 = PMC_Time() 472 482 CALL MPI_Barrier(me%intra_comm, ierr) ! Wait for server to fill buffer 473 t2 = PMC_Time() 474 if(present(WaitTime)) WaitTime = t2 -t1483 t2 = PMC_Time()-t1 484 if(present(WaitTime)) WaitTime = t2 475 485 476 486 CALL MPI_Barrier(me%intra_comm, ierr) ! Wait for buffer is filled … … 479 489 aPE => me%PEs(ip) 480 490 481 do while (PMC_C_GetNextArray (myName))482 ar => aPE% Arrays483 if(ar% dim_order== 2) then491 do j=1,aPE%Nr_arrays 492 ar => aPE%array_list(j) 493 if(ar%NrDims == 2) then 484 494 nr = aPE%NrEle 485 else if(ar% dim_order == 33) then495 else if(ar%NrDims == 3) then 486 496 nr = aPE%NrEle*ar%A_dim(1) 487 497 end if … … 489 499 buf_shape(1) = nr 490 500 CALL c_f_pointer(ar%SendBuf, buf, buf_shape) 491 501 ! 502 !-- MPI passive target RMA 492 503 if(nr > 0) then 493 504 target_disp = (ar%BufIndex-1) … … 498 509 499 510 myIndex = 1 500 if(ar% dim_order== 2) then511 if(ar%NrDims == 2) then 501 512 502 513 CALL c_f_pointer(ar%data, data_2d, ar%A_dim(1:2)) … … 505 516 myIndex = myIndex+1 506 517 end do 507 else if(ar% dim_order == 33) then518 else if(ar%NrDims == 3) then 508 519 CALL c_f_pointer(ar%data, data_3d, ar%A_dim(1:3)) 509 520 do ij=1,aPE%NrEle … … 519 530 520 531 SUBROUTINE PMC_C_PutBuffer (WaitTime) 532 521 533 IMPLICIT none 522 REAL(kind=dp),INTENT(OUT),optional :: WaitTime 534 535 REAL(wp), INTENT(OUT), optional :: WaitTime 523 536 524 537 !-- local variables 525 INTEGER :: ip, ij, ierr526 INTEGER :: nr! Number of Elements to getb from server527 INTEGER ::myIndex528 REAL( kind=dp) ::t1,t2529 TYPE(PeDef),POINTER ::aPE530 TYPE(ArrayDef),POINTER ::ar531 INTEGER,DIMENSION(1) ::buf_shape532 REAL( kind=wp),POINTER,DIMENSION(:) ::buf533 REAL( kind=wp),POINTER,DIMENSION(:,:) ::data_2d534 REAL( kind=wp),POINTER,DIMENSION(:,:,:) ::data_3d535 character(len=DA_Namelen) ::myName536 INTEGER(kind=MPI_ADDRESS_KIND) ::target_disp538 INTEGER :: ip, ij, ierr, j 539 INTEGER :: nr ! Number of Elements to getb from server 540 INTEGER :: myIndex 541 REAL(wp) :: t1,t2 542 TYPE(PeDef),POINTER :: aPE 543 TYPE(ArrayDef),POINTER :: ar 544 INTEGER,DIMENSION(1) :: buf_shape 545 REAL(wp),POINTER,DIMENSION(:) :: buf 546 REAL(wp),POINTER,DIMENSION(:,:) :: data_2d 547 REAL(wp),POINTER,DIMENSION(:,:,:) :: data_3d 548 character(len=DA_Namelen) :: myName 549 INTEGER(kind=MPI_ADDRESS_KIND) :: target_disp 537 550 538 551 … … 540 553 aPE => me%PEs(ip) 541 554 542 do while (PMC_C_GetNextArray (myName))543 ar => aPE% Arrays544 if(ar% dim_order== 2) then555 do j=1,aPE%Nr_arrays 556 ar => aPE%array_list(j) 557 if(ar%NrDims == 2) then 545 558 nr = aPE%NrEle 546 else if(ar% dim_order == 33) then559 else if(ar%NrDims == 3) then 547 560 nr = aPE%NrEle*ar%A_dim(1) 548 561 end if … … 552 565 553 566 myIndex = 1 554 if(ar% dim_order== 2) then567 if(ar%NrDims == 2) then 555 568 CALL c_f_pointer(ar%data, data_2d, ar%A_dim(1:2)) 556 569 do ij=1,aPE%NrEle … … 558 571 myIndex = myIndex+1 559 572 end do 560 else if(ar% dim_order == 33) then573 else if(ar%NrDims == 3) then 561 574 CALL c_f_pointer(ar%data, data_3d, ar%A_dim(1:3)) 562 575 do ij=1,aPE%NrEle … … 565 578 end do 566 579 end if 567 580 ! 581 !-- MPI passiv target RMA 568 582 if(nr > 0) then 569 583 target_disp = (ar%BufIndex-1)
Note: See TracChangeset
for help on using the changeset viewer.