cuMAC API Reference#

cuMAC API Data Structures#

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.

cuMAC Scheduler Module API#

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