IO 数据接收器#

group io_datasinks
class data_sink#
#include <data_sink.hpp>

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

公共函数

inline virtual ~data_sink()#

基类析构函数。

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

将缓冲区内容附加到接收器。

Parameters:
  • 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);

在接收器类型本身是内存缓冲写入的情况下,这实际上变成了第二次内存复制。因此,对于“智能”自定义data_sink,一个有用的优化是自行管理CPU和GPU之间的数据传输;将写入器的内部简化为

sink->device_write(device_buffer, size)

如果此函数返回true,data_sink 将尽可能接收对 device_write() 的调用,而不是 write()。然而,仍然有可能接收到 write() 的调用。

Returns:

如果此写入器支持 device_write() 调用

inline virtual bool is_device_write_preferred(size_t size) const#

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

Parameters:

size – 要写入的字节数

Returns:

设备写入是否预期对给定大小更高效

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

将缓冲区内容从GPU地址附加到接收器。

为了获得最佳性能,只有在is_device_write_preferred返回true时才应调用此函数。不支持直接设备写入的数据接收实现不需要重写此函数。

Throws:

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

Parameters:
  • 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()

Throws:
Parameters:
  • gpu_data – 指向要写入接收器对象的缓冲区的指针

  • size – 要写入的字节数

  • stream – 使用的CUDA流

Returns:

一个可用于同步调用的未来

virtual void flush() = 0#

刷新写入接收器的数据。

virtual size_t bytes_written() = 0#

返回写入此接收器的总字节数。

Returns:

写入此接收器的总字节数

公共静态函数

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

从文件路径创建一个接收器。

Parameters:

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

Returns:

构建的 data_sink 对象

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

从 std::vector 创建一个 sink。

Parameters:

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

Returns:

构建的 data_sink 对象

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

创建一个空接收器(一个不进行实际输入输出的接收器)

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

Returns:

构建的 data_sink 对象

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

创建一个包装的自定义用户数据接收器。

这里返回的数据接收器不是用户传递的那个。它是一个内部类,包装了用户指针。其原理是允许用户声明一个自定义的接收器实例,并在多个write()调用中使用它。

Parameters:

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

Returns:

构建的 data_sink 对象

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

创建一个数据接收器的向量,每个输入向量中的元素对应一个。

Parameters:

args[in] 参数向量

Returns:

构建的数据接收器向量