5#ifndef SNRT_SUPPORTS_DMA
18#include "idma_compute.h"
31#ifdef SNRT_SUPPORTS_DMA
32 uint32_t dst_lo = dst & 0xFFFFFFFF;
33 uint32_t dst_hi = dst >> 32;
34 uint32_t src_lo = src & 0xFFFFFFFF;
35 uint32_t src_hi = src >> 32;
36 uint32_t cfg = (channel << 2) | 0b00;
40 "dmsrc %[src_lo], %[src_hi] \n"
41 "dmdst %[dst_lo], %[dst_hi] \n"
42 "dmcpy %[txid], %[size], %[cfg] \n"
44 : [ src_lo ]
"r"(src_lo), [ src_hi ]
"r"(src_hi),
45 [ dst_lo ]
"r"(dst_lo), [ dst_hi ]
"r"(dst_hi), [ size ]
"r"(size),
49 memcpy((
void *)dst, (
const void *)src, size);
61 size_t size, uint32_t channel = 0) {
73#ifdef SNRT_SUPPORTS_DMA
74 uint32_t user_low = (uint32_t)(field);
75 uint32_t user_high = (uint32_t)(field >> 32);
76 asm volatile(
"dmuser %[user_low], %[user_high] \n"
78 : [ user_low ]
"r"(user_low), [ user_high ]
"r"(user_high));
91 op.f.opcode = SNRT_COLLECTIVE_MULTICAST;
105 snrt_collective_opcode_t opcode) {
107 op.f.opcode = opcode;
133 size_t size, uint64_t mask,
134 snrt_collective_opcode_t opcode,
135 uint32_t channel = 0) {
152 snrt_collective_opcode_t opcode,
153 uint32_t channel = 0) {
154 uint64_t mask = snrt_get_collective_mask(comm);
168 uint64_t mask, uint32_t channel = 0) {
184 uint32_t channel = 0) {
185 uint64_t mask = snrt_get_collective_mask(comm);
199 volatile void *src,
size_t size,
201 snrt_collective_opcode_t opcode,
202 uint32_t channel = 0) {
216 size_t size, uint64_t mask,
217 uint32_t channel = 0) {
236 size_t size,
size_t dst_stride,
237 size_t src_stride,
size_t repeat,
239#ifdef SNRT_SUPPORTS_DMA
240 uint32_t dst_lo = dst & 0xFFFFFFFF;
241 uint32_t dst_hi = dst >> 32;
242 uint32_t src_lo = src & 0xFFFFFFFF;
243 uint32_t src_hi = src >> 32;
244 uint32_t cfg = (channel << 2) | 0b10;
248 "dmsrc %[src_lo], %[src_hi] \n"
249 "dmdst %[dst_lo], %[dst_hi] \n"
250 "dmstr %[src_stride], %[dst_stride] \n"
252 "dmcpy %[txid], %[size], %[cfg] \n"
253 : [ txid ]
"=r"(txid)
254 : [ src_lo ]
"r"(src_lo), [ src_hi ]
"r"(src_hi),
255 [ dst_lo ]
"r"(dst_lo), [ dst_hi ]
"r"(dst_hi),
256 [ dst_stride ]
"r"(dst_stride), [ src_stride ]
"r"(src_stride),
257 [ repeat ]
"r"(repeat), [ size ]
"r"(size), [ cfg ]
"r"(cfg));
274 size_t size,
size_t dst_stride,
275 size_t src_stride,
size_t repeat,
276 uint32_t channel = 0) {
278 src_stride, repeat, channel);
291 size_t dst_stride,
size_t src_stride,
292 size_t repeat, uint32_t mask,
293 uint32_t channel = 0) {
310 size_t size,
size_t dst_stride,
311 size_t src_stride,
size_t repeat,
312 uint32_t mask, uint32_t channel = 0) {
314 dst_stride, src_stride, repeat, mask,
328#ifdef SNRT_SUPPORTS_DMA
330 asm volatile(
"dmstati %[busy], (%[channel] << 2) | 2 \n"
331 : [ busy ]
"=r"(busy)
332 : [ channel ]
"i"(channel)
350#ifdef SNRT_SUPPORTS_DMA
351 uint32_t would_block;
352 asm volatile(
"dmstati %[would_block], (%[channel] << 2) | 3 \n"
353 : [ would_block ]
"=r"(would_block)
354 : [ channel ]
"i"(channel)
373 const uint32_t channel = 0) {
374#ifdef SNRT_SUPPORTS_DMA
377 "dmstati t0, (%[channel] << 2) | 0 \n"
378 "bltu t0, %[txid], 1b \n"
380 : [ txid ]
"r"(txid), [ channel ]
"i"(channel)
395#ifdef SNRT_SUPPORTS_DMA
406 for (
int c = 0; c < num_channels; c++) {
418#ifdef SNRT_SUPPORTS_DMA
419 asm volatile(
"dmstati zero, 0 \n");
430#ifdef SNRT_SUPPORTS_DMA
431 asm volatile(
"dmstati zero, 0 \n");
443#ifdef SNRT_SUPPORTS_DMA
447 size_t n_1d_transfers = len / 64;
448 size_t use_dma = (len % 64) == 0 && len > 64;
449 uint8_t *p = (uint8_t *)ptr;
451 uint32_t nbytes = len < 64 || !use_dma ? len : 64;
461 memset(ptr, (
int)value, len);
475 size_t tile_idx,
size_t tile_size,
477 size_t tile_nbytes = tile_size * prec;
479 (uint64_t)dst, (uint64_t)src + tile_idx * tile_nbytes, tile_nbytes);
496 size_t tile_nbytes = tile_size * prec;
498 (uintptr_t)src + tile_idx * tile_nbytes,
513 void *dst,
void *src,
size_t tile_idx,
size_t tile_size, uint32_t prec,
514 uint64_t mask, snrt_collective_opcode_t opcode) {
515 size_t tile_nbytes = tile_size * prec;
517 (uintptr_t)src + tile_idx * tile_nbytes,
518 tile_nbytes, mask, opcode);
530 size_t size,
size_t row_size,
545 size_t size,
size_t row_size,
560 size_t tile_idx,
size_t tile_size,
562 size_t tile_nbytes = tile_size * prec;
564 (uint64_t)src, tile_nbytes);
583 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
584 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
585 uint32_t prec,
size_t tile_ld) {
586 size_t src_offset = 0;
588 src_offset += tile_x0_idx * tile_x0_size;
589 src_offset += tile_x1_idx * tile_x1_size * full_x0_size;
593 (uint64_t)src + src_offset,
611 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
612 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
615 tile_x1_size, tile_x0_size, full_x0_size, prec,
616 tile_x0_size * prec);
627 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
628 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
629 uint32_t prec,
size_t tile_ld, uint32_t mask) {
630 size_t src_offset = 0;
632 src_offset += tile_x0_idx * tile_x0_size;
633 src_offset += tile_x1_idx * tile_x1_size * full_x0_size;
637 (uint64_t)src + src_offset,
656 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
657 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
658 uint32_t prec, uint32_t mask) {
660 tile_x1_size, tile_x0_size, full_x0_size,
661 prec, tile_x0_size * prec, mask);
675 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
676 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
678 uint64_t mask = snrt_get_collective_mask(comm);
680 tile_x1_size, tile_x0_size, full_x0_size,
701 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
702 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
703 uint32_t prec,
size_t num_banks) {
705 size_t tile_x0_size_in_banks = (num_banks * SNRT_TCDM_BANK_WIDTH) / prec;
706 size_t tile_x1_size_in_banks =
707 ceil((tile_x1_size * tile_x0_size) / (
double)tile_x0_size_in_banks);
708 size_t tile_ld = SNRT_TCDM_HYPERBANK_WIDTH;
710 tile_x1_size_in_banks, tile_x0_size_in_banks,
711 full_x0_size, prec, tile_ld);
730 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
731 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
732 uint32_t prec,
size_t tile_ld) {
733 size_t dst_offset = 0;
735 dst_offset += tile_x0_idx * tile_x0_size;
736 dst_offset += tile_x1_idx * tile_x1_size * full_x0_size;
758 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
759 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
762 tile_x1_size, tile_x0_size, full_x0_size,
763 prec, tile_x0_size * prec);
783 void *dst,
void *src,
size_t tile_x1_idx,
size_t tile_x0_idx,
784 size_t tile_x1_size,
size_t tile_x0_size,
size_t full_x0_size,
785 uint32_t prec,
size_t num_banks) {
787 size_t tile_x0_size_in_banks = (num_banks * SNRT_TCDM_BANK_WIDTH) / prec;
788 size_t tile_x1_size_in_banks =
789 ceil((tile_x1_size * tile_x0_size) / (
double)tile_x0_size_in_banks);
790 size_t tile_ld = SNRT_TCDM_HYPERBANK_WIDTH;
792 tile_x1_size_in_banks, tile_x0_size_in_banks,
793 full_x0_size, prec, tile_ld);
804#ifdef SNRT_SUPPORTS_DMA_COMPUTE
805 asm volatile(
"dmopc %[opcode], %[params] \n"
807 : [ opcode ]
"r"(opcode), [ params ]
"r"(params)
830 IDMA_DMOPC_OPC_TRANSPOSE | ((mode & IDMA_DMOPC_RS1_TP_MODE_MASK)
831 << IDMA_DMOPC_RS1_TP_MODE_SHIFT),
832 ((tensor_m & IDMA_DMOPC_RS2_TP_TENSOR_M_MASK)
833 << IDMA_DMOPC_RS2_TP_TENSOR_M_SHIFT) |
834 ((tensor_n & IDMA_DMOPC_RS2_TP_TENSOR_N_MASK)
835 << IDMA_DMOPC_RS2_TP_TENSOR_N_SHIFT));
855 size_t size, uint32_t mode,
856 uint32_t tensor_m, uint32_t tensor_n,
857 uint32_t channel = 0) {
870 size_t size, uint32_t mode,
871 uint32_t tensor_m, uint32_t tensor_n,
872 uint32_t channel = 0) {
874 tensor_m, tensor_n, channel);
void snrt_dma_disable_reduction()
Disable reduction operations for successive transfers.
Definition dma.h:122
void snrt_dma_set_awuser(uint64_t field)
Set AW user field of the DMA's AXI interface.
Definition dma.h:72
snrt_dma_txid_t snrt_dma_load_1d_tile_mcast(void *dst, void *src, size_t tile_idx, size_t tile_size, uint32_t prec, uint64_t mask)
Load a tile of a 1D array.
Definition dma.h:491
snrt_dma_txid_t snrt_dma_start_2d(uint64_t dst, uint64_t src, size_t size, size_t dst_stride, size_t src_stride, size_t repeat, uint32_t channel)
Start an asynchronous 2D DMA transfer with 64-bit wide pointers.
Definition dma.h:235
void snrt_dma_set_opcode(uint32_t opcode)
Set a parameterless on-the-fly compute op for subsequent transfers.
Definition dma.h:816
void snrt_dma_disable_compute()
Disable on-the-fly compute for successive transfers.
Definition dma.h:842
void snrt_dma_disable_multicast()
Disable multicast for successive transfers.
Definition dma.h:116
snrt_dma_txid_t snrt_dma_load_1d_tile(volatile void *dst, volatile void *src, size_t tile_idx, size_t tile_size, uint32_t prec)
Load a tile of a 1D array.
Definition dma.h:473
snrt_dma_txid_t snrt_dma_1d_to_2d(volatile void *dst, volatile void *src, size_t size, size_t row_size, size_t stride)
Transfer and reshape a 1D array into a 2D array.
Definition dma.h:529
static uint32_t snrt_dma_would_block(const uint32_t channel)
Read DMA would_block flag.
Definition dma.h:349
snrt_dma_txid_t snrt_dma_store_2d_tile_from_banks(void *dst, void *src, size_t tile_x1_idx, size_t tile_x0_idx, size_t tile_x1_size, size_t tile_x0_size, size_t full_x0_size, uint32_t prec, size_t num_banks)
Store a 2D tile of a 2D array from a 1D layout occupying a subset of TCDM banks.
Definition dma.h:782
uint32_t snrt_dma_start_1d_mcast(uint64_t dst, uint64_t src, size_t size, uint64_t mask, uint32_t channel=0)
Start an asynchronous multicast 1D DMA transfer with 64-bit wide pointers.
Definition dma.h:167
uint32_t snrt_dma_start_1d(uint64_t dst, uint64_t src, size_t size, uint32_t channel)
Start an asynchronous 1D DMA transfer with 64-bit wide pointers on a specific DMA channel.
Definition dma.h:29
uint32_t snrt_dma_start_2d_mcast(uint64_t dst, uint64_t src, size_t size, size_t dst_stride, size_t src_stride, size_t repeat, uint32_t mask, uint32_t channel=0)
Start an asynchronous, multicast 2D DMA transfer with 64-bit wide pointers.
Definition dma.h:290
snrt_dma_txid_t snrt_dma_store_2d_tile(void *dst, void *src, size_t tile_x1_idx, size_t tile_x0_idx, size_t tile_x1_size, size_t tile_x0_size, size_t full_x0_size, uint32_t prec, size_t tile_ld)
Store a 2D tile to a 2D array.
Definition dma.h:729
snrt_dma_txid_t snrt_dma_load_2d_tile_in_banks(void *dst, void *src, size_t tile_x1_idx, size_t tile_x0_idx, size_t tile_x1_size, size_t tile_x0_size, size_t full_x0_size, uint32_t prec, size_t num_banks)
Load a 2D tile of a 2D array and reshape it to occupy a subset of TCDM banks.
Definition dma.h:700
snrt_dma_txid_t snrt_dma_store_1d_tile(void *dst, void *src, size_t tile_idx, size_t tile_size, uint32_t prec)
Store a tile to a 1D array.
Definition dma.h:559
uint32_t snrt_dma_start_1d_reduction(uint64_t dst, uint64_t src, size_t size, uint64_t mask, snrt_collective_opcode_t opcode, uint32_t channel=0)
Start an asynchronous reduction 1D DMA transfer with 64-bit wide pointers.
Definition dma.h:132
snrt_dma_txid_t snrt_dma_2d_to_1d(volatile void *dst, volatile void *src, size_t size, size_t row_size, size_t stride)
Transfer and reshape a 2D array into a 1D array.
Definition dma.h:544
void snrt_dma_enable_reduction(uint64_t mask, snrt_collective_opcode_t opcode)
Enable reduction operations for successive transfers.
Definition dma.h:104
void snrt_dma_wait_all_channels(uint32_t num_channels)
Block until the first num_channels channels are idle.
Definition dma.h:405
void snrt_dma_set_opcode_params(uint32_t opcode, uint32_t params)
Set the on-the-fly compute configuration for subsequent transfers.
Definition dma.h:803
snrt_dma_txid_t snrt_dma_reduction_load_1d_tile(void *dst, void *src, size_t tile_idx, size_t tile_size, uint32_t prec, uint64_t mask, snrt_collective_opcode_t opcode)
Load a tile of a 1D array.
Definition dma.h:512
void snrt_dma_memset(void *ptr, uint8_t value, uint32_t len)
Fast memset function performed by DMA.
Definition dma.h:442
void snrt_dma_enable_multicast(uint64_t mask)
Enable multicast for successive transfers.
Definition dma.h:89
static void snrt_dma_wait(snrt_dma_txid_t txid, const uint32_t channel=0)
Block until a DMA transfer finishes on a specific DMA channel.
Definition dma.h:372
snrt_dma_txid_t snrt_dma_load_2d_tile(void *dst, void *src, size_t tile_x1_idx, size_t tile_x0_idx, size_t tile_x1_size, size_t tile_x0_size, size_t full_x0_size, uint32_t prec, size_t tile_ld)
Load a 2D tile of a 2D array.
Definition dma.h:582
static uint32_t snrt_dma_busy(const uint32_t channel)
Read DMA busy flag.
Definition dma.h:327
uint32_t snrt_dma_start_transpose(uint64_t dst, uint64_t src, size_t size, uint32_t mode, uint32_t tensor_m, uint32_t tensor_n, uint32_t channel=0)
Start an asynchronous transposing DMA transfer.
Definition dma.h:854
void snrt_dma_enable_transpose(uint32_t mode, uint32_t tensor_m, uint32_t tensor_n)
Enable the tiled transpose of a row-major tensor for successive transfers.
Definition dma.h:827
static void snrt_dma_wait_all(const uint32_t channel=0)
Block until a specific DMA channel is idle.
Definition dma.h:394
void snrt_dma_start_tracking()
Start tracking of dma performance region. Does not have any implications on the HW....
Definition dma.h:417
snrt_dma_txid_t snrt_dma_load_2d_tile_mcast(void *dst, void *src, size_t tile_x1_idx, size_t tile_x0_idx, size_t tile_x1_size, size_t tile_x0_size, size_t full_x0_size, uint32_t prec, size_t tile_ld, uint32_t mask)
Load a 2D tile of a 2D array using multicast.
Definition dma.h:626
void snrt_dma_stop_tracking()
Stop tracking of dma performance region. Does not have any implications on the HW....
Definition dma.h:429
Definition sync_decls.h:15
Definition sync_decls.h:55