| 1 | set -u |
| 2 | SLOTS="${CPU_RUN_SLOTS:-3}" |
| 3 | THREADS="${CPU_RUN_THREADS:-3}" |
| 4 | MAXWAIT="${CPU_RUN_MAXWAIT:-3600}" |
| 5 | DIR="${CPU_RUN_SLOT_DIR:-/tmp/cpu_run_slots}" |
| 6 | mkdir -p "$DIR" 2>/dev/null || true |
| 7 | |
| 8 | export CPU_RUN_ACTIVE=1 |
| 9 | export OMP_NUM_THREADS="$THREADS" OPENBLAS_NUM_THREADS="$THREADS" MKL_NUM_THREADS="$THREADS" \ |
| 10 | NUMEXPR_NUM_THREADS="$THREADS" VECLIB_MAXIMUM_THREADS="$THREADS" |
| 11 | |
| 12 | run() { |
| 13 | if command -v ionice >/dev/null 2>&1; then |
| 14 | exec nice -n 15 ionice -c3 "$@" |
| 15 | else |
| 16 | exec nice -n 15 "$@" |
| 17 | fi |
| 18 | } |
| 19 | |
| 20 | waited=0 |
| 21 | while :; do |
| 22 | for i in $(seq 1 "$SLOTS"); do |
| 23 | exec 9>"$DIR/slot$i" |
| 24 | if flock -n 9; then |
| 25 | echo "[cpu_run] slot $i/$SLOTS acquired (threads=$THREADS, nice 15) → $*" >&2 |
| 26 | run "$@" |
| 27 | fi |
| 28 | exec 9>&- |
| 29 | done |
| 30 | if [ "$waited" -ge "$MAXWAIT" ]; then |
| 31 | echo "[cpu_run] all $SLOTS slots busy ${MAXWAIT}s - running un-slotted (still capped+nice'd): $*" >&2 |
| 32 | run "$@" |
| 33 | fi |
| 34 | sleep 2; waited=$((waited+2)) |
| 35 | done |