cuMAC API Reference
CumacCellGrpPrms
API data structure containing cell group information of the coordinated cells.
Field |
Type |
Description |
---|---|---|
nUe | uint16_t | Total number of selected UEs in a TTI of all coordinated cells. Value: 0 -> 65535 |
nActiveUe | uint16_t | Total number of active UEs of all coordinated cells. Value: 0 -> 65535 |
numUeSchdPerCellTTI | uint8_t | Number of UEs selected/scheduled per TTI per cell. Value: 0 -> 255 |
nCell | uint16_t | Total number of coordinated cells. Value: 0 -> 65535 |
nPrbGrp | uint16_t | Total number of PRGs per cell. Value: 0 -> 65535 |
nBsAnt | uint8_t | Number of BS antenna ports. Value: 0 -> 255 |
nUeAnt | uint8_t | Number of UE antenna ports. Value: 0 -> 255 |
W | float | Frequency bandwidth (Hz) of a PRG. Value: 12 * subcarrier spacing * number of PRBs per PRG |
sigmaSqrd | float | Noise variance. Value: noise variance value in watts |
precodingScheme | uint8_t | Precoder type. Value: 0: No precoding 1: SVD precoder |
receiverScheme | uint8_t | Receiver/equalizer type. Value: Currently only support 1: MMSE-IRC receiver |
allocType | uint8_t | PRG allocation type. Value: 0: non-consecutive type-0 allocation 1: consecutive type-1 allocation |
betaCoeff | float | Coefficient for adjusting the cell-edge UEs’ performance in multi-cell scheduling Value: non-negative real number. The default value is 1.0, representing the classic proportional-fairness scheduling. |
sinValThr | float | Singular value threshold for layer selection. Value: in (0, 1). Default value is 0.1 |
prioWeightStep | uint16_t | For priority-weight based scheduling algorithm. Step size for UE priority weight increment per TTI if UE does not get scheduled. Value: default 100 |
cellId | uint16_t[nCell] | IDs of coordinated cells. One dimensional array. Value of each element: Denote cIdx = 0, 1, …, nCell-1 as the coordinated cell index. cellId[cIdx] is the ID of the cIdx-th coordinated cell |
cellAssoc | uint8_t[nCell* nUe] | Cell-UE association indication for all the selected UEs of the coordinated cells. One dimensional array. Value of each element: Denote cIdx = 0, 1, …, nCell-1 as the coordinated cell index. Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. cellAssoc[cIdx*nUe + uIdx] == 1 means the uIdx-th selected UE is associated with cIdx-th coordinated cell, 0 otherwise. |
cellAssocActUe | uint8_t[nCell* nActiveUe] | Cell-UE association indication for all active UEs of the coordinated cells. One dimensional array. Value of each element: Denote cIdx = 0, 1, …, nCell-1 as the coordinated cell index. Denote uIdx = 0, 1, …, nActiveUe-1 as the global active UE index in the coordinated cells. cellAssocActUe[cIdx*nUe + uIdx] == 1 means the uIdx-th active UE is associated with cIdx-th coordinated cell, 0 otherwise. |
prgMsk | uint8_t[nCell] [nPrbGrp] | Per-cell bit map for the availability of each PRG for allocation Two-dimensional array. Value of each element: Denote cIdx = 0, 1, … nCell-1 as the coordinated cell index Denote prgIdx = 0, 1, …, nPrbGrp-1 as the PRG index prgMsk[cIdx][prgIdx] is the availability indicator for the prgIdx-th PRG in the cIdx-th coordinated cell 0 - unavailable, 1 - available |
postEqSinr | float[nActiveUe* nPrbGrp*nUeAnt] | Array of the per-PRG per-layer post-equalizer SINRs of all active UEs in the coordinated cells. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nActiveUe-1 as the global active UE index in the coordinated cells. Denote prgIdx = 0, 1, …, nPrbGrp-1 as the PRG index. Denote layerIdx = 0, 1, …, nUeAnt-1 as the layer index. postEqSinr[uIdx*nPrbGrp* nUeAnt + prgIdx*nUeAnt + layerIdx] is the uIdx-th active UE’s post-equalizer SINR on the prgIdx-th PRG and the layerIdx-th layer. |
wbSinr | float[nActiveUe* nUeAnt] | Array of wideband per-layer post-equalizer SINRs of all active UEs in the coordinated cells. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nActiveUe-1 as the global active UE index in the coordinated cells. Denote layerIdx = 0, 1, …, nUeAnt-1 as the layer index. wbSinr[uIdx*nUeAnt + layerIdx] is the uIdx-th active UE’s wideband post-equalizer SINR on the layerIdx-th layer. |
FP32: estH_fr or FP16: estH_fr_half | FP32: cuComplex[nCell] [nUe*nPrbGrp* nBsAnt*nUeAnt] Or FP16: __nv_bfloat162 [nCell][nUe* nPrbGrp*nBsAnt* nUeAnt] | Per-cell array of the narrow-band SRS channel estimate coefficients for the selected UEs in the coordinated cells. Two-dimensional array: the 1st dimension is for cells, and the 2nd dimension is for UEs, PRGs, and antenna ports. Value of each element: Denote cIdx = 0, 1, …, nCell-1 as the coordinated cell index. Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. Denote prgIdx = 0, 1, …, nPrbGrp-1 as the PRG index. Denote bsAntIdx = 0, 1, …, nBsAnt-1 as the BS antenna port index Denote ueAntIdx = 0, 1, …, nUeAnt as the UE antenna port index estH_fr[cIdx][uIdx* nPrbGrp*nBsAnt*nUeAnt + prgIdx* nBsAnt*nUeAnt + bsAntIdx*nUeAnt + ueAntIdx] is the complex channel coefficient between the cIdx-th cell and the uIdx-th selected UE in the cell group on the prgIdx-th PRG, the bsAntIdx-th BS antenna port and the ueAntIdx-th UE antenna port. (The above applies to the FP16 version as well) |
prdMat | cuComplex[nUe* nPrbGrp* nBsAnt* nBsAnt] | Array of the precoder/beamforming weights for the selected UEs in the coordinated cells. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. Denote prgIdx = 0, 1, …, nPrbGrp-1 as the PRG index. Denote inPortIdx = 0, 1, …, nBsAnt-1 as the precoder input port index Denote outPortIdx = 0, 1, …, nBsAnt-1 as the precoder output port index prdMat[uIdx*nPrbGrp* nBsAnt*nBsAnt + prgIdx* nBsAnt*nBsAnt + inPortIdx *nBsAnt + outPortIdx] is the precoder/beamforming weight of the uIdx-th selected UE in the coordinated cells on the prgIdx-th PRG and between the inPortIdx-th input port and the outPortIdx-th output port. |
detMat | cuComplex[nUe* nPrbGrp* nUeAnt* nUeAnt] | Array of the detector/beamforming weights for the selected UEs in the coordinated cells. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. Denote prgIdx = 0, 1, …, nPrbGrp-1 as the PRG index. Denote inPortIdx = 0, 1, …, nUeAnt-1 as the detector input port index. Denote outPortIdx = 0, 1, …, nUeAnt-1 as the detector output port index. detMat[uIdx*nPrbGrp*nUeAnt*nUeAnt + prgIdx*nUeAnt*nUeAnt + inPortIdx*nUeAnt + outPortIdx] is the detector weight of the uIdx-th selected UE on the prgIdx-th PRG and between the inPortIdx-th input port and the outPortIdx-th output port. |
sinVal | float[nUe* nPrbGrp*nUeAnt] | Array of the per-UE, per-PRG, per-layer singular values obtained from SVD. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nUe-1 as the 0-based UE index for the selected UEs in the coordinated cells. Denote prgIdx = 0, 1, …, nPrbGrp-1 as the PRG index. Denote layerIdx = 0, 1, …, nUeAnt-1 as the layer index. sinVal[uIdx*nPrbGrp*nUeAnt + prgIdx*nUeAnt + layerIdx] is the UE uIdx’s layerIdx-th largest singular value on PRG prgIdx For each UE and on each PRG, the singular values are stored in descending order. |
cumacCellGrpUeStatus
API data structure containing the per-UE information of the coordinated cell group.
Field |
Type |
Description |
---|---|---|
avgRates | float[nUe] | Array of the long-term average data rates of the selected UEs in the coordinated cells. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. avgRates[uIdx] is the long-term average throughput of the uIdx-th selected UE in the coordinated cells. |
avgRatesActUe | float[nActiveUe] | Array of the long-term average data rates of all active UEs in the coordinated cells One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nActiveUe-1 as the global active UE index in the coordinated cells. avgRatesActUe[uIdx] is the long-term average throughput of the uIdx-th active UE in the coordinated cells. |
prioWeightActUe | uint16_t [nActiveUe] | For priority-based UE selection. Priority weights of all active UEs in the coordinated cells One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nActiveUe-1 as the global UE index for all active UEs in the coordinated cells. prioWeightActUe[uIdx] is the uIdx-th active UE’s priority weight. 0xFFFF indicates an invalid element. |
tbErrLast | int8_t[nUe] | Array of the selected UEs’ transport block (TB) decoding error indicators of the last transmissions One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. tbErrLast[uIdx] is the uIdx-th selected UE’s TB decoding error indicator of the last transmission. -1 - the last transmission is not a new transmission (is a re-transmission) 0 - decoded correctly 1 - decoding error ** Note that if the last transmission of a UE is not a new transmission, tbErrLast of that UE should be set to -1. |
tbErrLastActUe | int8_t[nActiveUe] | TB decoding error indicators of all active UEs in the coordinated cells. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nActiveUe-1 as the global UE index for all active UEs in the coordinated cells. tbErrLastActUe[uIdx] is the uIdx-th active UE’s TB decoding error indicator: -1 - the last transmission is not a new transmission (is a re-transmission) 0 - decoded correctly 1 - decoding error ** Note that if the last transmission of a UE is not a new transmission, tbErrLastActUe of that UE should be set to -1. |
newDataActUe | int8_t[nActiveUe] | Indicators of initial transmission/retransmission for all active UEs. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nActiveUe-1 as the global UE index for all active UEs in the coordinated cells. newDataActUe[uIdx] is the indicator of initial transmission/retransmission for the uIdx-th active UE in the coordinated cells 0 – retransmission 1 - new data/initial transmission -1 indicates an invalid element |
allocSolLastTx | For type-0 PRG allocation: int16 _t[nCell*nPrbGrp] For type-1 PRG allocation: int16_t[2*nUe] | The PRG allocation solution of the last transmission of the selected/scheduled UEs in the coordinated cells Format referring to the description for allocSol in the cumacSchdSol structure |
mcsSelSolLastTx | int16_t[nUe] | MCS selection solution of the last transmission of the selected/scheduled UEs in the coordinated cells. Format referring to the description for mcsSelSol in the cumacSchdSol structure |
layerSelSolLastTx | uint8_t[nUe] | Layer selection solution of the last transmission of the selected/scheduled UEs in the coordinated cells. Format referring to the description for layerSelSol in the cumacSchdSol structure |
cumacSchdSol
API data structure containing the scheduling solutions.
Field |
Type |
Description |
---|---|---|
setSchdUePerCellTTI | uint16_t[nCell* numUeSchdPerCellTTI] | Set of global IDs of the selected UEs per cell per TTI. One dimensional array. Value of each element: Denote cIdx = 0, 1, …, nCell-1 as the coordinated cell index. Denote i = 0, 1, …, numUeSchdPerCellTTI-1 as the i-th selected UE in a given cell. setSchdUePerCel lTTI[cIdx*numUeSchdPerCellTTI + i] is within {0, 1, …, nActiveUe-1} and represents the global active UE index of the i-th selected UE in the cIdx-th coordinated cell. |
allocSol | For type-0 PRG allocation: int1 6_t[nCell*nPrbGrp] For type-1 PRG allocation: int16_t[2*nUe] | PRB group allocation solution for the selected UEs per TTI in the coordinated cells One dimensional array. Value of each element: For type-0 PRG allocation: Denote prgIdx = 0, 1, …, nPrbGrp-1 as the PRG index. Denote cIdx = 0, 1, …, nCell-1 as the coordinated cell index. allocSol[prgIdx*nCell + cIdx] indicates the selected UE index (0, 1, …, nUe-1) that the prgIdx-th PRG is allocated to in the cIdx-th coordinated cell. -1 indicates that a given PRG in a cell is not allocated to any UE. For type-1 PRG allocation: Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. allocSol[2*uIdx] is the starting PRG index of the uIdx-th selected UE. allocSol[2*uIdx + 1] is the ending PRG index of the uIdx-th selected UE plus one. -1 indicates that a given UE is not being allocated to any PRG. |
pfMetricArr | float[array_size] array_size = nCell * the minimum power of 2 that is no less than nPrbGrp*n umUeSchdPerCellTTI | Array to store the computed PF metrics per UE and per PRG. Only used for type-1 PRG allocation. One dimensional array. GPU memory allocated for CUDA kernel execution. Not used externally. Memory should be allocated when initializing the cuMAC API. Value of each element: floating-type value of a computed PF metric. |
pfIdArr | uint16_t [array_size] array_size = nCell * the minimum power of 2 that is no less than nPrbGrp*n umUeSchdPerCellTTI | Array to indicate the PRG and UE indices of the sorted PF metrics. Only used for type-1 PRG allocation. One dimensional array. GPU memory allocated for CUDA kernel execution. Not used externally. Memory should be allocated when initializing the cuMAC API. Value of each element: 0 -> 65535 |
mcsSelSol | int16_t[nUe] | MCS selection solution for the selected UEs per TTI in the coordinated cells One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. mcsSelSol[uIdx] indicates the MCS level for the uIdx-th selected UE in the coordinated cells. Range of each element: 0, 1, …, 27 (Currently only support Table 5.1.3.1-2: MCS index table 2, 3GPP TS 38.214). -1 indicates an element is invalid. |
layerSelSol | uint8_t[nUe] | Layer selection solution for the selected UEs per TTI in the coordinated cells. One dimensional array. Value of each element: Denote uIdx = 0, 1, …, nUe-1 as the selected UE index in the coordinated cells. layerSelSol[uIdx] indicates the number of layers selected for the uIdx-th selected UE in the coordinated cells. Range of each element: 0, 1, …, nUeAnt-1 The selected layers have singular values descending from the largest one. |
Multi-cell proportional-fairness UE down-selection
Wrapper class and public member functions:
class cumac::multiCellUeSelection
public:
// constructor
multiCellUeSelection();
// destructor
~multiCellUeSelection();
// setup() function for per-TTI algorithm execution
void setup(cumac::cumacCellGrpUeStatus\* cellGrpUeStatus,
cumac::cumacSchdSol\* schdSol,
cumac::cumacCellGrpPrms\* cellGrpPrms,
uint8_t in_enableHarq,
cudaStream_t strm);
// requires external synchronization
// set in_enableHarq to 1 if HARQ is enabled; 0 otherwise
// run() function for per-TTI algorithm execution
void run(cudaStream_t strm);
// requires external synchronization
// parameter/data buffer logging function for debugging purpose
void debugLog();
// for debugging only, printing out dynamic descriptor parameters
Multi-cell proportional-fairness PRB scheduler
Wrapper class and public member functions:
class cumac::multiCellScheduler
public:
// constructor
multiCellScheduler();
// destructor
~multiCellScheduler();
// setup() function for per-TTI algorithm execution
void setup(cumac::cumacCellGrpUeStatus\* cellGrpUeStatus,
cumac::cumacSchdSol\* schdSol,
cumac::cumacCellGrpPrms\* cellGrpPrms,
uint8_t in_DL,
uint8_t in_columnMajor,
uint8_t in_halfPrecision,
uint8_t in_lightWeight,
cudaStream_t strm);
// set in_DL to 1 if setup for DL scheduling; 0 otherwise
// in_columnMajor: 0 - row-major channel access, 1 - column-major channel access
// in_halfPrecision: 0 - call FP32 floating type kernel, 1 - call FP16 (bfloat162) half-precision kernel
// in_lightWeight: 0 - call heavy-weight kernel, 1 - call light-weight kernel
// in_enableHarq: 0 - HARQ disabled, 1 - HARQ enabled
// requires external synchronization
// run() function for per-TTI algorithm execution
void run(cudaStream_t strm);
// requires external synchronization
// parameter/data buffer logging function for debugging purpose
void debugLog();
// for debugging only, printing out dynamic descriptor parameters
Multi-cell layer selection
Wrapper class and public member functions:
class cumac::multiCellLayerSel
public:
// constructor
multiCellLayerSel();
// desctructor
~multiCellLayerSel();
// setup() function for per-TTI algorithm execution
void setup(cumacCellGrpUeStatus\* cellGrpUeStatus,
cumacSchdSol\* schdSol,
cumacCellGrpPrms\* cellGrpPrms,
uint8_t in_enableHarq,
cudaStream_t strm);
// in_enableHarq: 0 - HARQ disabled, 1 - HARQ enabled
// requires external synchronization
// run() function for per-TTI algorithm execution
void run(cudaStream_t strm);
// requires external synchronization
// parameter/data buffer logging function for debugging purpose
void debugLog();
// for debugging only, printing out dynamic descriptor parameters
Multi-cell MCS selection + outer-loop link adaptation (OLLA)
Wrapper class and public member functions:
class cumac::mcsSelectionLUT
public:
// constructor
mcsSelectionLUT(uint16_t nActiveUe, cudaStream_t strm);
// requires external synchronization
// uint16_t nActiveUe is the (maximum) total number of active UEs in all
coordinated cells
// destructor
~mcsSelectionLUT();
// setup() function for per-TTI algorithm execution
void setup(cumacCellGrpUeStatus\* cellGrpUeStatus,
cumacSchdSol\* schdSol,
cumacCellGrpPrms\* cellGrpPrms,
uint8_t in_DL,
uint8_t in_baseline,
cudaStream_t strm);
// in_DL: 0 - UL, 1 - DL
// in_baseline: 0 - not using baseline algorithm, 1 - using baseline
algorithm
// requires external synchronization
// run() function for per-TTI algorithm execution
void run(cudaStream_t strm);
// parameter/data buffer logging function for debugging purpose
void debugLog();
// for debugging only, printing out dynamic descriptor parameters
Outer-loop link adaptation (OLLA) data structure:
// structure containing outer-loop link adaptation algorithm parameters
struct ollaParam {
float delta; // offset to SINR estimation
float delta_ini; // initial value for delta parameter
float delta_up; // step size for increasing delta parameter
float delta_down; // step size for decreasing delta parameter
};