Table of Contents
Building ALPGEN
Machine dependent compile time changes
For BG/Q
On the command line, run
soft add +mpiwrapper-xl
and change the following in the file compile.mk
ifeq ($(shell uname),Linux) # FFF = gfortran -fno-automatic # FF90 = gfortran -fno-automatic FFF = mpif77 -fno-automatic FF90 = mpif90 -fno-automatic # Or if you want optimization use this # FFF = mpixlf77 -O5 -qarch=qp -qtune=qp -qsave -qsimd=auto -qhot=level=1 -qprefetch -qunroll=yes -qnoipa -qfloat=rsqrt:hssngl:fltint # FF90 = mpixlf90 -O5 -qarch=qp -qtune=qp -qsave -qsimd=auto -qhot=level=1 -qprefetch -qunroll=yes -qnoipa -qfloat=rsqrt:hssngl:fltint #FFF = g77 -O1 -Wall -fno-automatic -Wno-globals -fno-backslash \ # -ffast-math endif
On line 182 of the file alplib/alpgen.f
change
access='append'
to
position='append'
Now, Alpgen creates its own asinh()
function. Alternating versions of Fortran have an asinh() function or does not have it. The version installed on the BGP does not have it, so there is no conflict. However, the BGQ version has the asinh()
defined so we need to replace every mention of asinh()
in Alpgen to some unique name. In this case, we chose argsignh()
. Use this command:
find . -exec grep -l "asinh" {} \; | xargs -I GGGG sh -c 'sed "s/asinh/argsinh/g" GGGG > GGGG.tmp; mv GGGG.tmp GGGG'
You will get error:
ld: -f may not be used without -shared
to fix it one needs to do the following:
mpixlf77 -o wqqgen ./wqqusr.o ../wqqlib/wqq.o \ ../alplib/alpgen.o ../alplib/alputi.o ../alplib/alppdf.o \ ../alplib/Acp.o ../alplib/Asu3.o ../alplib/Aint.o
(or similar) to pass the linking phase.
Carver
Change compile.mk
to have the following changes:
module swap pgi gcc
module swap openmpi openmpi-gcc
Then everything is fine.
Hopper
Run
module swap PrgEnv-pgi PrgEnv-gnu
That requires compile.mk
to have the following changes
ifeq ($(shell uname),Linux) # FFF = gfortran -fno-automatic # FF90 = gfortran -fno-automatic FFF = ftn FF90 = ftn #FFF = g77 -O1 -Wall -fno-automatic -Wno-globals -fno-backslash \ # -ffast-math endif
Edison
Run
module swap PrgEnv-intel PrgEnv-gnu
That requires compile.mk
to have the following changes
ifeq ($(shell uname),Linux) # FFF = gfortran -fno-automatic # FF90 = gfortran -fno-automatic FFF = ftn FF90 = ftn #FFF = g77 -O1 -Wall -fno-automatic -Wno-globals -fno-backslash \ # -ffast-math endif
Introduce MPI to Alpgen
Edits to ''alplib/alpgen.f''
In subroutine alsdef
in file alplib/alpgen.f
near line 209, just after
c common declarations
add/merge these lines
integer mpirank character*5 rankstring common/mpi/mpirank,rankstring c local variables double precision dummy,ranset,ranset2 integer i,retval,chdir c
Near line 230, just before
c list processes
add the lines
C MPI variables include 'mpif.h' integer rank, size, ierror, tag, status(MPI_STATUS_SIZE)
Following the remaining variable definitions, add this code
c beginning of MPI block c retrieve MPI rank information call MPI_INIT(ierror) call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror) mpirank = rank call MPI_FINALIZE(ierror) write(6,*) 'MPI finalized: rank ', mpirank write( rankstring, '(i8.8)' ) mpirank c work in a unique directory ./work/rankstring retval = chdir('work/'//rankstring//CHAR(0)) if(retval.ne.0) then write(6,*) 'Error changing directory to "work/rankstring" ' endif c end of MPI block
Just after the lines (near line 338)
c save parameter values to relative variables in common blocks call alspar
Add the lines
c beginning of MPI block iseed(1)=iseed(1)+mod(mpirank,65536) iseed(2)=iseed(2)+int(mpirank/65536) print*, 'Seeds and mpirank', iseed(1),iseed(2),mpirank c end of MPI block
In subroutine alstio
, just after
include 'alpgen.inc'
(near line 4584) add the lines:
integer mpirank character*5 rankstring common/mpi/mpirank,rankstring
Near line 4588, replace
call alustc(fname,'.wgt',tmpstr)
with
call alustc('../../'//fname,'.'//rankstring//'.wgt',tmpstr)
immediately after
write(6,*) 'Run parameters and diagnostics written to ' $ ,tmpstr(1:l)
This outputs the weighted event files in a common directory
Replace unit 5
with unit 9
for input near line 306, after
C MANDATORY INPUTS add
For BlueGene
open(9,file='../../input.1',action='read')
For Carver
open(9,file='../../input.1',access='read')
This reads the input configuration from file, instead of from the command line input via a redirect as in the tutorial.
Then replace all
READ(5,
with
READ(9,
This ensures everywhere is reading from the input file instead of stdin
. Only change this in the alplib/alpgen.f
file.