cufile_h_wrapper.hpp
1 /*
2  * 版权所有 (c) 2022-2025, NVIDIA CORPORATION.
3  *
4  * 根据 Apache 许可,版本 2.0 ("许可") 获得许可;
5  * 除非遵守本许可,否则您不得使用此文件。
6  * 您可以在以下位置获取本许可的副本
7  *
8  * https://apache.ac.cn/licenses/LICENSE-2.0
9  *
10  * 除非适用法律要求或书面同意,否则软件
11  * 根据本许可分发,按“原样”基础分发,
12  * 不附带任何明示或暗示的保证或条件。
13  * 请参阅许可了解特定语言的管理权限和
14  * 根据本许可的限制。
15  */
16 #pragma once
17 
18 #include <sys/types.h>
19 
20 #include <kvikio/shim/cuda_h_wrapper.hpp>
21 
29 #ifdef KVIKIO_CUFILE_FOUND
30 #include <cufile.h>
31 #else
32 
33 // 如果未定义 cuFile,我们在此定义一些数据类型。
34 // 注意,这不需要与 cufile 定义 ABI 兼容。
35 
36 using CUfileHandle_t = void*;
37 using CUfileOpError = int;
38 #define CUFILE_ERRSTR(x) ("KvikIO 未使用 cuFile.h 编译")
39 #define CUFILEOP_BASE_ERR 5000
40 #define CU_FILE_SUCCESS 0
41 #define CU_FILE_CUDA_DRIVER_ERROR 1
42 
43 struct CUfileError_t {
44  CUfileOpError err; // cufile 错误
45  CUresult cu_err; // cuda 驱动错误
46 };
47 
48 using CUfileDriverControlFlags_t = enum CUfileDriverControlFlags {
49  CU_FILE_USE_POLL_MODE = 0,
50  CU_FILE_ALLOW_COMPAT_MODE = 1
51 };
52 
53 enum CUfileFileHandleType { CU_FILE_HANDLE_TYPE_OPAQUE_FD = 1 };
54 
55 struct CUfileDescr_t {
56  enum CUfileFileHandleType type;
57  struct handle_t {
58  int fd;
59  } handle;
60 };
61 
62 inline static char const* cufileop_status_error(CUfileOpError err) { return CUFILE_ERRSTR(err); };
63 CUfileError_t cuFileHandleRegister(...);
64 CUfileError_t cuFileHandleDeregister(...);
65 ssize_t cuFileRead(...);
66 ssize_t cuFileWrite(...);
67 CUfileError_t cuFileBufRegister(...);
68 CUfileError_t cuFileBufDeregister(...);
69 CUfileError_t cuFileDriverOpen(...);
70 CUfileError_t cuFileDriverClose(...);
71 CUfileError_t cuFileDriverGetProperties(...);
72 CUfileError_t cuFileDriverSetPollMode(...);
73 CUfileError_t cuFileDriverSetMaxCacheSize(...);
74 CUfileError_t cuFileDriverSetMaxPinnedMemSize(...);
75 
76 #endif
77 
78 // 如果未定义一些 cufile API,我们在此定义一些数据类型。
79 // 注意,这不需要与 cufile 定义 ABI 兼容,并且
80 // 缺少定义不是问题,因为链接器永远不会查找
81 // 这些符号,因为“真实”函数调用是通过 shim 实例进行的。
82 #ifndef KVIKIO_CUFILE_BATCH_API_FOUND
83 typedef enum CUfileOpcode { CUFILE_READ = 0, CUFILE_WRITE } CUfileOpcode_t;
84 
85 typedef enum CUFILEStatus_enum {
86  CUFILE_WAITING = 0x000001, /* 提交前所需的值 */
87  CUFILE_PENDING = 0x000002, /* 入队后 */
88  CUFILE_INVALID = 0x000004, /* 请求格式错误或无法入队 */
89  CUFILE_CANCELED = 0x000008, /* 请求成功取消 */
90  CUFILE_COMPLETE = 0x0000010, /* 请求成功完成 */
91  CUFILE_TIMEOUT = 0x0000020, /* 请求超时 */
92  CUFILE_FAILED = 0x0000040 /* 无法完成 */
93 } CUfileStatus_t;
94 
95 typedef struct CUfileIOEvents {
96  void* cookie;
97  CUfileStatus_t status; /* 操作状态 */
98  size_t ret; /* 负数表示错误,正数表示已完成的 I/O 量。 */
100 
101 CUfileError_t cuFileBatchIOSetUp(...);
102 CUfileError_t cuFileBatchIOSubmit(...);
103 CUfileError_t cuFileBatchIOGetStatus(...);
104 CUfileError_t cuFileBatchIOCancel(...);
105 CUfileError_t cuFileBatchIODestroy(...);
106 #endif
107 
108 #ifndef KVIKIO_CUFILE_STREAM_API_FOUND
109 CUfileError_t cuFileReadAsync(...);
110 CUfileError_t cuFileWriteAsync(...);
111 CUfileError_t cuFileStreamRegister(...);
112 CUfileError_t cuFileStreamDeregister(...);
113 #endif
114 
115 #ifndef KVIKIO_CUFILE_VERSION_API_FOUND
116 CUfileError_t cuFileGetVersion(...);
117 #endif