Re: [dpdk-dev] [PATCH] gpudev: introduce memory API
From: Wang, Haiyue <hidden>
Date: 2021-06-04 11:07:43
-----Original Message----- From: dev <redacted> On Behalf Of Thomas Monjalon Sent: Thursday, June 3, 2021 04:36 To: dev@dpdk.org Cc: Elena Agostini <redacted> Subject: [dpdk-dev] [PATCH] gpudev: introduce memory API From: Elena Agostini <redacted> The new library gpudev is for dealing with GPU from a DPDK application in a vendor-agnostic way. As a first step, the features are focused on memory management. A function allows to allocate memory inside the GPU, while another one allows to use main (CPU) memory from the GPU. The infrastructure is prepared to welcome drivers in drivers/gpu/ as the upcoming NVIDIA one, implementing the gpudev API. Other additions planned for next revisions: - C implementation file - guide documentation - unit tests - integration in testpmd to enable Rx/Tx to/from GPU memory. The next step should focus on GPU processing task control. Signed-off-by: Elena Agostini <redacted> Signed-off-by: Thomas Monjalon <redacted> --- .gitignore | 1 + MAINTAINERS | 6 + doc/api/doxy-api-index.md | 1 + doc/api/doxy-api.conf.in | 1 + doc/guides/conf.py | 8 ++ doc/guides/gpus/features/default.ini | 13 ++ doc/guides/gpus/index.rst | 11 ++ doc/guides/gpus/overview.rst | 7 + doc/guides/index.rst | 1 + doc/guides/prog_guide/gpu.rst | 5 + doc/guides/prog_guide/index.rst | 1 + drivers/gpu/meson.build | 4 + drivers/meson.build | 1 + lib/gpudev/gpu_driver.h | 44 +++++++ lib/gpudev/meson.build | 9 ++ lib/gpudev/rte_gpudev.h | 183 +++++++++++++++++++++++++++ lib/gpudev/version.map | 11 ++ lib/meson.build | 1 + 18 files changed, 308 insertions(+) create mode 100644 doc/guides/gpus/features/default.ini create mode 100644 doc/guides/gpus/index.rst create mode 100644 doc/guides/gpus/overview.rst create mode 100644 doc/guides/prog_guide/gpu.rst create mode 100644 drivers/gpu/meson.build create mode 100644 lib/gpudev/gpu_driver.h create mode 100644 lib/gpudev/meson.build create mode 100644 lib/gpudev/rte_gpudev.h create mode 100644 lib/gpudev/version.map
quoted hunk ↗ jump to hunk
+#include <stdint.h> + +#include <rte_common.h> + +#include "rte_gpudev.h" + +struct rte_gpu_dev; + +typedef int (*gpu_malloc_t)(struct rte_gpu_dev *dev, size_t size, void **ptr); +typedef int (*gpu_free_t)(struct rte_gpu_dev *dev, void *ptr); + +struct rte_gpu_dev { + /* Backing device. */ + struct rte_device *device; + /* GPU info structure. */ + struct rte_gpu_info info; + /* Counter of processes using the device. */ + uint16_t process_cnt; + /* If device is currently used or not. */ + enum rte_gpu_state state; + /* FUNCTION: Allocate memory on the GPU. */ + gpu_malloc_t gpu_malloc; + /* FUNCTION: Allocate memory on the CPU visible from the GPU. */ + gpu_malloc_t gpu_malloc_visible; + /* FUNCTION: Free allocated memory on the GPU. */ + gpu_free_t gpu_free;
I'm wondering that we can define the malloc type as: typedef int (*gpu_malloc_t)(struct rte_gpu_dev *dev, size_t size, void **ptr, unsigned int flags) #define RTE_GPU_MALLOC_F_CPU_VISIBLE 0x01u --> gpu_malloc_visible Then only one malloc function member is needed, paired with 'gpu_free'.
quoted hunk ↗ jump to hunk
+ /* Device interrupt handle. */ + struct rte_intr_handle *intr_handle; + /* Driver-specific private data. */ + void *dev_private; +} __rte_cache_aligned; +
quoted hunk ↗ jump to hunk
+/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Allocate a chunk of memory on the GPU. + * + * @param gpu_id + * GPU ID to allocate memory. + * @param size + * Number of bytes to allocate. + * @param ptr + * Pointer to store the address of the allocated memory. + * + * @return + * 0 on success, -1 otherwise. + */ +__rte_experimental +int rte_gpu_malloc(uint16_t gpu_id, size_t size, void **ptr); + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Allocate a chunk of memory on the CPU that is visible from the GPU. + * + * @param gpu_id + * Reference GPU ID. + * @param size + * Number of bytes to allocate. + * @param ptr + * Pointer to store the address of the allocated memory. + * + * @return + * 0 on success, -1 otherwise. + */ +__rte_experimental +int rte_gpu_malloc_visible(uint16_t gpu_id, size_t size, void **ptr);
Then 'rte_gpu_malloc_visible' is no needed, and the new call is: rte_gpu_malloc(uint16_t gpu_id, size_t size, void **ptr, RTE_GPU_MALLOC_F_CPU_VISIBLE). Also, we can define more flags for feature extension. ;-)
+ +#ifdef __cplusplus +} -- 2.31.1