#! /bin/bash
# Copyright Huawei Technologies Co., Ltd. 2022-2023. All rights reserved.
# 视频流云手机启动脚本配置文件，可配置云手机绑定的GPU、CPU、NUMA、编码卡、数据卷存放位置等

# 默认镜像名称，可根据需要自行修改
DOCKER_IMAGE=video:latest

# 云手机运行内存
RAM_SIZE_GB=6
# 云手机存储大小
STORAGE_SIZE_GB=16

# 云手机屏幕宽、高、密度三者要匹配，720p(720 1280 320)，1080p(1080 1920 480)
# 云手机屏幕宽度
BUILD_WIDTH=720
# 云手机屏幕高度
BUILD_HEIGHT=1280
# 云手机屏幕密度
BUILD_DENSITY=320
# 云手机屏幕刷新帧率
BUILD_FPS=30

# 云手机绑核方式 0：2容器2核(默认)；1：绑NUMA，每NUMA空前2个核
CPU_BIND_MODE=0

# GPU设备节点(XD 最多有4 * 4 = 16个渲染节点)
GPUS=(
    "/dev/dri/renderD128" "/dev/dri/renderD129" "/dev/dri/renderD130" "/dev/dri/renderD131"
    "/dev/dri/renderD132" "/dev/dri/renderD133" "/dev/dri/renderD134" "/dev/dri/renderD135"
    "/dev/dri/renderD136" "/dev/dri/renderD137" "/dev/dri/renderD138" "/dev/dri/renderD139"
    "/dev/dri/renderD140" "/dev/dri/renderD141" "/dev/dri/renderD142" "/dev/dri/renderD143"
)

# VPU设备节点(XD 最多有4 * 6 = 24个vpu节点)
VPUS=(
    "/dev/vpu0" "/dev/vpu1" "/dev/vpu2" "/dev/vpu3" "/dev/vpu4" "/dev/vpu5"
    "/dev/vpu6" "/dev/vpu7" "/dev/vpu8" "/dev/vpu9" "/dev/vpu10" "/dev/vpu11"
    "/dev/vpu12" "/dev/vpu13" "/dev/vpu14" "/dev/vpu15" "/dev/vpu16" "/dev/vpu17"
    "/dev/vpu18" "/dev/vpu19" "/dev/vpu20" "/dev/vpu21" "/dev/vpu22" "/dev/vpu23"
)

# 选择编码卡（0:T432 1:Quadra 2:瀚博）
ENCODECARD=0

# NETINT编码卡设备节点
NETINT0="/dev/nvme0,/dev/nvme0n1,/dev/nvme1,/dev/nvme1n1,/dev/nvme2,/dev/nvme2n1,/dev/nvme3,/dev/nvme3n1"
NETINT1="/dev/nvme4,/dev/nvme4n1,/dev/nvme5,/dev/nvme5n1,/dev/nvme6,/dev/nvme6n1,/dev/nvme7,/dev/nvme7n1"

# 数据卷存放位置
USERDATA="/home/mount"

# 128核4NUMA情况下，各NUMA内CPU核定义，用于云手机绑核策略中2容器2核的方式
MODE0_CPUS0=("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")
MODE0_CPUS1=("34,35" "36,37" "38,39" "40,41" "42,43" "44,45" "46,47" "48,49" "50,51" "52,53" "54,55" "56,57" "58,59" "60,61" "62,63")
MODE0_CPUS2=("66,67" "68,69" "70,71" "72,73" "74,75" "76,77" "78,79" "80,81" "82,83" "84,85" "86,87" "88,89" "90,91" "92,93" "94,95")
MODE0_CPUS3=("98,99" "100,101" "102,103" "104,105" "106,107" "108,109" "110,111" "112,113" "114,115" "116,117" "118,119" "120,121" "122,123" "124,125" "126,127")

# 128核4NUMA情况下，各NUMA内CPU核定义，用于云手机绑核策略中仅绑定NUMA的方式
MODE1_CPUS0="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"
MODE1_CPUS1="34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63"
MODE1_CPUS2="66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95"
MODE1_CPUS3="98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127"

# 128核4NUMA情况下，各NUMA平分后CPU核定义，用于XD云手机绑核策略中仅绑定NUMA的方式
MODE1_HALF_NUMA_CPUS0="2,3,4,5,6,7,8,9,10,11,12,13,14,15,16"
MODE1_HALF_NUMA_CPUS1="17,18,19,20,21,22,23,24,25,26,27,28,29,30,31"
MODE1_HALF_NUMA_CPUS2="34,35,36,37,38,39,40,41,42,43,44,45,46,47,48"
MODE1_HALF_NUMA_CPUS3="49,50,51,52,53,54,55,56,57,58,59,60,61,62,63"
MODE1_HALF_NUMA_CPUS4="66,67,68,69,70,71,72,73,74,75,76,77,78,79,80"
MODE1_HALF_NUMA_CPUS5="81,82,83,84,85,86,87,88,89,90,91,92,93,94,95"
MODE1_HALF_NUMA_CPUS6="98,99,100,101,102,103,104,105,106,107,108,109,110,111,112"
MODE1_HALF_NUMA_CPUS7="113,114,115,116,117,118,119,120,121,122,123,124,125,126,127"

# 96核4NUMA情况下，各NUMA内CPU核定义，用于云手机绑核策略中2容器2核的方式
MODE0_CPUS0_96=("2,3" "4,5" "6,7" "8,9" "10,11" "12,13" "14,15" "16,17" "18,19" "20,21" "22,23")
MODE0_CPUS1_96=("26,27" "28,29" "30,31" "34,35" "36,37" "38,39" "40,41" "42,43" "44,45" "46,47")
MODE0_CPUS2_96=("50,51" "52,53" "54,55" "56,57" "58,59" "60,61" "62,63" "66,67" "68,69" "70,71")
MODE0_CPUS3_96=("74,75" "76,77" "78,79" "80,81" "82,83" "84,85" "86,87" "88,89" "90,91" "92,93" "94,95")

# 96核4NUMA情况下，各NUMA内CPU核定义，用于云手机绑核策略中仅绑定NUMA的方式
MODE1_CPUS0_96="2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
MODE1_CPUS1_96="26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47"
MODE1_CPUS2_96="50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71"
MODE1_CPUS3_96="74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95"

# Vsync信号偏移量定义，用于Vsync信号均衡优化
VSYNC_OFFSET0="0"
VSYNC_OFFSET1="16000000"
VSYNC_OFFSET2="8000000"
VSYNC_OFFSET3="24000000"

VIDEO_CPU_MAP_128CORE_MODE0=(
    "${MODE0_CPUS0[0]}"
    "${MODE0_CPUS2[0]}"
    "${MODE0_CPUS1[0]}"
    "${MODE0_CPUS3[0]}"
    "${MODE0_CPUS0[1]}"
    "${MODE0_CPUS2[1]}"
    "${MODE0_CPUS1[1]}"
    "${MODE0_CPUS3[1]}"
    "${MODE0_CPUS0[2]}"
    "${MODE0_CPUS2[2]}"
    "${MODE0_CPUS1[2]}"
    "${MODE0_CPUS3[2]}"
    "${MODE0_CPUS0[3]}"
    "${MODE0_CPUS2[3]}"
    "${MODE0_CPUS1[3]}"
    "${MODE0_CPUS3[3]}"
    "${MODE0_CPUS0[4]}"
    "${MODE0_CPUS2[4]}"
    "${MODE0_CPUS1[4]}"
    "${MODE0_CPUS3[4]}"
    "${MODE0_CPUS0[5]}"
    "${MODE0_CPUS2[5]}"
    "${MODE0_CPUS1[5]}"
    "${MODE0_CPUS3[5]}"
    "${MODE0_CPUS0[6]}"
    "${MODE0_CPUS2[6]}"
    "${MODE0_CPUS1[6]}"
    "${MODE0_CPUS3[6]}"
    "${MODE0_CPUS0[7]}"
    "${MODE0_CPUS2[7]}"
    "${MODE0_CPUS1[7]}"
    "${MODE0_CPUS3[7]}"
    "${MODE0_CPUS0[8]}"
    "${MODE0_CPUS2[8]}"
    "${MODE0_CPUS1[8]}"
    "${MODE0_CPUS3[8]}"
    "${MODE0_CPUS0[9]}"
    "${MODE0_CPUS2[9]}"
    "${MODE0_CPUS1[9]}"
    "${MODE0_CPUS3[9]}"
    "${MODE0_CPUS0[10]}"
    "${MODE0_CPUS2[10]}"
    "${MODE0_CPUS1[10]}"
    "${MODE0_CPUS3[10]}"
    "${MODE0_CPUS0[11]}"
    "${MODE0_CPUS2[11]}"
    "${MODE0_CPUS1[11]}"
    "${MODE0_CPUS3[11]}"
    "${MODE0_CPUS0[12]}"
    "${MODE0_CPUS2[12]}"
    "${MODE0_CPUS1[12]}"
    "${MODE0_CPUS3[12]}"
    "${MODE0_CPUS0[13]}"
    "${MODE0_CPUS2[13]}"
    "${MODE0_CPUS1[13]}"
    "${MODE0_CPUS3[13]}"
    "${MODE0_CPUS0[14]}"
    "${MODE0_CPUS2[14]}"
    "${MODE0_CPUS1[14]}"
    "${MODE0_CPUS3[14]}"
)

VIDEO_CPU_MAP_128CORE_MODE1=(
    "${MODE1_CPUS0}"
    "${MODE1_CPUS2}"
    "${MODE1_CPUS1}"
    "${MODE1_CPUS3}"
)

# XD GPU内核驱动CPU占用较高，且亲和NUMA0和NUMA2，因此需要在NUMA间进行负载均衡
VIDEO_XD_CPU_MAP_128CORE_MODE1=(
    "${MODE1_HALF_NUMA_CPUS0}"
    "${MODE1_HALF_NUMA_CPUS4}"
    "${MODE1_HALF_NUMA_CPUS1}"
    "${MODE1_HALF_NUMA_CPUS5}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    "${MODE1_HALF_NUMA_CPUS0}"
    "${MODE1_HALF_NUMA_CPUS4}"
    "${MODE1_HALF_NUMA_CPUS1}"
    "${MODE1_HALF_NUMA_CPUS5}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    "${MODE1_HALF_NUMA_CPUS0}"
    "${MODE1_HALF_NUMA_CPUS4}"
    "${MODE1_HALF_NUMA_CPUS1}"
    "${MODE1_HALF_NUMA_CPUS5}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    "${MODE1_HALF_NUMA_CPUS0}"
    "${MODE1_HALF_NUMA_CPUS4}"
    "${MODE1_HALF_NUMA_CPUS1}"
    "${MODE1_HALF_NUMA_CPUS5}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    "${MODE1_HALF_NUMA_CPUS0}"
    "${MODE1_HALF_NUMA_CPUS4}"
    "${MODE1_HALF_NUMA_CPUS1}"
    "${MODE1_HALF_NUMA_CPUS5}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    "${MODE1_HALF_NUMA_CPUS0}"
    "${MODE1_HALF_NUMA_CPUS4}"
    "${MODE1_HALF_NUMA_CPUS1}"
    "${MODE1_HALF_NUMA_CPUS5}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    "${MODE1_HALF_NUMA_CPUS0}"
    "${MODE1_HALF_NUMA_CPUS4}"
    "${MODE1_HALF_NUMA_CPUS1}"
    "${MODE1_HALF_NUMA_CPUS5}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    # 每64路中，从NUMA0上移动2路到NUMA1，从NUMA2上移动2路到NUMA4，达到负载均衡的目的
    # 即64路中，各NUMA上路数分配为：14+18+14+18=64
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
    "${MODE1_HALF_NUMA_CPUS2}"
    "${MODE1_HALF_NUMA_CPUS6}"
    "${MODE1_HALF_NUMA_CPUS3}"
    "${MODE1_HALF_NUMA_CPUS7}"
)

# 7265/7260(128核) AMD GPU 2张卡配置，对应2个设备节点，循环使用
VIDEO_GPU_MAP_AMD2_128CORE=(
    "${GPUS[0]}"
    "${GPUS[1]}"
)

# 7265/7260(128核) AMD GPU 1张卡配置，只要服务器上GPU数量不为2，均采用此配置，用户可自行在此配置中添加GPU设备节点
VIDEO_GPU_MAP_AMD1_128CORE=(
    "${GPUS[0]}"
)

VIDEO_ENC_MAP_128CORE=(
    "${NETINT0}"
    "${NETINT1}"
)

VIDEO_USERDATA_MAP_128CORE=(
    "${USERDATA}"
)

VIDEO_VSYNC_OFFSET_MAP_AMD2_128CORE=(
    "${VSYNC_OFFSET0}"
    "${VSYNC_OFFSET2}"
    "${VSYNC_OFFSET1}"
    "${VSYNC_OFFSET3}"
)

VIDEO_VSYNC_OFFSET_MAP_AMD1_128CORE=(
    "${VSYNC_OFFSET0}"
    "${VSYNC_OFFSET1}"
)

VIDEO_CPU_MAP_96CORE_MODE0=(
    "${MODE0_CPUS0_96[0]}"
    "${MODE0_CPUS2_96[0]}"
    "${MODE0_CPUS1_96[0]}"
    "${MODE0_CPUS3_96[0]}"
    "${MODE0_CPUS0_96[1]}"
    "${MODE0_CPUS2_96[1]}"
    "${MODE0_CPUS1_96[1]}"
    "${MODE0_CPUS3_96[1]}"
    "${MODE0_CPUS0_96[2]}"
    "${MODE0_CPUS2_96[2]}"
    "${MODE0_CPUS1_96[2]}"
    "${MODE0_CPUS3_96[2]}"
    "${MODE0_CPUS0_96[3]}"
    "${MODE0_CPUS2_96[3]}"
    "${MODE0_CPUS1_96[3]}"
    "${MODE0_CPUS3_96[3]}"
    "${MODE0_CPUS0_96[4]}"
    "${MODE0_CPUS2_96[4]}"
    "${MODE0_CPUS1_96[4]}"
    "${MODE0_CPUS3_96[4]}"
    "${MODE0_CPUS0_96[5]}"
    "${MODE0_CPUS2_96[5]}"
    "${MODE0_CPUS1_96[5]}"
    "${MODE0_CPUS3_96[5]}"
    "${MODE0_CPUS0_96[6]}"
    "${MODE0_CPUS2_96[6]}"
    "${MODE0_CPUS1_96[6]}"
    "${MODE0_CPUS3_96[6]}"
    "${MODE0_CPUS0_96[7]}"
    "${MODE0_CPUS2_96[7]}"
    "${MODE0_CPUS1_96[7]}"
    "${MODE0_CPUS3_96[7]}"
    "${MODE0_CPUS0_96[8]}"
    "${MODE0_CPUS2_96[8]}"
    "${MODE0_CPUS1_96[8]}"
    "${MODE0_CPUS3_96[8]}"
    "${MODE0_CPUS0_96[9]}"
    "${MODE0_CPUS2_96[9]}"
    "${MODE0_CPUS1_96[9]}"
    "${MODE0_CPUS3_96[9]}"
    "${MODE0_CPUS0_96[10]}"
    "${MODE0_CPUS2_96[10]}"
    "${MODE0_CPUS1_96[10]}"
    "${MODE0_CPUS3_96[10]}"
)

VIDEO_CPU_MAP_96CORE_MODE1=(
    "${MODE1_CPUS0_96}"
    "${MODE1_CPUS2_96}"
    "${MODE1_CPUS1_96}"
    "${MODE1_CPUS3_96}"
)

# 5250(96核) AMD GPU 2张卡配置，对应2个设备节点，循环使用
VIDEO_GPU_MAP_AMD2_96CORE=(
    "${GPUS[0]}"
    "${GPUS[1]}"
)

# 5250(96核) AMD GPU 1张卡配置，只要服务器上GPU数量不为2，均采用此配置，用户可自行在此配置中添加GPU设备节点
VIDEO_GPU_MAP_AMD1_96CORE=(
    "${GPUS[0]}"
)

# 7260(128核) XD GPU 4张卡配置，每张卡4个设备节点，总共16个设备节点，循环使用
VIDEO_GPU_MAP_XD4_128CORE=(
    "${GPUS[0]}"
    "${GPUS[8]}"
    "${GPUS[4]}"
    "${GPUS[12]}"
    "${GPUS[1]}"
    "${GPUS[9]}"
    "${GPUS[5]}"
    "${GPUS[13]}"
    "${GPUS[2]}"
    "${GPUS[10]}"
    "${GPUS[6]}"
    "${GPUS[14]}"
    "${GPUS[3]}"
    "${GPUS[11]}"
    "${GPUS[7]}"
    "${GPUS[15]}"
)

# 7260(128核) XD VPU编码节点 4张卡配置，每张卡4个编码节点，2个解码节点（暂不使用），总共16个编码节点
VIDEO_VPU_MAP_XD4_128CORE=(
    "${VPUS[0]}"
    "${VPUS[12]}"
    "${VPUS[6]}"
    "${VPUS[18]}"
    "${VPUS[1]}"
    "${VPUS[13]}"
    "${VPUS[7]}"
    "${VPUS[19]}"
    "${VPUS[2]}"
    "${VPUS[14]}"
    "${VPUS[8]}"
    "${VPUS[20]}"
    "${VPUS[3]}"
    "${VPUS[15]}"
    "${VPUS[9]}"
    "${VPUS[21]}"
)

# 7260(128核) XD GPU 2张卡配置，每张卡4个设备节点，总共8个设备节点
VIDEO_GPU_MAP_XD2_128CORE=(
    "${GPUS[0]}"
    "${GPUS[4]}"
    "${GPUS[1]}"
    "${GPUS[5]}"
    "${GPUS[2]}"
    "${GPUS[6]}"
    "${GPUS[3]}"
    "${GPUS[7]}"
)

# 7260(128核) XD VPU编码节点 2张卡配置，每张卡4个编码节点，2个解码节点（暂不使用），总共8个编码节点
VIDEO_VPU_MAP_XD2_128CORE=(
    "${VPUS[0]}"
    "${VPUS[6]}"
    "${VPUS[1]}"
    "${VPUS[7]}"
    "${VPUS[2]}"
    "${VPUS[8]}"
    "${VPUS[3]}"
    "${VPUS[9]}"
)

# 7260(128核) XD GPU 1张卡配置，每张卡4个设备节点，总共4个设备节点
VIDEO_GPU_MAP_XD1_128CORE=(
    "${GPUS[0]}"
    "${GPUS[1]}"
    "${GPUS[2]}"
    "${GPUS[3]}"
)

# 7260(128核) XD VPU编码节点 1张卡配置，每张卡4个编码节点，2个解码节点（暂不使用），总共4个编码节点
VIDEO_VPU_MAP_XD1_128CORE=(
    "${VPUS[0]}"
    "${VPUS[1]}"
    "${VPUS[2]}"
    "${VPUS[3]}"
)

VIDEO_ENC_MAP_96CORE=(
    "${NETINT0}"
    "${NETINT1}"
)

VIDEO_USERDATA_MAP_96CORE=(
    "${USERDATA}"
)

VIDEO_VSYNC_OFFSET_MAP_AMD2_96CORE=(
    "${VSYNC_OFFSET0}"
    "${VSYNC_OFFSET2}"
    "${VSYNC_OFFSET1}"
    "${VSYNC_OFFSET3}"
)

VIDEO_VSYNC_OFFSET_MAP_AMD1_96CORE=(
    "${VSYNC_OFFSET0}"
    "${VSYNC_OFFSET1}"
)

VIDEO_CPU_MAP_64CORE_MODE0=(
    "${MODE0_CPUS0[0]}"
    "${MODE0_CPUS1[0]}"
    "${MODE0_CPUS0[1]}"
    "${MODE0_CPUS1[1]}"
    "${MODE0_CPUS0[2]}"
    "${MODE0_CPUS1[2]}"
    "${MODE0_CPUS0[3]}"
    "${MODE0_CPUS1[3]}"
    "${MODE0_CPUS0[4]}"
    "${MODE0_CPUS1[4]}"
    "${MODE0_CPUS0[5]}"
    "${MODE0_CPUS1[5]}"
    "${MODE0_CPUS0[6]}"
    "${MODE0_CPUS1[6]}"
    "${MODE0_CPUS0[7]}"
    "${MODE0_CPUS1[7]}"
    "${MODE0_CPUS0[8]}"
    "${MODE0_CPUS1[8]}"
    "${MODE0_CPUS0[9]}"
    "${MODE0_CPUS1[9]}"
    "${MODE0_CPUS0[10]}"
    "${MODE0_CPUS1[10]}"
    "${MODE0_CPUS0[11]}"
    "${MODE0_CPUS1[11]}"
    "${MODE0_CPUS0[12]}"
    "${MODE0_CPUS1[12]}"
    "${MODE0_CPUS0[13]}"
    "${MODE0_CPUS1[13]}"
    "${MODE0_CPUS0[14]}"
    "${MODE0_CPUS1[14]}"
)

VIDEO_CPU_MAP_64CORE_MODE1=(
    "${MODE1_CPUS0}"
    "${MODE1_CPUS1}"
)

# 5220(64核) AMD GPU 1张卡配置，对应1个设备节点
VIDEO_GPU_MAP_64CORE=(
    "${GPUS[0]}"
)
# 5220(64核) NETINT编码卡 1张卡配置，对应1组设备节点
VIDEO_ENC_MAP_64CORE=(
    "${NETINT0}"
)

VIDEO_USERDATA_MAP_64CORE=(
    "${USERDATA}"
)

VIDEO_VSYNC_OFFSET_MAP_64CORE=(
    "${VSYNC_OFFSET0}"
    "${VSYNC_OFFSET1}"
)
