batch.hpp
1 /*
2  * 版权所有 (c) 2023-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  * limitations under the License.
14  */
15 
16 #pragma once
17 
18 #include <cstddef>
19 #include <ctime>
20 #include <utility>
21 #include <vector>
22 
23 #include <kvikio/error.hpp>
24 #include <kvikio/file_handle.hpp>
25 #include <kvikio/shim/cufile.hpp>
26 
27 namespace kvikio {
28 
32 struct BatchOp {
33  // 要读取或写入的文件的文件句柄
34  FileHandle& file_handle;
35  // 设备内存中缓冲区的基地址(不支持主机内存)。
36  void* devPtr_base;
37  // 文件中要读取或写入的偏移量。
38  off_t file_offset;
39  // 相对于 \p devPtr_base 指针的偏移量,用于写入或读取。
40  off_t devPtr_offset;
41  // 要读取或写入的大小(字节)。
42  size_t size;
43  // 操作类型:CUFILE_READ 或 CUFILE_WRITE。
44  CUfileOpcode_t opcode;
45 };
46 
47 #ifdef KVIKIO_CUFILE_BATCH_API_FOUND
48 
62 class BatchHandle {
63  private
64  bool _initialized{false};
65  int _max_num_events{};
66  CUfileBatchHandle_t _handle{};
67 
68  public
69  /// 构造函数
70  BatchHandle() noexcept = default;
76  /// 构造函数
77  /// \param max_num_events 此批处理句柄可以管理的事件最大数量。
81  BatchHandle(int max_num_events);
82  /// 禁用拷贝构造函数
83  BatchHandle(BatchHandle const&) = delete;
84  /// 禁用拷贝赋值
85  BatchHandle& operator=(BatchHandle const&) = delete;
86  /// 移动构造函数
87  BatchHandle(BatchHandle&& o) noexcept;
88  /// 析构函数
89  ~BatchHandle() noexcept;
90 
91  /// 检查批处理句柄是否已关闭。
92  [[nodiscard]] bool closed() const noexcept;
93 
94  /// 关闭批处理句柄。
95  void close() noexcept;
96 
99  /// 提交一批操作。
100  /// \param operations 要提交的操作向量。
111  /// 获取已提交操作的状态。
112  /// \param min_nr 等待的最小事件数。
113  /// \param max_nr 要返回的最大事件数。
114  /// \param timeout 等待超时时间。如果为 null,则无限期等待。
115  /// \return 完成事件的向量。
116  std::vector<CUfileIOEvents_t> status(unsigned min_nr,
117  unsigned max_nr,
118  struct timespec* timeout = nullptr);
119 
120  /// 取消所有已提交的操作。
121  void cancel();
122 };
123 
124 #else
125 
126 class BatchHandle {
127  public
128  BatchHandle() noexcept = default;
129 
130  BatchHandle(int max_num_events);
131 
132  [[nodiscard]] bool closed() const noexcept;
133 
134  void close() noexcept;
135 
136  void submit(std::vector<BatchOp> const& operations);
137 
138  std::vector<CUfileIOEvents_t> status(unsigned min_nr,
139  unsigned max_nr,
140  struct timespec* timeout = nullptr);
141 
142  void cancel();
143 };
144 
145 #endif
146