From d665829f98a70ed2d8ef2e926344aa8cdfc9ade6 Mon Sep 17 00:00:00 2001 From: Moises Fernandez <moisesf@fmrib.ox.ac.uk> Date: Fri, 7 Dec 2012 20:19:13 +0000 Subject: [PATCH] Main script that compiles Bedpostx CUDA version and divide the slices between several GPUs for a LSF Cluster --- CUDA/bedpostx_multigpu_LSF | 358 +++++++++++++++++++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100755 CUDA/bedpostx_multigpu_LSF diff --git a/CUDA/bedpostx_multigpu_LSF b/CUDA/bedpostx_multigpu_LSF new file mode 100755 index 0000000..9872d6d --- /dev/null +++ b/CUDA/bedpostx_multigpu_LSF @@ -0,0 +1,358 @@ +#!/bin/sh + +# Copyright (C) 2004 University of Oxford +# +# Part of FSL - FMRIB's Software Library +# http://www.fmrib.ox.ac.uk/fsl +# fsl@fmrib.ox.ac.uk +# +# Developed at FMRIB (Oxford Centre for Functional Magnetic Resonance +# Imaging of the Brain), Department of Clinical Neurology, Oxford +# University, Oxford, UK +# +# +# LICENCE +# +# FMRIB Software Library, Release 4.0 (c) 2007, The University of +# Oxford (the "Software") +# +# The Software remains the property of the University of Oxford ("the +# University"). +# +# The Software is distributed "AS IS" under this Licence solely for +# non-commercial use in the hope that it will be useful, but in order +# that the University as a charitable foundation protects its assets for +# the benefit of its educational and research purposes, the University +# makes clear that no condition is made or to be implied, nor is any +# warranty given or to be implied, as to the accuracy of the Software, +# or that it will be suitable for any particular purpose or for use +# under any specific conditions. Furthermore, the University disclaims +# all responsibility for the use which is made of the Software. It +# further disclaims any liability for the outcomes arising from using +# the Software. +# +# The Licensee agrees to indemnify the University and hold the +# University harmless from and against any and all claims, damages and +# liabilities asserted by third parties (including claims for +# negligence) which arise directly or indirectly from the use of the +# Software or the sale of any products based on the Software. +# +# No part of the Software may be reproduced, modified, transmitted or +# transferred in any form or by any means, electronic or mechanical, +# without the express permission of the University. The permission of +# the University is not required if the said reproduction, modification, +# transmission or transference is done without financial return, the +# conditions of this Licence are imposed upon the receiver of the +# product, and all original and amended source code is included in any +# transmitted product. You may be held legally responsible for any +# copyright infringement that is caused or encouraged by your failure to +# abide by these terms and conditions. +# +# You are not permitted under this Licence to use this Software +# commercially. Use for which any financial return is received shall be +# defined as commercial use, and includes (1) integration of all or part +# of the source code or the Software into a product for sale or license +# by or on behalf of Licensee to third parties or (2) use of the +# Software or any derivative of it for research with the final aim of +# developing software products for sale or license to a third party or +# (3) use of the Software or any derivative of it for research with the +# final aim of developing non-software products for sale or license to a +# third party, or (4) use of the Software to provide any service to an +# external organisation for which payment is received. If you are +# interested in using the Software commercially, please contact Isis +# Innovation Limited ("Isis"), the technology transfer company of the +# University, to negotiate a licence. Contact details are: +# innovation@isis.ox.ac.uk quoting reference DE/1112. + +beforet=`date +%s` +if [ "x$SGE_ROOT" = "x" ] ; then + if [ -f /usr/local/share/sge/default/common/settings.sh ] ; then + . /usr/local/share/sge/default/common/settings.sh + elif [ -f /usr/local/sge/default/common/settings.sh ] ; then + . /usr/local/sge/default/common/settings.sh + fi +fi + +Usage() { + echo "" + echo "Usage: bedpostx <subject directory> [options]" + echo "" + echo "expects to find bvals and bvecs in subject directory" + echo "expects to find data and nodif_brain_mask in subject directory" + echo "expects to find grad_dev in subject directory, if -g is set" + echo "options (old syntax)" + echo "-n (number of fibres per voxel, default 2)" + echo "-w (ARD weight, more weight means less secondary fibres per voxel, default 1)" + echo "-b (burnin period, default 1000)" + echo "-j (number of jumps, default 1250)" + echo "-s (sample every, default 25)" + echo "-model (1 for monoexponential, 2 for multiexponential, default 1)" + echo "-g (consider gradient nonlinearities, default off)" + echo "" + echo "" + echo "ALTERNATIVELY: you can pass on xfibres options onto directly bedpostx" + echo " For example: bedpostx <subject directory> --noard --cnonlinear" + echo " Type 'xfibres --help' for a list of available options " + echo " Default options will be bedpostx default (see above), and not xfibres default." + echo "" + echo "Note: Use EITHER old OR new syntax." + exit 1 +} + +make_absolute(){ + dir=$1; + if [ -d ${dir} ]; then + OLDWD=`pwd` + cd ${dir} + dir_all=`pwd` + cd $OLDWD + else + dir_all=${dir} + fi + echo ${dir_all} +} + +[ "$1" = "" ] && Usage + +subjdir=`make_absolute $1` +subjdir=`echo $subjdir | sed 's/\/$/$/g'` + +echo subjectdir is $subjdir + +#parse option arguments +nfibres=2 +fudge=1 +burnin=1000 +njumps=1250 +sampleevery=25 +model=1 +gflag=0 +f0=0 +rician=0 + +shift +while [ ! -z "$1" ] +do + case "$1" in + -n) nfibres=$2;shift;; + --nf=?) nfibres=`echo $1 | sed s/"--nf="//g`;; + --model=?) model=`echo $1 | sed s/"--model="//g`;; + -w) fudge=$2;shift;; + -b) burnin=$2;shift;; + -j) njumps=$2;shift;; + -s) sampleevery=$2;shift;; + --f0) f0=1 others="$others $1";; + --rician) rician=1 others="$others $1";; + -model) model=$2;shift;; + -g) gflag=1;; + *) others="$others $1";; + esac + shift +done + +opts="--nf=$nfibres --fudge=$fudge --bi=$burnin --nj=$njumps --se=$sampleevery --model=$model" +defopts="--cnonlinear" +opts="$opts $defopts $others" + +#check that all required files exist + +if [ ! -d $subjdir ]; then + echo "subject directory $1 not found" + exit 1 +fi + +if [ ! -e ${subjdir}/bvecs ]; then + echo "${subjdir}/bvecs not found" + exit 1 +fi + +if [ ! -e ${subjdir}/bvals ]; then + echo "${subjdir}/bvals not found" + exit 1 +fi + +if [ `${FSLDIR}/bin/imtest ${subjdir}/data` -eq 0 ]; then + echo "${subjdir}/data not found" + exit 1 +fi + +if [ ${gflag} -eq 1 ]; then + if [ `${FSLDIR}/bin/imtest ${subjdir}/grad_dev` -eq 0 ]; then + echo "${subjdir}/grad_dev not found" + exit 1 + fi +fi + +if [ `${FSLDIR}/bin/imtest ${subjdir}/nodif_brain_mask` -eq 0 ]; then + echo "${subjdir}/nodif_brain_mask not found" + exit 1 +fi + +echo Making bedpostx directory structure + +mkdir -p ${subjdir}.bedpostX/ +mkdir -p ${subjdir}.bedpostX/diff_slices +mkdir -p ${subjdir}.bedpostX/logs +mkdir -p ${subjdir}.bedpostX/logs/pid_${$} +mkdir -p ${subjdir}.bedpostX/xfms + +if [ ${gflag} -eq 1 ]; then + echo "bedpostx_gpu "${subjdir} $opts "-g" >> ${subjdir}.bedpostX/commands.txt +else + echo "bedpostx_gpu "${subjdir} $opts >> ${subjdir}.bedpostX/commands.txt +fi + +echo "..............Compiling CUDA-gpu code .................." + +export LD_LIBRARY_PATH=${CUDA}/lib64:${subjdir}.bedpostX:${CUDA}/lib:$LD_LIBRARY_PATH +export DYLD_LIBRARY_PATH=${CUDA}/lib64:${subjdir}.bedpostX:${CUDA}/lib:$LD_LIBRARY_PATH +export PATH=${FSLDIR}/bin:$PATH + +volumes=`${FSLDIR}/bin/fslval ${subjdir}/data dim4` +echo "DIRECTIONS NUMBER: $volumes" + +filename="${subjdir}.bedpostX/options.h" + +if [ $volumes -le 64 ]; then + threadsBlock=$volumes +else + threadsBlock=64 +fi + +params=$((2+3*$nfibres)) + +if [ $f0 -eq 1 ]; then + params=$(($params+1)) +fi + +if [ $model -eq 2 ]; then + params=$(($params+1)) +fi + +if [ $rician -eq 1 ]; then + params=$(($params+1)) +fi + +rem=$(($volumes%$threadsBlock)) +maxndirs=$(($volumes/$threadsBlock)) + +if [ $rem -ne 0 ]; then + maxndirs=$(($maxndirs+1)) +fi + +dstd=$(($model-1)); + +params_rep=$(($params-1)) +params_step0_m2_rep=$(($params_step0_m2-1)) + +echo "#define NDIRECTIONS $volumes +#define NFIBRES $nfibres +#define NPARAMS $params +#define MAXNDIRS_PER_THREAD $maxndirs +#define THREADS_BLOCK $threadsBlock">$filename + +before=`date +%s` + +${CUDA}/bin/nvcc --shared --compiler-options '-fPIC' -o ${subjdir}.bedpostX/libbedpostx_cuda.so ${FSLDIR}/src/fdt/CUDA/init_gpu.cu ${FSLDIR}/src/fdt/CUDA/samples.cu ${FSLDIR}/src/fdt/CUDA/diffmodels.cu ${FSLDIR}/src/fdt/CUDA/runmcmc.cu ${FSLDIR}/src/fdt/CUDA/xfibres_gpu.cu -O3 -arch sm_20 -lcudart -lcuda -lcurand -L${CUDA}/lib64 -L${CUDA}/lib -I${subjdir}.bedpostX -I${FSLDIR}/extras/include/newmat -I${FSLDIR}/extras/include/boost -I${FSLDIR}/include -I${CUDA}/include/thrust -I${FSLDIR}/src/fdt + +file=${subjdir}.bedpostX/libbedpostx_cuda.so + +if [ -f $file ]; +then +after=`date +%s` +diff=$(($after-$before)) +echo "Compilation Time: $diff seconds" >> ${subjdir}.bedpostX/times + +echo "CUDA CODE compiled successfully" + +mailto=`whoami`@fmrib.ox.ac.uk +before=`date +%s` +echo Preprocessing stages +${FSLDIR}/bin/bedpostx_preproc.sh ${subjdir} ${gflag} + +after=`date +%s` +diff=$(($after-$before)) +echo "Preprocessing Time: $diff seconds" >> ${subjdir}.bedpostX/times + +before=`date +%s` +nslices=`${FSLDIR}/bin/fslval ${subjdir}/data dim3` + +slice=0 + +post_string="bsub -o ${subjdir}'.bedpostX/logs/output.log -e ${subjdir}.bedpostX/logs/error.log -W 0:50" + +post_string=$post_string" -w " + +echo Submitting slices to GPUs +while [ $slice -lt $nslices ];do + + string=$(bsub -o ${subjdir}'.bedpostX/logs/output.log' -e ${subjdir}'.bedpostX/logs/error.log' -W 0:15 -n 1 ${FSLDIR}'/bin/splitter_multigpu' $subjdir $gflag $nfibres $slice $opts) + array=(`echo $string | tr "<" ' '`) + aux=${array[1]} + array=(`echo $aux | tr ">" ' '`) + job=${array[0]} + #echo $job + +if [ $slice -eq $(($nslices-1)) ];then + post_string=$post_string"done("${job}")" +else + post_string=$post_string"done("${job}")&&" +fi + slice=$(($slice + 1)) +done + +post_string=$post_string" ${FSLDIR}/bin/bedpostx_postproc.sh $subjdir" +#echo $post_string +$post_string + +echo "All jobs submitted" + +finished=0 +logdir=${subjdir}.bedpostX/logs +tim=0 + +while [ $finished -eq 0 ] ; do + nfin=0 + pslice=0 + while [ $pslice -lt $nslices ];do + slicezp=`${FSLDIR}/bin/zeropad $pslice 4` + isimg=`${FSLDIR}/bin/imtest ${subjdir}.bedpostX/diff_slices/data_slice_$slicezp/dyads1` + if [ $isimg -eq 1 ];then + nfin=$(($nfin + 1)) + fi + pslice=$(($pslice + 1)) + done + echo $nfin "slices processed" + + if [ $tim -eq 0 ] ; then + if [ $nfin -eq $nslices ] ; then + after=`date +%s` + diff=$(($after-$before)) + echo "Execution Time: $diff seconds" >> ${subjdir}.bedpostX/times + tim=1 + fi + fi + + + + if [ -f ${subjdir}.bedpostX/xfms/eye.mat ] ; then + finished=1 + echo "All slices processed" + fi + sleep 15; +done + + + +aftert=`date +%s` +diff=$(($aftert-$beforet)) +echo "TOTAL Time: $diff seconds" >> ${subjdir}.bedpostX/times + +else + echo + echo + echo "CUDA COMPILER ERROR. Please be sure that you have set correctly CUDALIBDIR in first line in file bin/bedpostx_cuda" + echo +fi + + -- GitLab