cuMAC-CP API 消息#
本节介绍 cuMAC-CP API 消息格式。它定义了 PHY API 消息头、消息体以及与 cuMAC-CP API 关联的错误代码。
cuMAC-CP API 消息包括 2 种类型:配置程序消息和时隙程序消息。这两种消息都以如下表所示的通用头开始
字段 |
类型 |
描述 |
---|---|---|
message_count |
uint8_t |
PHY API 消息中包含的消息数 |
handle_id |
uint8_t |
不透明句柄(目的未定义,但用法可能包括 PHY ID 或载波 ID) |
type_id |
uint16_t |
消息类型 ID |
body_len |
uint32_t |
消息体长度(字节) |
所有消息 ID 如下所示。
消息 |
值 |
消息体定义 |
---|---|---|
CONFIG.request |
0x02 |
|
CONFIG.response |
0x03 |
|
START.request |
0x04 |
|
STOP.request |
0x05 |
|
STOP.response |
0x06 |
|
ERROR.indication |
0x07 |
TODO |
START.response |
0x08 |
|
保留 |
0x09-0x7F |
|
SCH_TTI.request |
0x82 |
|
TTI_END |
0x83 |
|
SCH_TTI.response |
0x8F |
|
TTI_ERR.indication |
0x90 |
TODO |
保留 |
0x91-0xFF |
配置程序消息#
配置程序消息后跟配置消息体。
CONFIG.request#
CONFIG.request
消息体在每个小区的 cuMAC 消息定义中定义。
字段 |
类型 |
描述 |
---|---|---|
nMaxCell |
uint8_t |
小区组中最大小区数的常整数。 值:0 -> 255 |
nMaxActUePerCell |
uint16_t |
每个小区最大活动 UE 数的常整数。 值:0 -> 65535 |
nMaxSchUePerCell |
uint8_t |
每个小区每个 TTI 可以调度的最大 UE 数的常整数。 值:0 -> 255 |
nMaxPrg |
uint16_t |
每个小区中分配的最大 PRG 数的常整数 值:0 -> 65535 |
nPrbPerPrg |
uint8_t |
每个 PRG(PRB 组)的 PRB 数的常整数 值:0 -> 255 |
nMaxBsAnt |
uint8_t |
最大 BS 天线端口数的常整数。 值:0 -> 255 |
nMaxUeAnt |
uint8_t |
最大 UE 天线端口数的常整数。 值:0 -> 255 |
scSpacing |
uint32_t |
载波的子载波间隔。 值:15000、30000、60000、120000 (Hz) |
allocType |
uint8_t |
类型 0 或类型 1 PRG 分配的指示符。 值 0:类型 0 分配 1:类型 1 分配 |
precoderType |
uint8_t |
预编码器类型的指示符。 值 0:无预编码 1:SVD 预编码 |
receiverType |
uint8_t |
接收器类型的指示符。 值 0:MMSE 接收器 1:MMSE-IRC 接收器 |
colMajChanAccess |
uint8_t |
指示估计的窄带 SRS 信道矩阵是以列优先顺序还是行优先顺序存储。 值 0:行优先 1:列优先 |
betaCoeff |
float |
用于调整多小区调度中小区边缘 UE 性能的系数。 值:非负实数。默认值为 1.0,表示纯比例公平调度。 |
sinValThr |
float |
层选择的奇异值阈值。 值:(0, 1) 之间。默认值为 0.1 |
corrThr |
float |
层选择的信道向量相关值阈值。 值:(0, 1) 之间。默认值为 0.5 |
prioWeightStep |
uint16_t |
如果 UE 未被调度,则每个 TTI 的 UE 优先级权重增量的步长大小。用于基于优先级的 UE 选择。 值:0 -> 65535。默认值为 100 |
CONFIG.response#
消息体如下所示。
字段 |
类型 |
描述 |
---|---|---|
error_code |
uint8_t |
0:无错误。其他:待定 |
START.request#
消息体如下所示。
字段 |
类型 |
描述 |
---|---|---|
start_param |
uint8_t |
保留,尚未使用。 |
START.response#
消息体如下所示。
字段 |
类型 |
描述 |
---|---|---|
error_code |
uint8_t |
0:无错误。其他:待定 |
时隙程序消息#
时隙程序具有如下表所示的附加 SFN/SLOT 标头,然后是时隙消息体。
名称 |
类型 |
描述 |
---|---|---|
sfn |
uint16_t |
SFN 编号 |
slot |
uint16_t |
SLOT 编号 |
SCH_TTI.request#
字段 |
类型 |
描述 |
---|---|---|
taskBitMask |
uint32_t |
指示要调度的 cuMAC 任务。每个位代表 1 种任务类型 0x01:multiCellUeSelection 0x02:multiCellScheduler 0x04:multiCellLayerSel 0x08:mcsSelectionLUT 值:0x1、0x3、0x7、0xF |
cellID |
uint16_t |
小区 ID。 值:0 -> 65535 |
ULDLSch |
uint8_t |
UL/DL 调度的指示。 值 0:UL 调度 1:DL 调度 |
nActiveUe |
uint16_t |
小区中活动 UE 的总数。 值:0 -> 65535 |
nSrsUe |
uint16_t |
小区中已刷新 SRS 信道估计的 UE 数。 值:0 -> 65535 |
nPrbGrp |
uint16_t |
当前 TTI 可分配的 PRG 数,不包括为 HARQ 重传保留的 PRG。 值:0 -> nMaxPrg |
nBsAnt |
uint8_t |
BS 天线端口数。 值:0 -> nMaxBsAnt |
nUeAnt |
uint8_t |
UE 天线端口数。 值:0 -> nMaxUeAnt |
sigmaSqrd |
float |
噪声方差。 值:以瓦特为单位的噪声方差值 |
offsets |
struct |
每个数据的缓冲区偏移量 0xFFFFFFFF:未使用缓冲区(无效)。 其他:基于 nvipc data_buf 的缓冲区偏移量 |
数据缓冲区填充在 NVIPC DATA 缓冲区中。“offsets”结构定义了所有缓冲区的缓冲区偏移量。
注意:并非所有缓冲区都使用。未使用的缓冲区的偏移量应设置为 0xFFFFFFFF
。对于每种任务类型,所需缓冲区在下表中列出。
偏移量名称 |
偏移量类型 |
缓冲区描述 |
---|---|---|
CRNTI |
uint32_t |
小区中所有活动 UE 的 C-RNTI |
srsCRNTI |
uint32_t |
小区中已刷新 SRS 信道估计的 UE 的 C-RNTI。 |
prgMsk |
uint32_t |
每个 PRG 的可用性位图,用于分配 |
postEqSinr |
uint32_t |
小区中所有活动 UE 的每个 PRG、每层后均衡器 SINR 数组 |
wbSinr |
uint32_t |
小区中所有活动 UE 的宽带每层后均衡器 SINR 数组 |
estH_fr |
uint32_t |
对于 FP32。小区中所有活动 UE 的子带(每 PRG)SRS 信道估计系数数组 |
estH_fr_half |
uint32_t |
对于 FP16。小区中所有活动 UE 的子带(每 PRG)SRS 信道估计系数数组 |
prdMat |
uint32_t |
小区中所有活动 UE 的预编码器/波束成形权重数组 |
detMat |
uint32_t |
小区中所有活动 UE 的检测器/波束成形权重数组 |
sinVal |
uint32_t |
从信道矩阵的 SVD 获得的每个 UE、每个 PRG、每层奇异值数组 |
avgRatesActUe |
uint32_t |
小区中所有活动 UE 的长期平均数据速率数组 |
prioWeightActUe |
uint32_t |
用于基于优先级的 UE 选择。小区中所有活动 UE 的优先级权重 |
tbErrLastActUe |
uint32_t |
小区中所有活动 UE 的 TB 解码错误指示符 |
newDataActUe |
uint32_t |
小区中所有活动 UE 的初始传输/重传指示符 |
allocSolLastTxActUe |
uint32_t |
小区中所有活动 UE 的上次传输的 PRG 分配解决方案 |
mcsSelSolLastTxActUe |
uint32_t |
小区中所有活动 UE 的上次传输的 MCS 选择解决方案 |
layerSelSolLastTxActUe |
uint32_t |
小区中所有活动 UE 的上次传输的层选择解决方案 |
数据缓冲区详细信息如下所述。
字段 |
类型 |
描述 |
---|---|---|
CRNTI |
uint16_t[nActiveUe] |
小区中所有活动 UE 的 C-RNTI。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 CRNTI[uIdx] 是第 uIdx 个活动 UE 的 C-RNTI。 |
srsCRNTI |
uint16_t[nSrsUe] |
小区中已刷新 SRS 信道估计的 UE 的 C-RNTI。 每个元素的值 将 uIdx = 0, 1, …, nSrsUe-1 表示为小区中具有刷新 SRS 的 UE 的索引。 srsCRNTI[uIdx] 是第 uIdx 个 UE 的 C-RNTI。 |
prgMsk |
uint8_t[nPrbGrp] |
位图,指示每个 PRG 的可用性以进行分配。 每个元素的值 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引 prgMsk[prgIdx] 是第 prgIdx 个 PRG 的可用性指示符。 0 - 不可用,1 - 可用 |
postEqSinr |
float[nActiveUe* nPrbGrp*nUeAnt] |
小区中所有活动 UE 的每个 PRG、每层后均衡器 SINR 数组。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引。 将 layerIdx = 0, 1, …, nUeAnt-1 表示为层索引。 post EqSinr[uIdx*nPrbGrp*nUeAnt + prgIdx*nUeAnt + layerIdx] 是第 uIdx 个活动 UE 在第 prgIdx 个 PRG 和第 layerIdx 层上的后均衡器 SINR。 |
wbSinr |
float[nActiveUe*nUeAnt] |
小区中所有活动 UE 的宽带每层后均衡器 SINR 数组。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 将 layerIdx = 0, 1, …, nUeAnt-1 表示为层索引。 wbSinr[uIdx*nUeAnt + layerIdx] 是第 uIdx 个活动 UE 在第 layerIdx 层上的宽带后均衡器 SINR。 |
对于 FP32 estH_fr 对于 FP16 estH_fr_half |
对于 FP32 cuComplex[nSrsUe*nPrbGrp* nBsAnt*nUeAnt] 对于 FP16 __nv_bfloat162[nSrsUe* nPrbGrp*nBsAnt*nUeAnt] |
小区中刷新的子带(每 PRG)SRS 信道估计数组。 每个元素的值 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引。 将 uIdx = 0, 1, …, nSrsUe-1 表示为小区中具有刷新 SRS 的 UE 的索引。 将 bsAntIdx = 0, 1, …, nBsAnt-1 表示为 BS 天线端口索引 将 ueAntIdx = 0, 1, …, nUeAnt 表示为 UE 天线端口索引 estH_fr[p rgIdx*nSrsUe*nBsAnt*nUeAnt + uIdx*nBsAnt*nUeAnt + bsAntIdx*nUeAnt + ueAntIdx] 是第 uIdx 个 UE 在第 prgIdx 个 PRG、第 bsAntIdx 个 BS 天线端口和第 ueAntIdx 个 UE 天线端口上的复信道系数。 (以上也适用于 FP16 版本) |
prdMat |
对于 DL cuComplex[nSrsUe*nPrbGrp* nBsAnt*nBsAnt] 对于 UL cuComplex[nSrsUe*nPrbGrp* nUeAnt*nUeAnt] |
小区中已刷新 SRS 信道估计的 UE 的预编码器/波束成形权重数组。 每个元素的值 (对于 DL) 将 uIdx = 0, 1, …, nSrsUe-1 表示为小区中具有刷新 SRS 的 UE 的索引。 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引。 将 inPortIdx = 0, 1, …, nBsAnt-1 表示为预编码器输入端口索引 将 outPortIdx = 0, 1, …, nBsAnt-1 表示为预编码器输出端口索引 prdMat[ uIdx*nPrbGrp*nBsAnt*nBsAnt + prgIdx* nBsAnt*nBsAnt + inPortIdx*nBsAnt + outPortIdx] 是第 uIdx 个 UE 在第 prgIdx 个 PRG 上且在第 inPortIdx 个输入端口和第 outPortIdx 个输出端口之间的预编码器/波束成形权重。 (对于 UL,在以上描述中将 nBsAnt 替换为 nUeAnt) |
detMat |
对于 DL cuComplex[nSrsUe* nPrbGrp*nUeAnt*nUeAnt] 对于 UL cuComplex[nSrsUe* nPrbGrp*nBsAnt*nBsAnt] |
小区中已刷新 SRS 信道估计的 UE 的检测器/波束成形权重数组。 每个元素的值 (对于 DL) 将 uIdx = 0, 1, …, nSrsUe-1 表示为小区中具有刷新 SRS 的 UE 的索引。 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引。 将 inPortIdx = 0, 1, …, nUeAnt-1 表示为检测器输入端口索引。 将 outPortIdx = 0, 1, …, nUeAnt-1 表示为检测器输出端口索引。 detMat[ uIdx*nPrbGrp*nUeAnt*nUeAnt + prgIdx*nUeAnt*nUeAnt + inPortIdx*nUeAnt + outPortIdx] 是第 uIdx 个 UE 在第 prgIdx 个 PRG 上且在第 inPortIdx 个输入端口和第 outPortIdx 个输出端口之间的检测器权重。 (对于 UL,在以上描述中将 nUeAnt 替换为 nBsAnt) |
sinVal |
float[nSrsUe*nPrbGrp*nUeAnt] |
从刷新的 SRS 信道矩阵的 SVD 获得的每个 UE、每个 PRG、每层奇异值数组。 每个元素的值 将 uIdx = 0, 1, …, nSrsUe-1 表示为小区中具有刷新 SRS 的 UE 的索引。 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引。 将 layerIdx = 0, 1, …, nUeAnt-1 表示为层索引。 sinVal[uIdx*nPrbGrp*nUeAnt + prgIdx*nUeAnt + layerIdx] 是第 uIdx 个 UE 在第 prgIdx 个 PRG 上的第 layerIdx 个最大奇异值。 对于每个 UE 和每个 PRG,奇异值按降序存储。 |
avgRatesActUe |
float[nActiveUe] |
小区中所有活动 UE 的长期平均数据速率数组。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 avgRatesActUe[uIdx] 是第 uIdx 个活动 UE 在小区中的长期平均吞吐量。 |
prioWeightActUe |
uint16_t[nActiveUe] |
用于基于优先级的 UE 选择。小区中所有活动 UE 的优先级权重。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 prioWeightActUe[uIdx] 是第 uIdx 个活动 UE 的优先级权重。 0xFFFF 表示无效元素。 |
tbErrLastActUe |
int8_t[nActiveUe] |
小区中所有活动 UE 的 TB 解码错误指示符。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 tbErrLastActUe[uIdx] 是第 uIdx 个活动 UE 的 TB 解码错误指示符 -1 - 上次传输不是新传输(是重传) 0 - 正确解码 1 - 解码错误 ** 注意,如果 UE 的上次传输不是新传输,则该 UE 的 tbErrLastActUe 应设置为 -1。 |
newDataActUe |
int8_t[nActiveUe] |
小区中所有活动 UE 的初始传输/重传指示符。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 newDataActUe[uIdx] 是第 uIdx 个活动 UE 在小区中的初始传输/重传指示符。 0 – 重传 1 - 新数据/初始传输 -1 表示无效元素 |
allocSolLastTxActUe |
对于类型 0 PRG 分配 int16_t[nPrbGrp] 对于类型 1 PRG 分配 int16_t[2*nActiveUe] |
小区中所有活动 UE 的上次传输的 PRG 分配解决方案。 每个元素的值 对于类型 0 PRG 分配 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引。 allocSolLastTxActUe[prgIdx] 指示分配了第 prgIdx 个 PRG 的活动 UE 索引(0、1、…、nActiveUe-1)。 -1 表示给定的 PRG 未分配给任何 UE。 对于类型 1 PRG 分配 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 allocSolLastTxActUe[2*uIdx] 是第 uIdx 个活动 UE 的起始 PRG 索引。 allocSolLastTxActUe[2*uIdx + 1] 是第 uIdx 个活动 UE 的结束 PRG 索引。 -1 表示给定的 UE 未分配给任何 PRG。 |
mcsSelSolLastTxActUe |
int16_t[nActiveUe] |
小区中所有活动 UE 的上次传输的 MCS 选择解决方案。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 mcsSelSolLastTxActUe[uIdx] 指示第 uIdx 个活动 UE 在小区中的 MCS 级别。 每个元素的范围 0、1、…、27(目前仅支持表 5.1.3.1-2:MCS 索引表 2,3GPP TS 38.214)。 -1 表示元素无效。 |
layerSelSolLastTxActUe |
uint8_t[nActiveUe] |
小区中所有活动 UE 的上次传输的层选择解决方案。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 layerSelSolLastTxActUe[uIdx] 指示为第 uIdx 个活动 UE 在小区中选择的层数。 每个元素的范围:0、1、…、nUeAnt-1 所选层具有从最大值开始降序排列的奇异值。 |
以下是每种 cuMAC 任务类型所需的数据缓冲区,由 taskBitMask 定义。
任务类型 |
cuMAC 模块名称 |
L2 传递到 cuMAC-CP 的所需数据 |
---|---|---|
0x01 |
multiCellUeSelection |
prgMsk、wbSinr、avgRatesActUe。 |
0x02 |
multiCellScheduler |
所有 TaskType=0x01 缓冲区以及 postEqSinr、sinVal、estH_fr、detMat、prdMat。 |
0x04 |
multiCellLayerSel |
所有 TaskType=0x02 缓冲区。 |
0x08 |
mcsSelectionLUT |
所有 TaskType=0x04 缓冲区以及 tbErrLastActUe。 |
TTI_END#
名称 |
类型 |
描述 |
---|---|---|
end_param |
uint8_t |
保留,尚未使用。 |
SCH_TTI.response#
此消息用于将调度结果返回到 L2。结果填充在 NVIPC DATA 缓冲区中,
名称 |
类型 |
描述 |
---|---|---|
offsets |
struct |
每个数据的缓冲区偏移量 0xFFFFFFFF:未使用缓冲区(无效)。 其他:基于 nvipc data_buf 的缓冲区偏移量 |
数据缓冲区填充在 NVIPC DATA 缓冲区中。“offsets”结构定义了所有缓冲区的缓冲区偏移量。
注意:并非所有缓冲区都使用。未使用的缓冲区的偏移量应设置为 0xFFFFFFFF。
偏移量名称 |
偏移量类型 |
缓冲区描述 |
---|---|---|
setSchdUePerCellTTI |
uint32_t |
小区中选定 UE 的 ID 集 |
allocSol |
uint32_t |
小区中所有活动 UE 的 PRB 组分配解决方案 |
layerSelSol |
uint32_t |
小区中所有活动 UE 的层选择解决方案 |
mcsSelSol |
uint32_t |
小区中所有活动 UE 的 MCS 选择解决方案 |
数据缓冲区详细信息如下所示。
字段 |
类型 |
描述 |
---|---|---|
setSchdUePerCellTTI |
uint16_t [nMaxSchUePerCell] |
小区中选定 UE 的 ID 集。 每个元素的值 将 i = 0、1、…、nMaxSchUePerCell-1 表示为小区中第 i 个选定 UE。 setSchdUePerCellTTI[i] 在 {0、1、…、nActiveUe-1} 范围内,表示第 i 个选定 UE 的活动 UE 索引。 |
allocSol |
对于类型 0 PRG 分配 int16_t[nPrbGrp] 对于类型 1 PRG 分配 int16_t[2*nActiveUe] |
小区中所有活动 UE 的 PRB 组分配解决方案。 每个元素的值 对于类型 0 PRG 分配 将 prgIdx = 0, 1, …, nPrbGrp-1 表示为 PRG 索引。 allocSol[prgIdx] 指示分配了第 prgIdx 个 PRG 的活动 UE 索引(0、1、…、nActiveUe-1)。 -1 表示给定的 PRG 未分配给任何 UE。 对于类型 1 PRG 分配 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 allocSol[2*uIdx] 是第 uIdx 个活动 UE 的起始 PRG 索引。 allocSol[2*uIdx + 1] 是第 uIdx 个活动 UE 的结束 PRG 索引。 -1 表示给定的 UE 未分配给任何 PRG。 |
mcsSelSol |
int16_t[nActiveUe] |
小区中所有活动 UE 的 MCS 选择解决方案。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 mcsSelSol[uIdx] 指示第 uIdx 个活动 UE 在小区中的 MCS 级别。 每个元素的范围 0、1、…、27(目前仅支持表 5.1.3.1-2:MCS 索引表 2,3GPP TS 38.214)。 -1 表示元素无效。 |
layerSelSol |
uint8_t[nActiveUe] |
小区中所有活动 UE 的层选择解决方案。 每个元素的值 将 uIdx = 0, 1, …, nActiveUe-1 表示为小区中的活动 UE 索引。 layerSelSol[uIdx] 指示为第 uIdx 个活动 UE 在小区中选择的层数。 每个元素的范围:0、1、…、nUeAnt-1 所选层具有从最大值开始降序排列的奇异值。 |
TTI_ERR.indication#
名称 |
类型 |
描述 |
---|---|---|
msg_id |
in t32_t |
SFN 编号 |
error_code |
in t32_t |
0:无错误。其他:待定 |
reason_code |
in t32_t |
0:无错误。其他:待定 |