function scan_devices() {
for d in $(ls /sys/class/infiniband/) ; do
for d in "${allocDevs[@]}" ; do
for p in $(ls /sys/class/infiniband/$d/ports/) ; do
for g in $(ls /sys/class/infiniband/$d/ports/$p/gids/) ; do
gid=$(cat /sys/class/infiniband/$d/ports/$p/gids/$g);
if [ $(echo $gid | cut -d ":" -f -1) != "0000" ] ; then
if [ $gid = 0000:0000:0000:0000:0000:0000:0000:0000 ] ; then
RoCEVer=$(cat /sys/class/infiniband/$d/ports/$p/gid_attrs/types/$g 2>/dev/null| grep -o "[Vv].*")
if [ ${RoCEVer,,} != "v2" ]; then
ethDev=$(cat /sys/class/infiniband/$d/ports/$p/gid_attrs/ndevs/$g 2>/dev/null)
if [[ ! -f /sys/class/net/$ethDev/dev_id ]] || [[ ! -f /sys/class/net/$ethDev/carrier ]] || (( ! $(cat /sys/class/net/$ethDev/carrier 2> /dev/null) == 1 )); then
mtu=$(cat /sys/class/net/$ethDev/mtu 2>/dev/null)
if [[ -z "$mtu" ]] || (( mtu <= 1500 )); then
echo "Not found RDMA device, list devices error"
function export_nccl_env() {
echo "Not found RDMA device, get max rate device error"
for ((i=0; i<${#devs[@]}; i+=1)); do
rate=$(cat /sys/class/infiniband/${devs[i]}/ports/${ports[i]}/rate 2>/dev/null|cut -f 1 -d " ")
if [[ -z "$rdmaRate" ]] || [[ "$rate" -gt "$rdmaRate" ]]; then
elif [[ "$rate" == "$rdmaRate" ]]; then
rdmaPorts+=(${ports[i]})
if [[ "$rdmaIdx" != "${idxes[i]}" ]]; then
rdmaErr="rdma devs index inconsistent"
if [[ -n $rdmaErr ]]; then
for ((i=0; i<${#rdmaDevs[@]}; i+=1)); do
hca+=("${rdmaDevs[i]}:${rdmaPorts[i]}")
export NCCL_IB_HCA=${hca[*]}
export NCCL_IB_GID_INDEX=$rdmaIdx