DPU Host API  2025.1.0
dpu.h
Go to the documentation of this file.
1 /* Copyright 2020 UPMEM. All rights reserved.
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  */
5 
6 #ifndef DPU_H
7 #define DPU_H
8 
9 #include <limits.h>
10 #include <stdbool.h>
11 #include <stddef.h>
12 #include <stdint.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 
16 // IWYU pragma: begin_exports
17 #include <dpu_checkpoint.h>
18 #include <dpu_error.h>
19 #include <dpu_types.h>
20 #include <dpu_macro_utils.h>
21 #include <dpu_fifo.h>
22 #include <dpu_bank_interface_pmc.h>
23 // IWYU pragma: end_exports
24 
53 typedef enum _dpu_launch_policy_t {
62 
66 typedef enum _dpu_xfer_t {
71 } dpu_xfer_t;
72 
76 typedef enum _dpu_xfer_flags_t {
85  DPU_XFER_ASYNC = 1 << 1,
94 
98 typedef enum _dpu_sg_xfer_flags_t {
112 
114 
118 typedef enum _dpu_callback_flags_t {
139 
146 #define DPU_CHECK(statement, on_error) \
147  do { \
148  dpu_error_t __error = (statement); \
149  if (__error != DPU_OK) { \
150  char *__error_string = dpu_error_to_string(__error); \
151  fprintf(stderr, "%s:%d(%s): DPU Error (%s)\n", __FILE__, __LINE__, __func__, __error_string); \
152  free(__error_string); \
153  on_error; \
154  } \
155  } while (0)
156 
162 #define DPU_ASSERT(statement) DPU_CHECK(statement, exit(EXIT_FAILURE))
163 
168 #define DPU_ALLOCATE_ALL (UINT_MAX)
169 
182 dpu_alloc(uint32_t nr_dpus, const char *profile, struct dpu_set_t *dpu_set);
183 
196 dpu_alloc_ranks(uint32_t nr_ranks, const char *profile, struct dpu_set_t *dpu_set);
197 
207 dpu_free(struct dpu_set_t dpu_set);
208 
216 dpu_get_nr_ranks(struct dpu_set_t dpu_set, uint32_t *nr_ranks);
217 
225 dpu_get_nr_dpus(struct dpu_set_t dpu_set, uint32_t *nr_dpus);
226 
234 #define DPU_RANK_FOREACH(set, ...) _CONCAT(_DPU_RANK_FOREACH_, _DPU_FOREACH_VARIANT(set, ##__VA_ARGS__))(set, ##__VA_ARGS__)
235 
241 #define _DPU_RANK_FOREACH_X(set, rank) \
242  for (struct dpu_set_rank_iterator_t __rank_it = dpu_set_rank_iterator_from(&set); rank = __rank_it.next, __rank_it.has_next; \
243  dpu_set_rank_iterator_next(&__rank_it))
244 
250 #define _DPU_RANK_FOREACH_I(set, rank, i) \
251  for (struct dpu_set_rank_iterator_t __rank_it = dpu_set_rank_iterator_from(&set); \
252  i = __rank_it.count, rank = __rank_it.next, __rank_it.has_next; \
253  dpu_set_rank_iterator_next(&__rank_it))
254 
262 #define DPU_FOREACH(set, ...) _CONCAT(_DPU_FOREACH_, _DPU_FOREACH_VARIANT(set, ##__VA_ARGS__))(set, ##__VA_ARGS__)
263 
269 #define _DPU_FOREACH_X(set, dpu) \
270  for (struct dpu_set_dpu_iterator_t __dpu_it = dpu_set_dpu_iterator_from(&set); dpu = __dpu_it.next, __dpu_it.has_next; \
271  dpu_set_dpu_iterator_next(&__dpu_it))
272 
278 #define _DPU_FOREACH_I(set, dpu, i) \
279  for (struct dpu_set_dpu_iterator_t __dpu_it = dpu_set_dpu_iterator_from(&set); \
280  i = __dpu_it.count, dpu = __dpu_it.next, __dpu_it.has_next; \
281  dpu_set_dpu_iterator_next(&__dpu_it))
282 
289 struct dpu_set_rank_iterator_t {
290  struct dpu_set_t *set;
291  uint32_t count;
292  uint32_t next_idx;
293  bool has_next;
294  struct dpu_set_t next;
295 };
296 
303 struct dpu_set_dpu_iterator_t {
304  struct dpu_set_rank_iterator_t rank_iterator;
305  uint32_t count;
306  uint32_t next_idx;
307  bool has_next;
308  struct dpu_set_t next;
309 };
310 
320 struct dpu_set_rank_iterator_t
321 dpu_set_rank_iterator_from(struct dpu_set_t *set);
322 
331 void
332 dpu_set_rank_iterator_next(struct dpu_set_rank_iterator_t *iterator);
333 
343 struct dpu_set_dpu_iterator_t
344 dpu_set_dpu_iterator_from(struct dpu_set_t *set);
345 
354 void
355 dpu_set_dpu_iterator_next(struct dpu_set_dpu_iterator_t *iterator);
356 
367 dpu_load_from_memory(struct dpu_set_t dpu_set, uint8_t *buffer, size_t buffer_size, struct dpu_program_t **program);
368 
378 dpu_load_from_incbin(struct dpu_set_t dpu_set, struct dpu_incbin_t *incbin, struct dpu_program_t **program);
379 
389 dpu_load(struct dpu_set_t dpu_set, const char *binary_path, struct dpu_program_t **program);
390 
399 dpu_get_symbol(struct dpu_program_t *program, const char *symbol_name, struct dpu_symbol_t *symbol);
400 
408 dpu_launch(struct dpu_set_t dpu_set, dpu_launch_policy_t policy);
409 
418 dpu_status(struct dpu_set_t dpu_set, bool *done, bool *fault);
419 
426 dpu_sync(struct dpu_set_t dpu_set);
427 
438 dpu_copy_to(struct dpu_set_t dpu_set, const char *symbol_name, uint32_t symbol_offset, const void *src, size_t length);
439 
450 dpu_copy_from(struct dpu_set_t dpu_set, const char *symbol_name, uint32_t symbol_offset, void *dst, size_t length);
451 
462 dpu_copy_to_symbol(struct dpu_set_t dpu_set, struct dpu_symbol_t symbol, uint32_t symbol_offset, const void *src, size_t length);
463 
474 dpu_copy_from_symbol(struct dpu_set_t dpu_set, struct dpu_symbol_t symbol, uint32_t symbol_offset, void *dst, size_t length);
475 
487 dpu_prepare_xfer(struct dpu_set_t dpu_set, void *buffer);
488 
494  uint8_t *addr;
496  uint32_t length;
497 };
498 
507 typedef bool (*get_block_func_t)(struct sg_block_info *out, uint32_t dpu_index, uint32_t block_index, void *args);
508 
513 typedef struct get_block_t {
517  void *args;
519  size_t args_size;
520 } get_block_t;
521 
541 dpu_push_sg_xfer(struct dpu_set_t dpu_set,
542  dpu_xfer_t xfer,
543  const char *symbol_name,
544  uint32_t symbol_offset,
545  size_t length,
546  get_block_t *get_block_info,
547  dpu_sg_xfer_flags_t flags);
548 
568 dpu_push_sg_xfer_symbol(struct dpu_set_t dpu_set,
569  dpu_xfer_t xfer,
570  struct dpu_symbol_t symbol,
571  uint32_t symbol_offset,
572  size_t length,
573  get_block_t *get_block_info,
574  dpu_sg_xfer_flags_t flags);
575 
592 dpu_push_xfer(struct dpu_set_t dpu_set,
593  dpu_xfer_t xfer,
594  const char *symbol_name,
595  uint32_t symbol_offset,
596  size_t length,
597  dpu_xfer_flags_t flags);
598 
615 dpu_push_xfer_symbol(struct dpu_set_t dpu_set,
616  dpu_xfer_t xfer,
617  struct dpu_symbol_t symbol,
618  uint32_t symbol_offset,
619  size_t length,
620  dpu_xfer_flags_t flags);
621 
634 dpu_broadcast_to(struct dpu_set_t dpu_set,
635  const char *symbol_name,
636  uint32_t symbol_offset,
637  const void *src,
638  size_t length,
639  dpu_xfer_flags_t flags);
640 
653 dpu_broadcast_to_symbol(struct dpu_set_t dpu_set,
654  struct dpu_symbol_t symbol,
655  uint32_t symbol_offset,
656  const void *src,
657  size_t length,
658  dpu_xfer_flags_t flags);
659 
669 dpu_fifo_prepare_xfer(struct dpu_set_t dpu_set, struct dpu_fifo_link_t *fifo_link, void *buffer);
670 
687 dpu_fifo_push_xfer(struct dpu_set_t dpu_set, struct dpu_fifo_link_t *fifo_link, dpu_xfer_flags_t flags);
688 
699 dpu_callback(struct dpu_set_t dpu_set,
700  dpu_error_t (*callback)(struct dpu_set_t, uint32_t, void *),
701  void *args,
702  dpu_callback_flags_t flags);
703 
710 /* clang-format off */
711 #define DPU_INCBIN(name, file) \
712  __asm__(".pushsection .rodata.dpu_incbin\n" \
713  ".global dpu_incbin_" _STR(name) "\n" \
714  ".type dpu_incbin_" _STR(name) ", @object\n" \
715  "dpu_incbin_" _STR(name) ":\n" \
716  ".incbin \"" file "\"\n" \
717  \
718  ".size dpu_incbin_" _STR(name) ", .-dpu_incbin_" _STR(name) "\n" \
719  ".global dpu_incbin_" _STR(name) "_size\n" \
720  "dpu_incbin_" _STR(name) "_size = . - dpu_incbin_" _STR(name) "\n" \
721  ".popsection\n" \
722  ); \
723  extern const void *dpu_incbin_ ## name; \
724  extern const void *dpu_incbin_ ## name ## _size; \
725  struct dpu_incbin_t name = {.buffer = (uint8_t *)&dpu_incbin_ ## name , \
726  .size = (size_t)&dpu_incbin_ ## name ## _size, \
727  .path = file };
728 /* clang-format on */
729 
737 dpu_log_read(struct dpu_set_t set, FILE *stream);
738 
739 #endif // DPU_H
dpu_error_t dpu_load_from_memory(struct dpu_set_t dpu_set, uint8_t *buffer, size_t buffer_size, struct dpu_program_t **program)
Load a program from the memory in all the DPUs of a DPU set.
dpu_error_t dpu_get_nr_ranks(struct dpu_set_t dpu_set, uint32_t *nr_ranks)
Fetch the number of DPU ranks in a given DPU set.
dpu_error_t dpu_callback(struct dpu_set_t dpu_set, dpu_error_t(*callback)(struct dpu_set_t, uint32_t, void *), void *args, dpu_callback_flags_t flags)
Execute a user-defined function with the given DPU set as argument.
dpu_error_t dpu_push_xfer(struct dpu_set_t dpu_set, dpu_xfer_t xfer, const char *symbol_name, uint32_t symbol_offset, size_t length, dpu_xfer_flags_t flags)
Execute the memory transfer on the DPU set.
dpu_error_t dpu_broadcast_to_symbol(struct dpu_set_t dpu_set, struct dpu_symbol_t symbol, uint32_t symbol_offset, const void *src, size_t length, dpu_xfer_flags_t flags)
Execute the broadcast memory transfer on the DPU set.
Base DPU types in the C API.
enum _dpu_xfer_t dpu_xfer_t
Direction for a DPU memory transfer.
_dpu_launch_policy_t
The different synchronization methods for launching DPUs. polling method to check whether the executi...
Definition: dpu.h:53
Definition: dpu.h:132
Definition: dpu.h:70
Definition: dpu.h:60
dpu_error_t dpu_launch(struct dpu_set_t dpu_set, dpu_launch_policy_t policy)
Request the boot of all the DPUs in a DPU set.
dpu_error_t dpu_broadcast_to(struct dpu_set_t dpu_set, const char *symbol_name, uint32_t symbol_offset, const void *src, size_t length, dpu_xfer_flags_t flags)
Execute the broadcast memory transfer on the DPU set.
dpu_error_t dpu_sync(struct dpu_set_t dpu_set)
Wait for the end of the execution on the DPU set.
dpu_error_t dpu_load_from_incbin(struct dpu_set_t dpu_set, struct dpu_incbin_t *incbin, struct dpu_program_t **program)
Load a program from a "struct dpu_incbin" in all the DPUs of a DPU set.
dpu_error_t dpu_alloc_ranks(uint32_t nr_ranks, const char *profile, struct dpu_set_t *dpu_set)
Allocate the specified number of DPU ranks.
Information on a binary embedded in the program with "DPU_INCBIN".
Definition: dpu_types.h:276
dpu_error_t dpu_fifo_push_xfer(struct dpu_set_t dpu_set, struct dpu_fifo_link_t *fifo_link, dpu_xfer_flags_t flags)
Execute the memory transfer on the DPU FIFOs.
dpu_error_t dpu_push_sg_xfer_symbol(struct dpu_set_t dpu_set, dpu_xfer_t xfer, struct dpu_symbol_t symbol, uint32_t symbol_offset, size_t length, get_block_t *get_block_info, dpu_sg_xfer_flags_t flags)
Execute the scatter/gather memory transfer on the DPU set.
dpu_error_t dpu_push_xfer_symbol(struct dpu_set_t dpu_set, dpu_xfer_t xfer, struct dpu_symbol_t symbol, uint32_t symbol_offset, size_t length, dpu_xfer_flags_t flags)
Execute the memory transfer on the DPU set.
dpu_error_t dpu_get_symbol(struct dpu_program_t *program, const char *symbol_name, struct dpu_symbol_t *symbol)
Get the requested symbol information.
Information for a symbol from a DPU program.
Definition: dpu_types.h:266
Structure that stores the information about each scatter transfer memory block.
Definition: dpu.h:492
Definition: dpu.h:58
Definition: dpu.h:105
_dpu_sg_xfer_flags_t
Options for a DPU scatter gather memory transfer.
Definition: dpu.h:98
struct get_block_t get_block_t
User API structure that stores the scatter transfer get_block function pointer and its arguments...
dpu_error_t dpu_log_read(struct dpu_set_t set, FILE *stream)
reads and displays the contents of the log of a DPU
Definition: dpu.h:100
void * args
Definition: dpu.h:517
Definition: dpu.h:137
enum _dpu_sg_xfer_flags_t dpu_sg_xfer_flags_t
Options for a DPU scatter gather memory transfer.
dpu_error_t dpu_fifo_prepare_xfer(struct dpu_set_t dpu_set, struct dpu_fifo_link_t *fifo_link, void *buffer)
Set the specified buffer to be transfered for the next DPU FIFO transfer.
dpu_error_t dpu_prepare_xfer(struct dpu_set_t dpu_set, void *buffer)
Set the Host buffer of all DPUs of the DPU set for the next memory transfer.
Definition: dpu.h:85
dpu_error_t dpu_load(struct dpu_set_t dpu_set, const char *binary_path, struct dpu_program_t **program)
Load a program in all the DPUs of a DPU set.
dpu_error_t dpu_copy_to_symbol(struct dpu_set_t dpu_set, struct dpu_symbol_t symbol, uint32_t symbol_offset, const void *src, size_t length)
Copy data from the Host memory buffer to one the DPU memories.
dpu_error_t dpu_push_sg_xfer(struct dpu_set_t dpu_set, dpu_xfer_t xfer, const char *symbol_name, uint32_t symbol_offset, size_t length, get_block_t *get_block_info, dpu_sg_xfer_flags_t flags)
Execute the scatter/gather memory transfer on the DPU set.
Definition: dpu.h:92
Definition: dpu.h:78
dpu_error_t dpu_alloc(uint32_t nr_dpus, const char *profile, struct dpu_set_t *dpu_set)
Allocate a number of ranks that will have the specified number of DPUs.
get_block_func_t f
Definition: dpu.h:515
A set of DPU devices.
Definition: dpu_types.h:241
dpu_error_t
Status returned by any API operation to specify the success or failure of the operation.
Definition: dpu_error.h:17
Definition: dpu.h:68
enum _dpu_xfer_flags_t dpu_xfer_flags_t
Options for a DPU memory transfer.
dpu_error_t dpu_copy_to(struct dpu_set_t dpu_set, const char *symbol_name, uint32_t symbol_offset, const void *src, size_t length)
Copy data from the Host memory buffer to one the DPU memories.
Definition: dpu.h:127
enum _dpu_callback_flags_t dpu_callback_flags_t
Options for a DPU callback.
bool(* get_block_func_t)(struct sg_block_info *out, uint32_t dpu_index, uint32_t block_index, void *args)
User API prototype of the get_block function for scatter transfers.
Definition: dpu.h:507
Definition: dpu.h:120
dpu_error_t dpu_copy_from(struct dpu_set_t dpu_set, const char *symbol_name, uint32_t symbol_offset, void *dst, size_t length)
Copy data from one of the DPU memories to the Host memory buffer.
Define the possible status returned by the API functions.
dpu_error_t dpu_status(struct dpu_set_t dpu_set, bool *done, bool *fault)
Fetch the current state of the DPU set.
enum _dpu_launch_policy_t dpu_launch_policy_t
The different synchronization methods for launching DPUs. polling method to check whether the executi...
Definition: dpu.h:122
dpu_error_t dpu_copy_from_symbol(struct dpu_set_t dpu_set, struct dpu_symbol_t symbol, uint32_t symbol_offset, void *dst, size_t length)
Copy data from one of the DPU memories to the Host memory buffer.
_dpu_xfer_t
Direction for a DPU memory transfer.
Definition: dpu.h:66
Definition: dpu.h:80
uint32_t length
Definition: dpu.h:496
_dpu_callback_flags_t
Options for a DPU callback.
Definition: dpu.h:118
User API structure that stores the scatter transfer get_block function pointer and its arguments...
Definition: dpu.h:513
C API to create and manage DPU checkpoints.
dpu_error_t dpu_free(struct dpu_set_t dpu_set)
Free all the DPUs of a DPU set.
size_t args_size
Definition: dpu.h:519
dpu_error_t dpu_get_nr_dpus(struct dpu_set_t dpu_set, uint32_t *nr_dpus)
Fetch the number of DPUs in a given DPU set.
uint8_t * addr
Definition: dpu.h:494
_dpu_xfer_flags_t
Options for a DPU memory transfer.
Definition: dpu.h:76