Snitch Runtime
Loading...
Searching...
No Matches
ssr.h File Reference

This file contains functions to conveniently program Snitch's SSRs. More...

Go to the source code of this file.

Enumerations

enum  snrt_ssr_dm { SNRT_SSR_DM0 = 0 , SNRT_SSR_DM1 = 1 , SNRT_SSR_DM2 = 2 , SNRT_SSR_DM_ALL = 31 }
 The different SSRs. More...
 
enum  snrt_ssr_dim { SNRT_SSR_1D = 0 , SNRT_SSR_2D = 1 , SNRT_SSR_3D = 2 , SNRT_SSR_4D = 3 }
 The different dimensions. More...
 
enum  snrt_ssr_reg {
  SNRT_SSR_REG_STATUS = 0 , SNRT_SSR_REG_REPEAT = 1 , SNRT_SSR_REG_BOUNDS = 2 , SNRT_SSR_REG_STRIDES = 6 ,
  SNRT_SSR_REG_IDX_CFG = 10 , SNRT_SSR_REG_IDX_BASE = 11 , SNRT_SSR_REG_RPTR_INDIR = 16 , SNRT_SSR_REG_RPTR = 24 ,
  SNRT_SSR_REG_WPTR = 28
}
 The SSR configuration registers. More...
 
enum  snrt_ssr_idxsize { SNRT_SSR_IDXSIZE_U8 = 0 , SNRT_SSR_IDXSIZE_U16 = 1 , SNRT_SSR_IDXSIZE_U32 = 2 , SNRT_SSR_IDXSIZE_U64 = 3 }
 The size of the SSSR indirection indices. More...
 

Functions

void snrt_fpu_fence ()
 Synchronize the integer and float pipelines.
 
void snrt_ssr_enable ()
 Enable all SSRs.
 
void snrt_ssr_disable ()
 Disable all SSRs.
 
void snrt_sc_enable (uint32_t mask)
 Enable scalar chaining.
 
void snrt_sc_disable (uint32_t mask)
 Disable scalar chaining.
 
uint32_t read_ssr_cfg (enum snrt_ssr_reg reg, uint32_t dm)
 Read the value of an SSR configuration register.
 
void write_ssr_cfg (enum snrt_ssr_reg reg, uint32_t dm, uint32_t value)
 Write a value to an SSR configuration register.
 
void snrt_ssr_loop_1d (enum snrt_ssr_dm dm, size_t b0, size_t s0)
 Configure an SSR data mover for a 1D loop nest.
 
void snrt_ssr_loop_2d (enum snrt_ssr_dm dm, size_t b0, size_t b1, size_t s0, size_t s1)
 Configure an SSR data mover for a 2D loop nest.
 
void snrt_ssr_loop_3d (enum snrt_ssr_dm dm, size_t b0, size_t b1, size_t b2, size_t s0, size_t s1, size_t s2)
 Configure an SSR data mover for a 3D loop nest.
 
void snrt_ssr_loop_4d (enum snrt_ssr_dm dm, size_t b0, size_t b1, size_t b2, size_t b3, size_t s0, size_t s1, size_t s2, size_t s3)
 Configure an SSR data mover for a 4D loop nest.
 
void snrt_ssr_repeat (enum snrt_ssr_dm dm, size_t count)
 Configure the repetition count for a stream.
 
void snrt_ssr_read (enum snrt_ssr_dm dm, enum snrt_ssr_dim dim, volatile void *ptr)
 Start a streaming read.
 
void snrt_ssr_write (enum snrt_ssr_dm dm, enum snrt_ssr_dim dim, volatile void *ptr)
 Start a streaming write.
 
void snrt_issr_set_idx_cfg (enum snrt_ssr_dm dm, enum snrt_ssr_idxsize idxsize)
 Start a streaming indirect read.
 
void snrt_issr_set_bound (enum snrt_ssr_dm dm, size_t bound)
 
void snrt_issr_set_ptrs (enum snrt_ssr_dm dm, volatile void *base, volatile void *idcs)
 
void snrt_issr_read (enum snrt_ssr_dm dm, volatile void *base, volatile void *idcs, size_t bound, enum snrt_ssr_idxsize idxsize)
 

Detailed Description

This file contains functions to conveniently program Snitch's SSRs.

An SSR stream can be configured to replace a store (or load) sequence as could be generated by an N-dimensional affine loop nest, e.g. the following store sequence can be mapped to a 2D write SSR:

for (int i = 0; i < b1; i++)
for (int j = 0; j < b0; j++)
ptr[i * s1 + j * s0] = 0;

An ISSR (Indirect SSR) stream can be configured to replace a store (or load) sequence as could be generated by:

for (int i = 0; i < bound; i++)
base[idcs[i]] = 0;

The convenience functions provided in this file can be used to set up such access patterns. The function argument names reflect the variable names presented in these sample code snippets.

Note: The exact number of elements configured in an (I)SSR stream must be consumed. Failure to comply with this requirement will result in undefined behaviour.

Enumeration Type Documentation

◆ snrt_ssr_dim

The different dimensions.

Enumerator
SNRT_SSR_1D 

1D stream

SNRT_SSR_2D 

2D stream

SNRT_SSR_3D 

3D stream

SNRT_SSR_4D 

4D stream

◆ snrt_ssr_dm

The different SSRs.

Enumerator
SNRT_SSR_DM0 

SSR data mover 0

SNRT_SSR_DM1 

SSR data mover 1

SNRT_SSR_DM2 

SSR data mover 2

SNRT_SSR_DM_ALL 

Write to all SSRs

◆ snrt_ssr_idxsize

The size of the SSSR indirection indices.

Enumerator
SNRT_SSR_IDXSIZE_U8 

Unsigned 8-bit integer

SNRT_SSR_IDXSIZE_U16 

Unsigned 16-bit integer

SNRT_SSR_IDXSIZE_U32 

Unsigned 32-bit integer

SNRT_SSR_IDXSIZE_U64 

Unsigned 64-bit integer

◆ snrt_ssr_reg

The SSR configuration registers.

Enumerator
SNRT_SSR_REG_STATUS 

SSR status register

SNRT_SSR_REG_REPEAT 

SSR repeat register

SNRT_SSR_REG_BOUNDS 

SSR bounds register

SNRT_SSR_REG_STRIDES 

SSR strides register

SNRT_SSR_REG_IDX_CFG 

SSSR index configuration register

SNRT_SSR_REG_IDX_BASE 

SSSR base address register

SNRT_SSR_REG_RPTR_INDIR 

SSSR indir. indices read ptr register

SNRT_SSR_REG_RPTR 

SSR read pointer register

SNRT_SSR_REG_WPTR 

SSR write pointer register

Function Documentation

◆ read_ssr_cfg()

uint32_t read_ssr_cfg ( enum snrt_ssr_reg reg,
uint32_t dm )
inline

Read the value of an SSR configuration register.

Parameters
regThe register index.
dmThe SSR index.
Returns
The value of the register.

◆ snrt_issr_set_idx_cfg()

void snrt_issr_set_idx_cfg ( enum snrt_ssr_dm dm,
enum snrt_ssr_idxsize idxsize )
inline

Start a streaming indirect read.

Parameters
dmThe SSSR index.
baseThe base pointer to the data.
ptrThe pointer to the indirection indices.
boundThe bound of the first (and only) loop.
idxsizeThe size of the indices.

◆ snrt_sc_enable()

void snrt_sc_enable ( uint32_t mask)
inline

Enable scalar chaining.

Parameters
maskA bitmask indicating which registers should be enabled for chaining.

◆ snrt_ssr_loop_1d()

void snrt_ssr_loop_1d ( enum snrt_ssr_dm dm,
size_t b0,
size_t s0 )
inline

Configure an SSR data mover for a 1D loop nest.

Parameters
dmThe SSR index.
b0The bound of the loop.
s0The stride of the loop.

◆ snrt_ssr_loop_2d()

void snrt_ssr_loop_2d ( enum snrt_ssr_dm dm,
size_t b0,
size_t b1,
size_t s0,
size_t s1 )
inline

Configure an SSR data mover for a 2D loop nest.

Parameters
dmThe SSR index.
b0The bound of the first loop.
b1The bound of the second loop.
s0The stride of the first loop.
s1The stride of the second loop.

◆ snrt_ssr_loop_3d()

void snrt_ssr_loop_3d ( enum snrt_ssr_dm dm,
size_t b0,
size_t b1,
size_t b2,
size_t s0,
size_t s1,
size_t s2 )
inline

Configure an SSR data mover for a 3D loop nest.

Parameters
dmThe SSR index.
b0The bound of the first loop.
b1The bound of the second loop.
b2The bound of the third loop.
s0The stride of the first loop.
s1The stride of the second loop.
s2The stride of the third loop.

◆ snrt_ssr_loop_4d()

void snrt_ssr_loop_4d ( enum snrt_ssr_dm dm,
size_t b0,
size_t b1,
size_t b2,
size_t b3,
size_t s0,
size_t s1,
size_t s2,
size_t s3 )
inline

Configure an SSR data mover for a 4D loop nest.

Parameters
dmThe SSR index.
b0The bound of the first loop.
b1The bound of the second loop.
b2The bound of the third loop.
b3The bound of the fourth loop.
s0The stride of the first loop.
s1The stride of the second loop.
s2The stride of the third loop.
s3The stride of the fourth loop.

◆ snrt_ssr_read()

void snrt_ssr_read ( enum snrt_ssr_dm dm,
enum snrt_ssr_dim dim,
volatile void * ptr )
inline

Start a streaming read.

Parameters
dmThe SSR index.
dimThe number of dimensions to use.
ptrThe pointer to the data.

◆ snrt_ssr_repeat()

void snrt_ssr_repeat ( enum snrt_ssr_dm dm,
size_t count )
inline

Configure the repetition count for a stream.

Parameters
dmThe SSR index.
countThe repetition count.

◆ snrt_ssr_write()

void snrt_ssr_write ( enum snrt_ssr_dm dm,
enum snrt_ssr_dim dim,
volatile void * ptr )
inline

Start a streaming write.

Parameters
dmThe SSR index.
dimThe number of dimensions to use.
ptrThe pointer to the data.

◆ write_ssr_cfg()

void write_ssr_cfg ( enum snrt_ssr_reg reg,
uint32_t dm,
uint32_t value )
inline

Write a value to an SSR configuration register.

Parameters
regThe register index.
dmThe SSR index.
valueThe value to write.