Snitch Runtime
Loading...
Searching...
No Matches
dma.h
Go to the documentation of this file.
1// Copyright 2023 ETH Zurich and University of Bologna.
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5#ifndef SNRT_SUPPORTS_DMA
6#include <string.h>
7#endif
8
14#pragma once
15
16#include <math.h>
17
18#include "idma_compute.h"
19
29inline uint32_t snrt_dma_start_1d(uint64_t dst, uint64_t src, size_t size,
30 uint32_t channel) {
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;
37 uint32_t txid;
38
39 asm volatile(
40 "dmsrc %[src_lo], %[src_hi] \n"
41 "dmdst %[dst_lo], %[dst_hi] \n"
42 "dmcpy %[txid], %[size], %[cfg] \n"
43 : [ txid ] "=r"(txid)
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),
46 [ cfg ] "r"(cfg));
47 return txid;
48#else
49 memcpy((void *)dst, (const void *)src, size);
50 return 0;
51#endif
52}
53
60inline uint32_t snrt_dma_start_1d(volatile void *dst, volatile void *src,
61 size_t size, uint32_t channel = 0) {
62 return snrt_dma_start_1d((uint64_t)dst, (uint64_t)src, size, channel);
63}
64
72inline void snrt_dma_set_awuser(uint64_t field) {
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"
77 :
78 : [ user_low ] "r"(user_low), [ user_high ] "r"(user_high));
79#endif
80}
81
89inline void snrt_dma_enable_multicast(uint64_t mask) {
91 op.f.opcode = SNRT_COLLECTIVE_MULTICAST;
92 op.f.mask = mask;
94}
95
104inline void snrt_dma_enable_reduction(uint64_t mask,
105 snrt_collective_opcode_t opcode) {
107 op.f.opcode = opcode;
108 op.f.mask = mask;
110}
111
117
123
132inline uint32_t snrt_dma_start_1d_reduction(uint64_t dst, uint64_t src,
133 size_t size, uint64_t mask,
134 snrt_collective_opcode_t opcode,
135 uint32_t channel = 0) {
136 snrt_dma_enable_reduction(mask, opcode);
137 uint32_t txid = snrt_dma_start_1d(dst, src, size, channel);
139 return txid;
140}
141
150inline uint32_t snrt_dma_start_1d_reduction(uint64_t dst, uint64_t src,
151 size_t size, snrt_comm_t comm,
152 snrt_collective_opcode_t opcode,
153 uint32_t channel = 0) {
154 uint64_t mask = snrt_get_collective_mask(comm);
155 uint32_t txid =
156 snrt_dma_start_1d_reduction(dst, src, size, mask, opcode, channel);
157 return txid;
158}
159
167inline uint32_t snrt_dma_start_1d_mcast(uint64_t dst, uint64_t src, size_t size,
168 uint64_t mask, uint32_t channel = 0) {
170 uint32_t txid = snrt_dma_start_1d(dst, src, size, channel);
172 return txid;
173}
174
182inline uint32_t snrt_dma_start_1d_mcast(uint64_t dst, uint64_t src, size_t size,
183 snrt_comm_t comm,
184 uint32_t channel = 0) {
185 uint64_t mask = snrt_get_collective_mask(comm);
186 uint32_t txid = snrt_dma_start_1d_mcast(dst, src, size, mask, channel);
187 return txid;
188}
189
198inline uint32_t snrt_dma_start_1d_reduction(volatile void *dst,
199 volatile void *src, size_t size,
200 uint64_t mask,
201 snrt_collective_opcode_t opcode,
202 uint32_t channel = 0) {
203 return snrt_dma_start_1d_reduction((uint64_t)dst, (uint64_t)src, size, mask,
204 opcode, channel);
205}
206
215inline uint32_t snrt_dma_start_1d_mcast(volatile void *dst, volatile void *src,
216 size_t size, uint64_t mask,
217 uint32_t channel = 0) {
218 return snrt_dma_start_1d_mcast((uint64_t)dst, (uint64_t)src, size, mask,
219 channel);
220}
221
235inline snrt_dma_txid_t snrt_dma_start_2d(uint64_t dst, uint64_t src,
236 size_t size, size_t dst_stride,
237 size_t src_stride, size_t repeat,
238 uint32_t channel) {
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;
245 uint32_t txid;
246
247 asm volatile(
248 "dmsrc %[src_lo], %[src_hi] \n"
249 "dmdst %[dst_lo], %[dst_hi] \n"
250 "dmstr %[src_stride], %[dst_stride] \n"
251 "dmrep %[repeat] \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));
258
259 return txid;
260#else
261 // TODO(colluca): we can implement this as a series of memcpy calls
262 return 0;
263#endif
264}
265
273inline uint32_t snrt_dma_start_2d(volatile void *dst, volatile void *src,
274 size_t size, size_t dst_stride,
275 size_t src_stride, size_t repeat,
276 uint32_t channel = 0) {
277 return snrt_dma_start_2d((uint64_t)dst, (uint64_t)src, size, dst_stride,
278 src_stride, repeat, channel);
279}
280
290inline uint32_t snrt_dma_start_2d_mcast(uint64_t dst, uint64_t src, size_t size,
291 size_t dst_stride, size_t src_stride,
292 size_t repeat, uint32_t mask,
293 uint32_t channel = 0) {
295 uint32_t txid = snrt_dma_start_2d(dst, src, size, dst_stride, src_stride,
296 repeat, channel);
298 return txid;
299}
300
309inline uint32_t snrt_dma_start_2d_mcast(volatile void *dst, volatile void *src,
310 size_t size, size_t dst_stride,
311 size_t src_stride, size_t repeat,
312 uint32_t mask, uint32_t channel = 0) {
313 return snrt_dma_start_2d_mcast((uint64_t)dst, (uint64_t)src, size,
314 dst_stride, src_stride, repeat, mask,
315 channel);
316}
317
327static inline uint32_t snrt_dma_busy(const uint32_t channel) {
328#ifdef SNRT_SUPPORTS_DMA
329 uint32_t busy;
330 asm volatile("dmstati %[busy], (%[channel] << 2) | 2 \n"
331 : [ busy ] "=r"(busy)
332 : [ channel ] "i"(channel)
333 :);
334 return busy;
335#else
336 return 0;
337#endif
338}
339
349static inline uint32_t snrt_dma_would_block(const uint32_t 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)
355 :);
356 return would_block;
357#else
358 return 0;
359#endif
360}
361
372static inline void snrt_dma_wait(snrt_dma_txid_t txid,
373 const uint32_t channel = 0) {
374#ifdef SNRT_SUPPORTS_DMA
375 asm volatile(
376 "1: \n"
377 "dmstati t0, (%[channel] << 2) | 0 \n"
378 "bltu t0, %[txid], 1b \n"
379 :
380 : [ txid ] "r"(txid), [ channel ] "i"(channel)
381 : "t0");
382#endif
383}
384
394static inline void snrt_dma_wait_all(const uint32_t channel = 0) {
395#ifdef SNRT_SUPPORTS_DMA
396 while (snrt_dma_busy(channel))
397 ;
398#endif
399}
400
405inline void snrt_dma_wait_all_channels(uint32_t num_channels) {
406 for (int c = 0; c < num_channels; c++) {
408 }
409}
410
418#ifdef SNRT_SUPPORTS_DMA
419 asm volatile("dmstati zero, 0 \n");
420#endif
421}
422
430#ifdef SNRT_SUPPORTS_DMA
431 asm volatile("dmstati zero, 0 \n");
432#endif
433}
434
442inline void snrt_dma_memset(void *ptr, uint8_t value, uint32_t len) {
443#ifdef SNRT_SUPPORTS_DMA
444 // We set the first 64 bytes to the value, and then we use the DMA to copy
445 // these into the remaining memory region. DMA is used only if len is
446 // larger than 64 bytes, and an integer multiple of 64 bytes.
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;
450
451 uint32_t nbytes = len < 64 || !use_dma ? len : 64;
452 while (nbytes--) {
453 *p++ = value;
454 }
455
456 if (use_dma) {
457 snrt_dma_start_2d(ptr, ptr, 64, 64, 0, n_1d_transfers);
459 }
460#else
461 memset(ptr, (int)value, len);
462#endif
463}
464
473inline snrt_dma_txid_t snrt_dma_load_1d_tile(volatile void *dst,
474 volatile void *src,
475 size_t tile_idx, size_t tile_size,
476 uint32_t prec) {
477 size_t tile_nbytes = tile_size * prec;
478 return snrt_dma_start_1d(
479 (uint64_t)dst, (uint64_t)src + tile_idx * tile_nbytes, tile_nbytes);
480}
481
491inline snrt_dma_txid_t snrt_dma_load_1d_tile_mcast(void *dst, void *src,
492 size_t tile_idx,
493 size_t tile_size,
494 uint32_t prec,
495 uint64_t mask) {
496 size_t tile_nbytes = tile_size * prec;
497 return snrt_dma_start_1d_mcast((uintptr_t)dst,
498 (uintptr_t)src + tile_idx * tile_nbytes,
499 tile_nbytes, mask);
500}
501
512inline snrt_dma_txid_t snrt_dma_reduction_load_1d_tile(
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;
516 return snrt_dma_start_1d_reduction((uintptr_t)dst,
517 (uintptr_t)src + tile_idx * tile_nbytes,
518 tile_nbytes, mask, opcode);
519}
520
529inline snrt_dma_txid_t snrt_dma_1d_to_2d(volatile void *dst, volatile void *src,
530 size_t size, size_t row_size,
531 size_t stride) {
532 return snrt_dma_start_2d(dst, src, row_size, stride, row_size,
533 size / row_size);
534}
535
544inline snrt_dma_txid_t snrt_dma_2d_to_1d(volatile void *dst, volatile void *src,
545 size_t size, size_t row_size,
546 size_t stride) {
547 return snrt_dma_start_2d(dst, src, row_size, row_size, stride,
548 size / row_size);
549}
550
559inline snrt_dma_txid_t snrt_dma_store_1d_tile(void *dst, void *src,
560 size_t tile_idx, size_t tile_size,
561 uint32_t prec) {
562 size_t tile_nbytes = tile_size * prec;
563 return snrt_dma_start_1d((uint64_t)dst + tile_idx * tile_nbytes,
564 (uint64_t)src, tile_nbytes);
565}
566
582inline snrt_dma_txid_t snrt_dma_load_2d_tile(
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;
587 // Advance src array in x0 and x1 dimensions, and convert to byte offset
588 src_offset += tile_x0_idx * tile_x0_size;
589 src_offset += tile_x1_idx * tile_x1_size * full_x0_size;
590 src_offset *= prec;
591 // Initiate transfer
592 return snrt_dma_start_2d((uint64_t)dst, // dst
593 (uint64_t)src + src_offset, // src
594 tile_x0_size * prec, // size
595 tile_ld, // dst_stride
596 full_x0_size * prec, // src_stride
597 tile_x1_size // repeat
598 );
599}
600
610inline snrt_dma_txid_t snrt_dma_load_2d_tile(
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,
613 uint32_t prec) {
614 return snrt_dma_load_2d_tile(dst, src, tile_x1_idx, tile_x0_idx,
615 tile_x1_size, tile_x0_size, full_x0_size, prec,
616 tile_x0_size * prec);
617}
618
626inline snrt_dma_txid_t snrt_dma_load_2d_tile_mcast(
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;
631 // Advance src array in x0 and x1 dimensions, and convert to byte offset
632 src_offset += tile_x0_idx * tile_x0_size;
633 src_offset += tile_x1_idx * tile_x1_size * full_x0_size;
634 src_offset *= prec;
635 // Initiate transfer
636 return snrt_dma_start_2d_mcast((uint64_t)dst, // dst
637 (uint64_t)src + src_offset, // src
638 tile_x0_size * prec, // size
639 tile_ld, // dst_stride
640 full_x0_size * prec, // src_stride
641 tile_x1_size, // repeat
642 mask // mask
643 );
644}
645
655inline snrt_dma_txid_t snrt_dma_load_2d_tile_mcast(
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) {
659 return snrt_dma_load_2d_tile_mcast(dst, src, tile_x1_idx, tile_x0_idx,
660 tile_x1_size, tile_x0_size, full_x0_size,
661 prec, tile_x0_size * prec, mask);
662}
663
674inline snrt_dma_txid_t snrt_dma_load_2d_tile_mcast(
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,
677 uint32_t prec, snrt_comm_t comm) {
678 uint64_t mask = snrt_get_collective_mask(comm);
679 return snrt_dma_load_2d_tile_mcast(dst, src, tile_x1_idx, tile_x0_idx,
680 tile_x1_size, tile_x0_size, full_x0_size,
681 prec, mask);
682}
683
700inline snrt_dma_txid_t snrt_dma_load_2d_tile_in_banks(
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) {
704 // Calculate new tile size after reshaping the tile in the selected 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;
709 return snrt_dma_load_2d_tile(dst, src, tile_x1_idx, tile_x0_idx,
710 tile_x1_size_in_banks, tile_x0_size_in_banks,
711 full_x0_size, prec, tile_ld);
712}
713
729inline snrt_dma_txid_t snrt_dma_store_2d_tile(
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;
734 // Advance dst array in x0 and x1 dimensions, and convert to byte offset
735 dst_offset += tile_x0_idx * tile_x0_size;
736 dst_offset += tile_x1_idx * tile_x1_size * full_x0_size;
737 dst_offset *= prec;
738 // Initiate transfer
739 return snrt_dma_start_2d((uint64_t)dst + dst_offset, // dst
740 (uint64_t)src, // src
741 tile_x0_size * prec, // size
742 full_x0_size * prec, // dst_stride
743 tile_ld, // src_stride
744 tile_x1_size // repeat
745 );
746}
747
757inline snrt_dma_txid_t snrt_dma_store_2d_tile(
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,
760 uint32_t prec) {
761 return snrt_dma_store_2d_tile(dst, src, tile_x1_idx, tile_x0_idx,
762 tile_x1_size, tile_x0_size, full_x0_size,
763 prec, tile_x0_size * prec);
764}
765
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) {
786 // Calculate new tile size after reshaping the tile in the selected 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;
791 return snrt_dma_store_2d_tile(dst, src, tile_x1_idx, tile_x0_idx,
792 tile_x1_size_in_banks, tile_x0_size_in_banks,
793 full_x0_size, prec, tile_ld);
794}
795
803inline void snrt_dma_set_opcode_params(uint32_t opcode, uint32_t params) {
804#ifdef SNRT_SUPPORTS_DMA_COMPUTE
805 asm volatile("dmopc %[opcode], %[params] \n"
806 :
807 : [ opcode ] "r"(opcode), [ params ] "r"(params)
808 : "memory");
809#endif
810}
811
816inline void snrt_dma_set_opcode(uint32_t opcode) {
817 snrt_dma_set_opcode_params(opcode, 0u);
818}
819
827inline void snrt_dma_enable_transpose(uint32_t mode, uint32_t tensor_m,
828 uint32_t tensor_n) {
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));
836}
837
843 snrt_dma_set_opcode(IDMA_DMOPC_OPC_PASSTHROUGH);
844}
845
854inline uint32_t snrt_dma_start_transpose(uint64_t dst, uint64_t src,
855 size_t size, uint32_t mode,
856 uint32_t tensor_m, uint32_t tensor_n,
857 uint32_t channel = 0) {
858 snrt_dma_enable_transpose(mode, tensor_m, tensor_n);
859 uint32_t txid = snrt_dma_start_1d(dst, src, size, channel);
861 return txid;
862}
863
869inline uint32_t snrt_dma_start_transpose(volatile void *dst, volatile void *src,
870 size_t size, uint32_t mode,
871 uint32_t tensor_m, uint32_t tensor_n,
872 uint32_t channel = 0) {
873 return snrt_dma_start_transpose((uint64_t)dst, (uint64_t)src, size, mode,
874 tensor_m, tensor_n, channel);
875}
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