|
|
@@ -0,0 +1,102 @@
|
|
|
+#!/bin/bash
|
|
|
+#
|
|
|
+# Use this script if you cannot use MPI but you have a
|
|
|
+# NFS available (or some other means of communicating
|
|
|
+# the ip/port between computers).
|
|
|
+#
|
|
|
+# Don't reuse the same "FILE_WITH_LOC" since the race
|
|
|
+# conditions are ugly, and the files won't be
|
|
|
+# automatically deleted after this script.
|
|
|
+#
|
|
|
+OUTPUT_FILE_DIR="$1"
|
|
|
+FILE_WITH_LOC="$2"
|
|
|
+CUDADL_PATH="$3"
|
|
|
+#
|
|
|
+if [ "$SLURM_LOCALID" == "0" ] ; then
|
|
|
+ if [ "$SLURM_PROCID" == "0" ] ; then
|
|
|
+ # adapted from https://superuser.com/questions/184307/bash-create-anonymous-fifo
|
|
|
+ # and https://stackoverflow.com/questions/8297415/in-bash-how-to-find-the-lowest-numbered-unused-file-descriptor
|
|
|
+ #
|
|
|
+ PIPE=$(mktemp -u)
|
|
|
+ # create a named pipe
|
|
|
+ mkfifo $PIPE
|
|
|
+ # need to get a bi-directional file descriptor first to prevent bash from blocking
|
|
|
+ exec {FD}<>$PIPE
|
|
|
+ exec {FD1}>$PIPE
|
|
|
+ exec {FD2}<$PIPE
|
|
|
+ # unlink the named pipe
|
|
|
+ rm $PIPE
|
|
|
+ # don't need this file descriptor anymore
|
|
|
+ exec {FD}>&-
|
|
|
+ #
|
|
|
+ CONTROLLER_BOUNDCB_FD=$FD1 ${CUDADL_PATH}/controller "${@:4}" &
|
|
|
+ CONTROLLER_PID=$!
|
|
|
+ trap "kill $CONTROLLER_PID ; exit" SIGINT
|
|
|
+ # the controller should close its write file descriptor, so we need to close ours
|
|
|
+ exec {FD1}>&-
|
|
|
+ #
|
|
|
+ BYTE1=$(head -c 1 <&$FD2)
|
|
|
+ BYTE2=$(head -c 1 <&$FD2)
|
|
|
+ BYTE1=$(LC_CTYPE=C printf '%d' "'$BYTE1")
|
|
|
+ BYTE2=$(LC_CTYPE=C printf '%d' "'$BYTE2")
|
|
|
+ PORT=$((BYTE2*256+BYTE1))
|
|
|
+ # is there no better way in bash?!
|
|
|
+ #
|
|
|
+ read IP <&$FD2
|
|
|
+ #
|
|
|
+ exec {FD2}<&-
|
|
|
+ #
|
|
|
+ sleep 10
|
|
|
+ # give the controller time to get ready
|
|
|
+ # not sure if needed, but hopefully it fixes a bug with workers disconnecting
|
|
|
+ #
|
|
|
+ echo "$IP $PORT" > $FILE_WITH_LOC
|
|
|
+ #
|
|
|
+ fi
|
|
|
+ #
|
|
|
+ COUNTER=0
|
|
|
+ START_DPNODE=1
|
|
|
+ while [ ! -f $FILE_WITH_LOC ] ; do
|
|
|
+ if [ $COUNTER -gt 60 ] ; then
|
|
|
+ # file still doesn't exist after 60 seconds
|
|
|
+ START_DPNODE=0
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ sleep 1
|
|
|
+ COUNTER=$((COUNTER+1))
|
|
|
+ done
|
|
|
+ #
|
|
|
+ if [ $START_DPNODE -eq 1 ] ; then
|
|
|
+ sleep 1 # to make sure it is done writing
|
|
|
+ read IP PORT < $FILE_WITH_LOC
|
|
|
+ #
|
|
|
+ OUTPUT_FILE="${OUTPUT_FILE_DIR}/dpnode_${SLURM_NODEID}_${SLURM_LOCALID}.out"
|
|
|
+ ${CUDADL_PATH}/dpnode $IP $PORT > "${OUTPUT_FILE}" 2>&1
|
|
|
+ fi
|
|
|
+ #
|
|
|
+ if [ -z "$CONTROLLER_PID" ] ; then
|
|
|
+ wait "$CONTROLLER_PID"
|
|
|
+ fi
|
|
|
+else
|
|
|
+ COUNTER=0
|
|
|
+ START_WORKER=1
|
|
|
+ while [ ! -f $FILE_WITH_LOC ] ; do
|
|
|
+ if [ $COUNTER -gt 60 ] ; then
|
|
|
+ # file still doesn't exist after 60 seconds
|
|
|
+ START_WORKER=0
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ sleep 1
|
|
|
+ COUNTER=$((COUNTER+1))
|
|
|
+ done
|
|
|
+ #
|
|
|
+ if [ $START_WORKER -eq 1 ] ; then
|
|
|
+ sleep 1 # to make sure it is done writing
|
|
|
+ read IP PORT < $FILE_WITH_LOC
|
|
|
+ #
|
|
|
+ WORKER_ID=$((SLURM_LOCALID-1))
|
|
|
+ #
|
|
|
+ OUTPUT_FILE="${OUTPUT_FILE_DIR}/worker_${SLURM_NODEID}_${WORKER_ID}.out"
|
|
|
+ ${CUDADL_PATH}/worker $IP $PORT $WORKER_ID > "${OUTPUT_FILE}" 2>&1
|
|
|
+ fi
|
|
|
+fi
|