1 | MODULE mod_ioclient_para |
---|
2 | INTEGER,PARAMETER :: color_client=1 |
---|
3 | INTEGER,PARAMETER :: color_server=2 |
---|
4 | INTEGER,SAVE :: iocomm |
---|
5 | INTEGER,SAVE :: iosize |
---|
6 | INTEGER,SAVE :: iorank |
---|
7 | INTEGER,SAVE :: server_rank |
---|
8 | INTEGER,SAVE :: intracomm |
---|
9 | CONTAINS |
---|
10 | |
---|
11 | |
---|
12 | SUBROUTINE Init_parallel |
---|
13 | USE mpitrace |
---|
14 | IMPLICIT NONE |
---|
15 | INCLUDE 'mpif.h' |
---|
16 | INTEGER :: NEW_COMM |
---|
17 | INTEGER :: ierr |
---|
18 | INTEGER :: global_rank |
---|
19 | INTEGER :: global_size |
---|
20 | INTEGER :: mpi_rank |
---|
21 | INTEGER :: mpi_size |
---|
22 | INTEGER :: nb_server_io |
---|
23 | INTEGER,ALLOCATABLE :: proc_color(:) |
---|
24 | INTEGER :: i |
---|
25 | INTEGER :: div,remain |
---|
26 | INTEGER :: group_color |
---|
27 | |
---|
28 | ! PRINT *, "on rentre dans MPI_INIT" |
---|
29 | CALL MPI_INIT(ierr) |
---|
30 | CALL MPI_COMM_RANK(MPI_COMM_WORLD,global_rank,ierr) |
---|
31 | CALL MPI_COMM_SIZE(MPI_COMM_WORLD,global_size,ierr) |
---|
32 | |
---|
33 | PRINT *,"MPI_init Ok, --> mpi_comm_split" |
---|
34 | CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color_client,global_rank,intracomm,ierr) |
---|
35 | CALL MPI_COMM_SIZE(intracomm,mpi_size,ierr) |
---|
36 | CALL MPI_COMM_RANK(intracomm,mpi_rank,ierr) |
---|
37 | PRINT *,"MPI_mpi_comm_split ok --> intracomm" |
---|
38 | nb_server_io=global_size-mpi_size |
---|
39 | div=mpi_size/nb_server_io |
---|
40 | remain=MOD(mpi_size,nb_server_io) |
---|
41 | |
---|
42 | IF (mpi_rank<remain*(div+1)) THEN |
---|
43 | group_color=mpi_rank/(div+1) |
---|
44 | ELSE |
---|
45 | group_color=(nb_server_io-1)-(mpi_size-1-mpi_rank)/div |
---|
46 | ENDIF |
---|
47 | PRINT *,'group_color',group_color |
---|
48 | |
---|
49 | CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,group_color,global_rank,iocomm,ierr) |
---|
50 | |
---|
51 | CALL MPI_COMM_SIZE(iocomm,iosize,ierr) |
---|
52 | CALL MPI_COMM_RANK(iocomm,iorank,ierr) |
---|
53 | PRINT *,"io_size-> ",iosize,"iorank-> ",iorank |
---|
54 | ALLOCATE(proc_color(0:iosize-1)) |
---|
55 | CALL MPI_ALLGATHER(color_client,1,MPI_INTEGER,proc_color,1,MPI_INTEGER,iocomm,ierr) |
---|
56 | print *,"proc_color -> ",proc_color |
---|
57 | |
---|
58 | DO i=0,iosize-1 |
---|
59 | IF (proc_color(i)==color_server) THEN |
---|
60 | server_rank=i |
---|
61 | EXIT |
---|
62 | ENDIF |
---|
63 | ENDDO |
---|
64 | |
---|
65 | PRINT *,"Proces No",mpi_rank,"--> server",server_rank |
---|
66 | END SUBROUTINE Init_parallel |
---|
67 | |
---|
68 | SUBROUTINE Finalize_parallel |
---|
69 | IMPLICIT NONE |
---|
70 | include 'mpif.h' |
---|
71 | INTEGER :: ierr |
---|
72 | |
---|
73 | CALL MPI_FINALIZE(ierr) |
---|
74 | |
---|
75 | END SUBROUTINE Finalize_parallel |
---|
76 | |
---|
77 | END MODULE mod_ioclient_para |
---|