38 #define SLEEP_IN_NANOS (10 * 1000)
39 #define GPU_PAGE_SIZE (1UL << 16)
42 #define DEFAULT_VALUE 0
103 DOCA_LOG_ERR(
"Failed to open DOCA device based on NIC PCI address");
123 status = doca_gpu_mem_alloc(state->
gpu_dev,
130 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to allocate gpu memory: %s",
136 strcpy(tmp_cpu,
"This is a sample piece of text from GPU");
138 DOCA_LOG_INFO(
"The GPU source buffer value to be copied to CPU memory: %s", tmp_cpu);
154 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to allocate cpu memory");
175 DOCA_LOG_ERR(
"Failed to initialize memory objects: Failed to create core objects: %s",
183 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to allocate cpu memory");
188 strcpy(state->
src_buffer,
"This is a sample piece of text from CPU");
194 status = doca_gpu_mem_alloc(state->
gpu_dev,
201 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to allocate gpu memory: %s",
210 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to set memrange to dst mmap: %s",
218 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to set memrange to src mmap: %s",
226 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to start src mmap: %s",
234 DOCA_LOG_ERR(
"Failed to initialize memory objects: Unable to start dst mmap: %s",
243 DOCA_LOG_ERR(
"Unable to start buf: doca src_doca_buf_arr internal error");
249 DOCA_LOG_ERR(
"Unable to start buf: doca src_doca_buf_arr internal error");
256 DOCA_LOG_ERR(
"Unable to start buf: doca src_doca_buf_arr internal error");
262 DOCA_LOG_ERR(
"Unable to start buf: doca src_doca_buf_arr internal error");
275 DOCA_LOG_ERR(
"Unable to start buf: doca dst_doca_buf_arr internal error");
281 DOCA_LOG_ERR(
"Unable to start buf: doca dst_doca_buf_arr internal error");
288 DOCA_LOG_ERR(
"Unable to start buf: doca dst_doca_buf_arr internal error");
294 DOCA_LOG_ERR(
"Unable to start buf: doca dst_doca_buf_arr internal error");
312 "Failed to initialize memory objects: Unable to acquire DOCA buffer representing src buffer: %s",
325 "Failed to initialize memory objects: Unable to acquire DOCA buffer representing dst buffer: %s",
349 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to stop dma ctx: %s",
356 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to destroy dma: %s",
363 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to destroy src_mmap: %s",
370 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to destroy dst_mmap: %s",
388 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to stop dma ctx: %s",
395 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to destroy dma: %s",
403 "Failed to clean sample objects: Failed to decrease DOCA dst buffer reference count: %s",
411 "Failed to clean sample objects: Failed to decrease DOCA src buffer reference count: %s",
417 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to destroy core objects: %s",
431 status = doca_gpu_destroy(state->
gpu_dev);
433 DOCA_LOG_ERR(
"Failed to clean sample objects: Failed to destroy doca gpu: %s",
452 DOCA_LOG_ERR(
"Failed to initialize dma ctx: Unable to create DMA engine: %s",
469 DOCA_LOG_ERR(
"Failed to initialize dma ctx: Failed to connect PE to DMA: %s",
479 DOCA_LOG_ERR(
"Failed to initialize dma ctx: Unable to config DMA task %s",
488 DOCA_LOG_ERR(
"Failed to initialize dma ctx: Unable to start dma context: %s",
505 struct doca_dma_task_memcpy *memcpy_task;
506 struct doca_task *task;
507 union doca_data memcpy_task_user_data = {0};
508 struct timespec ts = {
517 memcpy_task_user_data,
520 DOCA_LOG_ERR(
"Failed to submit dma memcpy task: Failed to allocate task: %s",
565 struct doca_gpu_dma *dma_gpu,
566 struct doca_gpu_buf_arr *src_gpu_buf_arr,
567 struct doca_gpu_buf_arr *dst_gpu_buf_arr)
570 cudaStream_t cuda_stream;
571 cudaError_t res_rt = cudaSuccess;
573 res_rt = cudaStreamCreateWithFlags(&cuda_stream, cudaStreamNonBlocking);
574 if (res_rt != cudaSuccess) {
575 DOCA_LOG_ERR(
"Function cudaStreamCreateWithFlags error %d", res_rt);
589 res_rt = cudaDeviceSynchronize();
590 if (res_rt != cudaSuccess) {
591 DOCA_LOG_ERR(
"Function cudaDeviceSynchronize error %d", res_rt);
622 DOCA_LOG_ERR(
"Invalid sample configuration input value");
632 status = doca_gpu_create(
cfg->gpu_pcie_addr, &state_cpu_gpu.
gpu_dev);
691 printf(
"CPU received message from GPU: %s\n", state_gpu_cpu.
dst_buffer);
doca_error_t destroy_core_objects(struct program_core_objects *state)
doca_error_t create_core_objects(struct program_core_objects *state, uint32_t max_bufs)
static doca_error_t open_doca_device_with_pci(const char *pcie_value, struct doca_dev **retval)
struct doca_log_backend * stdout_logger
static struct doca_dev * ddev
doca_error_t gpunetio_dma_memcpy_common_launch_kernel(cudaStream_t stream, uintptr_t gpu_buffer_addr, struct doca_gpu_dma *dma_gpu, struct doca_gpu_buf_arr *src_gpu_buf_arr, struct doca_gpu_buf_arr *dst_gpu_buf_arr)
static doca_error_t launch_cuda_kernel(uintptr_t gpu_dst_buffer, struct doca_gpu_dma *dma_gpu, struct doca_gpu_buf_arr *src_gpu_buf_arr, struct doca_gpu_buf_arr *dst_gpu_buf_arr)
static void memcpy_task_common_callback(struct doca_dma_task_memcpy *dma_task, union doca_data task_user_data, union doca_data ctx_user_data)
static doca_error_t init_doca_device(char *nic_pcie_addr, struct doca_dev **ddev)
DOCA_LOG_REGISTER(GPU_DMA_MEMCPY::SAMPLE)
static doca_error_t init_dma_ctx(struct gpu_dma_sample_objects *state)
static void gpu_dma_cleanup(struct gpu_dma_sample_objects *state)
static uint8_t is_task_done
doca_error_t gpunetio_dma_memcpy(struct gpu_dma_config *cfg)
static doca_error_t submit_dma_memcpy_task(struct gpu_dma_sample_objects *state)
static doca_error_t init_sample_mem_objs(struct gpu_dma_sample_objects *state)
DOCA_EXPERIMENTAL doca_error_t doca_buf_arr_set_params(struct doca_buf_arr *buf_arr, struct doca_mmap *mmap, size_t elem_size, uint64_t start_offset)
Sets the buf array params.
DOCA_EXPERIMENTAL doca_error_t doca_buf_arr_set_target_gpu(struct doca_buf_arr *buf_arr, struct doca_gpu *gpu_handler)
Configures the buf array to be created on the gpu device.
DOCA_EXPERIMENTAL doca_error_t doca_buf_arr_get_gpu_handle(const struct doca_buf_arr *buf_arr, struct doca_gpu_buf_arr **gpu_buf_arr)
Retrieves the handle in the gpu memory space of a doca_buf_arr.
DOCA_EXPERIMENTAL doca_error_t doca_buf_arr_create(size_t num_elem, struct doca_buf_arr **buf_arr)
Allocates a doca_buf_arr.
DOCA_EXPERIMENTAL doca_error_t doca_buf_arr_start(struct doca_buf_arr *buf_arr)
This method enables the allocation of doca_bufs.
static doca_error_t doca_buf_inventory_buf_get_by_addr(struct doca_buf_inventory *inventory, struct doca_mmap *mmap, void *addr, size_t len, struct doca_buf **buf)
Allocate single element from buffer inventory and point it to the buffer defined by addr & len argume...
static doca_error_t doca_buf_inventory_buf_get_by_data(struct doca_buf_inventory *inventory, struct doca_mmap *mmap, void *data, size_t data_len, struct doca_buf **buf)
Allocate single element from buffer inventory and point it to the buffer defined by data & data_len a...
DOCA_STABLE doca_error_t doca_buf_dec_refcount(struct doca_buf *buf, uint16_t *refcount)
Decrease the object reference count by 1, if 0 reached, return the element back to the inventory.
DOCA_STABLE doca_error_t doca_ctx_start(struct doca_ctx *ctx)
Finalizes all configurations, and starts the DOCA CTX.
DOCA_EXPERIMENTAL doca_error_t doca_ctx_set_datapath_on_gpu(struct doca_ctx *ctx, struct doca_gpu *gpu_dev)
This function binds the DOCA context to a gpu device.
DOCA_STABLE doca_error_t doca_ctx_stop(struct doca_ctx *ctx)
Stops the context allowing reconfiguration.
DOCA_EXPERIMENTAL doca_error_t doca_dma_get_gpu_handle(struct doca_dma *dma, struct doca_gpu_dma **gpu_dma)
Retrieve the handle in the GPU memory space of a doca_dma.
DOCA_STABLE struct doca_task * doca_dma_task_memcpy_as_task(struct doca_dma_task_memcpy *task)
This method converts a memcpy task to doca_task.
DOCA_STABLE doca_error_t doca_dma_task_memcpy_alloc_init(struct doca_dma *dma, const struct doca_buf *src, struct doca_buf *dst, union doca_data user_data, struct doca_dma_task_memcpy **task)
This method allocates and initializes a DMA memcpy task.
DOCA_STABLE struct doca_ctx * doca_dma_as_ctx(struct doca_dma *dma)
DOCA_STABLE doca_error_t doca_dma_task_memcpy_set_conf(struct doca_dma *dma, doca_dma_task_memcpy_completion_cb_t task_completion_cb, doca_dma_task_memcpy_completion_cb_t task_error_cb, uint32_t num_memcpy_tasks)
This method sets the DMA memcpy tasks configuration.
DOCA_STABLE doca_error_t doca_dma_create(struct doca_dev *dev, struct doca_dma **dma)
DOCA_STABLE doca_error_t doca_dma_destroy(struct doca_dma *dma)
enum doca_error doca_error_t
DOCA API return codes.
DOCA_STABLE const char * doca_error_get_descr(doca_error_t error)
Returns the description string of an error code.
@ DOCA_ERROR_INVALID_VALUE
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_create_with_file_sdk(FILE *fptr, struct doca_log_backend **backend)
Create a logging backend with a FILE* stream for SDK messages.
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_set_sdk_level(struct doca_log_backend *backend, uint32_t level)
Set the log level limit for SDK logging backends.
DOCA_STABLE doca_error_t doca_mmap_set_memrange(struct doca_mmap *mmap, void *addr, size_t len)
Set the memory range of DOCA memory map.
DOCA_STABLE doca_error_t doca_mmap_destroy(struct doca_mmap *mmap)
Destroy DOCA Memory Map structure.
DOCA_STABLE doca_error_t doca_mmap_create(struct doca_mmap **mmap)
Allocates zero size memory map object with default/unset attributes.
DOCA_STABLE doca_error_t doca_mmap_start(struct doca_mmap *mmap)
Start DOCA Memory Map.
DOCA_STABLE doca_error_t doca_mmap_add_dev(struct doca_mmap *mmap, struct doca_dev *dev)
Register DOCA memory map on a given device.
DOCA_STABLE doca_error_t doca_task_get_status(const struct doca_task *task)
Get task status.
DOCA_STABLE doca_error_t doca_pe_connect_ctx(struct doca_pe *pe, struct doca_ctx *ctx)
This method connects a context to a progress engine.
DOCA_STABLE doca_error_t doca_task_submit(struct doca_task *task)
Submit a task to a progress engine.
DOCA_STABLE uint8_t doca_pe_progress(struct doca_pe *pe)
Run the progress engine.
DOCA_STABLE void doca_task_free(struct doca_task *task)
Free a task back to where it was allocated from.
@ DOCA_GPU_MEM_TYPE_GPU_CPU
const struct ip_frag_config * cfg
__UINTPTR_TYPE__ uintptr_t
struct doca_gpu * gpu_dev
struct doca_gpu_buf_arr * src_doca_gpu_buf_arr
struct doca_gpu_buf_arr * dst_doca_gpu_buf_arr
struct doca_gpu_dma * dma_gpu
struct doca_buf * dst_doca_buf
struct doca_buf_arr * src_doca_buf_arr
struct program_core_objects core_objs
struct doca_buf_arr * dst_doca_buf_arr
struct doca_buf * src_doca_buf
struct doca_mmap * src_mmap
struct doca_buf_inventory * buf_inv
struct doca_mmap * dst_mmap
Convenience type for representing opaque data.