File size: 1,427 Bytes
23e02ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env bash
set -euo pipefail

# Run one physical node's chunk for a given wave.
#
# Mapping:
#   chunk_index = WAVE_INDEX * ACTUAL_NODES + NODE_RANK
#
# This lets a smaller number of real nodes process a larger plan in multiple
# waves without changing the underlying generation code.

ACTUAL_NODES=${ACTUAL_NODES:?Set ACTUAL_NODES to the number of real compute nodes available in this wave.}
NODE_RANK=${NODE_RANK:-${SLURM_ARRAY_TASK_ID:-0}}
WAVE_INDEX=${WAVE_INDEX:?Set WAVE_INDEX, starting from 0.}
TOTAL_MATERIALS=${TOTAL_MATERIALS:-9046}
CHUNK_SIZE=${CHUNK_SIZE:?Set CHUNK_SIZE to the best single-node material count.}

if (( ACTUAL_NODES <= 0 )); then
  echo "ERROR: ACTUAL_NODES must be positive." >&2
  exit 2
fi
if (( NODE_RANK < 0 || NODE_RANK >= ACTUAL_NODES )); then
  echo "ERROR: NODE_RANK=${NODE_RANK} must be in [0, ACTUAL_NODES)." >&2
  exit 2
fi

NODE_INDEX=$((WAVE_INDEX * ACTUAL_NODES + NODE_RANK))
FIRST_IDX=$((NODE_INDEX * CHUNK_SIZE))

if (( FIRST_IDX >= TOTAL_MATERIALS )); then
  echo "Wave node has no work:"
  echo "  WAVE_INDEX=${WAVE_INDEX}"
  echo "  ACTUAL_NODES=${ACTUAL_NODES}"
  echo "  NODE_RANK=${NODE_RANK}"
  echo "  NODE_INDEX=${NODE_INDEX}"
  echo "  FIRST_IDX=${FIRST_IDX}"
  echo "  TOTAL_MATERIALS=${TOTAL_MATERIALS}"
  exit 0
fi

export NODE_INDEX TOTAL_MATERIALS CHUNK_SIZE

ROOT=${ROOT:-/workspace/mp_20_pxrdnet}
bash "${ROOT}/cpu_multinode_generation/run_node_chunk.sh"