cufile_h_wrapper.hpp
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #pragma once
6 
7 #include <sys/types.h>
8 
9 #include <cuda.h>
10 
18 #ifdef KVIKIO_CUFILE_FOUND
19 #include <cufile.h>
20 #else
21 
22 // If cuFile isn't defined, we define some of the data types here.
23 // Notice, this doesn't need to be ABI compatible with the cufile definitions.
24 
25 using CUfileHandle_t = void*;
26 using CUfileOpError = int;
27 #define CUFILE_ERRSTR(x) ("KvikIO not compiled with cuFile.h")
28 #define CUFILEOP_BASE_ERR 5000
29 #define CU_FILE_SUCCESS 0
30 #define CU_FILE_CUDA_DRIVER_ERROR 1
31 
32 struct CUfileError_t {
33  CUfileOpError err; // cufile error
34  CUresult cu_err; // cuda driver error
35 };
36 
37 using CUfileDriverControlFlags_t = enum CUfileDriverControlFlags {
38  CU_FILE_USE_POLL_MODE = 0,
39  CU_FILE_ALLOW_COMPAT_MODE = 1
40 };
41 
42 enum CUfileFileHandleType { CU_FILE_HANDLE_TYPE_OPAQUE_FD = 1 };
43 
44 struct CUfileDescr_t {
45  enum CUfileFileHandleType type;
46  struct handle_t {
47  int fd;
48  } handle;
49 };
50 
51 inline static char const* cufileop_status_error(CUfileOpError err) { return CUFILE_ERRSTR(err); };
52 CUfileError_t cuFileHandleRegister(...);
53 CUfileError_t cuFileHandleDeregister(...);
54 ssize_t cuFileRead(...);
55 ssize_t cuFileWrite(...);
56 CUfileError_t cuFileBufRegister(...);
57 CUfileError_t cuFileBufDeregister(...);
58 CUfileError_t cuFileDriverOpen(...);
59 CUfileError_t cuFileDriverClose(...);
60 CUfileError_t cuFileDriverGetProperties(...);
61 CUfileError_t cuFileDriverSetPollMode(...);
62 CUfileError_t cuFileDriverSetMaxCacheSize(...);
63 CUfileError_t cuFileDriverSetMaxPinnedMemSize(...);
64 
65 #endif
66 
67 // If some cufile APIs aren't defined, we define some of the data types here.
68 // Notice, this doesn't need to be ABI compatible with the cufile definitions and
69 // the lack of definitions is not a problem because the linker will never look for
70 // these symbols because the "real" function calls are made through the shim instance.
71 #ifndef KVIKIO_CUFILE_BATCH_API_FOUND
72 typedef enum CUfileOpcode { CUFILE_READ = 0, CUFILE_WRITE } CUfileOpcode_t;
73 
74 typedef enum CUFILEStatus_enum {
75  CUFILE_WAITING = 0x000001, /* required value prior to submission */
76  CUFILE_PENDING = 0x000002, /* once enqueued */
77  CUFILE_INVALID = 0x000004, /* request was ill-formed or could not be enqueued */
78  CUFILE_CANCELED = 0x000008, /* request successfully canceled */
79  CUFILE_COMPLETE = 0x0000010, /* request successfully completed */
80  CUFILE_TIMEOUT = 0x0000020, /* request timed out */
81  CUFILE_FAILED = 0x0000040 /* unable to complete */
82 } CUfileStatus_t;
83 
84 typedef struct CUfileIOEvents {
85  void* cookie;
86  CUfileStatus_t status; /* status of the operation */
87  size_t ret; /* -ve error or amount of I/O done. */
89 
90 CUfileError_t cuFileBatchIOSetUp(...);
91 CUfileError_t cuFileBatchIOSubmit(...);
92 CUfileError_t cuFileBatchIOGetStatus(...);
93 CUfileError_t cuFileBatchIOCancel(...);
94 CUfileError_t cuFileBatchIODestroy(...);
95 #endif
96 
97 #ifndef KVIKIO_CUFILE_STREAM_API_FOUND
98 CUfileError_t cuFileReadAsync(...);
99 CUfileError_t cuFileWriteAsync(...);
100 CUfileError_t cuFileStreamRegister(...);
101 CUfileError_t cuFileStreamDeregister(...);
102 #endif
103 
104 #ifndef KVIKIO_CUFILE_VERSION_API_FOUND
105 CUfileError_t cuFileGetVersion(...);
106 #endif