I/O 数据汇#

group 数据汇
class data_sink#
#include <data_sink.hpp>

用于存储写入器输出数据的接口类。

公有函数

inline virtual ~data_sink()#

基类析构函数。

virtual void host_write(void const *data, size_t size) = 0#

将缓冲区内容追加到数据汇。

参数:
  • data[in] 指向要写入数据汇对象的缓冲区的指针

  • size[in] 要写入的字节数

inline virtual bool supports_device_write() const#

此数据汇是否支持从 GPU 内存地址写入。

在某些文件格式写入器内部,我们有执行以下操作的代码,例如

tmp_buffer = alloc_temp_buffer(); cudaMemcpy(tmp_buffer, device_buffer, size); sink->write(tmp_buffer, size);

如果数据汇类型本身是内存缓冲写入,这实际上相当于第二次 memcpy。因此,对于一个“智能”的自定义 data_sink 来说,一个有用的优化是自行在 CPU 和 GPU 之间管理数据移动;将写入器内部逻辑简化为只调用

sink->device_write(device_buffer, size)

如果此函数返回 true,则 data_sink 将在可能的情况下接收 device_write() 调用而不是 write() 调用。但是,仍然可能接收 write() 调用。

返回:

此写入器是否支持 device_write() 调用

inline virtual bool is_device_write_preferred(size_t size) const#

估计对于给定大小,直接设备写入是否更优。

参数:

size – 要写入的字节数

返回:

对于给定大小,设备写入是否预期性能更优

inline virtual void device_write(void const *gpu_data, size_t size, rmm::cuda_stream_view stream)#

将缓冲区内容从 GPU 地址追加到数据汇。

为了获得最佳性能,仅当 is_device_write_preferred 返回 true 时才应该调用此函数。不支持直接设备写入的数据汇实现无需重写此函数。

抛出:

cudf::logic_error – 对象不支持直接设备写入,即 supports_device_write 返回 false

参数:
  • gpu_data – 指向要写入数据汇对象的缓冲区的指针

  • size – 要写入的字节数

  • stream – 要使用的 CUDA 流

inline virtual std::future<void> device_write_async(void const *gpu_data, size_t size, rmm::cuda_stream_view stream)#

将缓冲区内容从 GPU 地址异步追加到数据汇。

为了获得最佳性能,仅当 is_device_write_preferred 返回 true 时才应该调用此函数。不支持直接设备写入的数据汇实现无需重写此函数。

在同步此调用之前,不得释放 gpu_data

auto result = device_write_async(gpu_data, size, stream);
result.wait(); // OR result.get()

抛出:
参数:
  • gpu_data – 指向要写入数据汇对象的缓冲区的指针

  • size – 要写入的字节数

  • stream – 要使用的 CUDA 流

返回:

可用于同步此调用的 future 对象

virtual void flush() = 0#

刷新写入数据汇的数据。

virtual size_t bytes_written() = 0#

返回写入此数据汇的总字节数。

返回:

写入此数据汇的总字节数

公有静态函数

static std::unique_ptr<data_sink> create(std::string const &filepath)#

从文件路径创建数据汇。

参数:

filepath[in] 要使用的文件路径

返回:

构造的 data_sink 对象

static std::unique_ptr<data_sink> create(std::vector<char> *buffer)#

从 std::vector 创建数据汇。

参数:

buffer[inout] 指向输出 vector 的指针

返回:

构造的 data_sink 对象

static std::unique_ptr<data_sink> create()#

创建一个 void 数据汇(一个不执行实际 I/O 的数据汇)

这是基准测试的有用代码路径,用于消除性能分析中的物理硬件随机性。

返回:

构造的 data_sink 对象

static std::unique_ptr<data_sink> create(cudf::io::data_sink *const user_sink)#

创建一个封装的自定义用户数据汇。

此处返回的数据汇不是用户传递的那个。它是一个内部类,用于封装用户指针。其原理是允许用户声明一个自定义数据汇实例并在多次 write() 调用中使用它。

参数:

user_sink[in] 用户提供的数据汇(通常是自定义类)

返回:

构造的 data_sink 对象

template<typename T>
static inline std::vector<std::unique_ptr<data_sink>> create(std::vector<T> const &args)#

创建数据汇 vector,输入 vector 中的每个元素对应一个数据汇。

参数:

args[in] 参数 vector

返回:

构造的数据汇 vector