7
c This software is being made available for internal testing and
8
c evaluation purposes only. This software is a pre-release test version
9
c which has not yet been authenticated and cleared for publication. Adherence
10
c to this notice may be necessary for the author, Battelle Memorial
11
c Institute, to successfully assert copyright in and commercialize this
12
c software. This software is not intended for duplication or distribution
13
c to third parties without the permission of the Manager of Software
14
c Products at Pacific Northwest Laboratory, Richland, Washington, 99352.
16
#define USE_SUBGROUPS 1
21
parameter (MAXTASKS=2000)
22
integer i,j,me,icnt,ndim,one
23
integer heap, stack, group_size, nprocs, ngroups, my_grp
24
integer max_task, itask, jtask, natom1, natom2
25
integer group_list(2000), proc_list(2000)
26
double precision tbeg, wraptime, elapsed
27
double precision task_time(MAXTASKS),task_beg
28
double precision proc_time(MD_MAXPROC), delta_t
29
double precision maxtime, mintime,mingtime,maxgtime
32
c This is the main calling program for the Molecular Dynamics
36
c Initialize message passing
48
c Initialize global arrays
54
if (.not.ma_init(MT_DBL, stack, heap))
55
+ call ga_error("ma_init failed",-1)
57
c Create process groups
62
group_size = ga_nnodes()
68
my_grp = (me-mod(me,group_size))/group_size
69
do i = 1, min(max_task, MAXTASKS)
74
c write(6,101) my_grp,me
75
101 format('My group is ',i2,' on proc ',i3)
76
ngroups = nprocs/group_size
77
do i = 1, min(nprocs, MD_MAXPROC)
80
c write(6,102) ngroups,me
81
102 format('Ngroups is ',i2,' on proc ',i3)
88
group_list(i) = ga_pgroup_create(proc_list,group_size)
92
c Create global array to use for master-worker algorithm
94
g_counter = ga_create_handle()
96
call ga_set_data(g_counter,ndim,ndim,MT_INT)
97
status = ga_allocate(g_counter)
98
call ga_zero(g_counter)
100
103 format('Created counter array on ',i3)
102
c write(6,104) me,group_list(my_grp+1)
103
104 format('Default group on ',i3,' is ',i2)
104
call ga_pgroup_set_default(group_list(my_grp+1))
106
105 format('Set default group on ',i3)
108
100 if (ga_nodeid().eq.0) then
109
itask = nga_read_inc(g_counter,one,one)
113
call ga_igop(1,itask,1,'+')
114
if (itask.lt.max_task) then
115
c write(6,106) itask,me
116
106 format('Executing task ',i3,' on proc ',i3)
119
jtask = max_task - 1 - itask
120
natom2 = jtask*5 + 25
122
task_beg = wraptime()
123
call cl_sim(natom1,natom2,jtask)
124
delta_t = wraptime() - task_beg
125
if (itask.lt.MAXTASKS) task_time(itask+1) = delta_t
127
i = ga_pgroup_nodeid(ga_pgroup_get_world())
129
if (i.le.MD_MAXPROC) proc_time(i) = delta_t
134
call ga_pgroup_set_default(ga_pgroup_get_world())
136
call ga_dgop(3,task_time,MAXTASKS,'+')
137
task_time(1) = task_time(1)/dble(group_size)
138
mintime = task_time(1)
139
maxtime = task_time(1)
140
do i = 2, min(max_task, MAXTASKS)
141
task_time(i) = task_time(i)/dble(group_size)
142
if (task_time(i).gt.maxtime) maxtime=task_time(i)
143
if (task_time(i).lt.mintime) mintime=task_time(i)
145
call ga_dgop(4,proc_time,MD_MAXPROC,'+')
146
proc_time(1) = proc_time(1)/dble(group_size)
147
mingtime = proc_time(1)
148
maxgtime = proc_time(1)
149
do i = 2, min(ngroups, MD_MAXPROC)
150
proc_time(i) = proc_time(i)/dble(group_size)
151
if (proc_time(i).gt.maxgtime) maxgtime=proc_time(i)
152
if (proc_time(i).lt.mingtime) mingtime=proc_time(i)
154
elapsed = wraptime()-tbeg
155
call ga_dgop(2,elapsed,1,'+')
156
elapsed = elapsed/dble(nprocs)
158
do i = 1, min(max_task, MAXTASKS)
159
write(6,300) i,task_time(i)
161
do i = 1, min(ngroups, MD_MAXPROC)
162
write(6,301) i,proc_time(i)
164
write(6,201) max_task
165
write(6,202) group_size
168
write(6,205) mingtime
169
write(6,206) maxgtime
172
200 format('Elapsed time for simulation : ',f16.4)
173
201 format('Number of tasks : ',i12)
174
202 format('Number of processors in group: ',i12)
175
203 format('Minimum time for task : ',f16.4)
176
204 format('Maximum time for task : ',f16.4)
177
205 format('Minimum time for group : ',f16.4)
178
206 format('Maximum time for group : ',f16.4)
179
300 format('Time for task[',i3,'] : ',f16.4)
180
301 format('Time for group[',i3,'] : ',f16.4)
183
c write(6,*) 'Calling mpi_finalize'
188
c write(6,*) 'Called mpi_finalize'