公共成员函数 | 静态公共成员函数 | 所有成员列表
cudf::chunked_pack 类参考

使用用户提供的、大小为 user_buffer_size 的缓冲区,对输入的 table_view 执行分块的“打包”操作。 更多...

#include <contiguous_split.hpp>

公共成员函数

 chunked_pack (cudf::table_view const &input, std::size_t user_buffer_size, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref temp_mr=cudf::get_current_device_resource_ref())
 构造一个 chunked_pack 类。 更多...
 
 ~chunked_pack ()
 析构函数,将作为默认实现。在此处声明并定义,因为 contiguous_split_state 在此阶段不完整。
 
std::size_t get_total_contiguous_size () const
 获取连续打包的 table_view 的总大小。 更多...
 
bool has_next () const
 检查是否还有剩余分块需要复制的函数。 更多...
 
std::size_t next (cudf::device_span< uint8_t > const &user_buffer)
 将下一个分块打包到 user_buffer 中。只要 has_next 返回 true,就应该调用此函数。如果在 has_next 返回 false 时调用 next,则会抛出异常。 更多...
 
std::unique_ptr< std::vector< uint8_t > > build_metadata () const
 构建所有已添加列的不透明元数据。 更多...
 

静态公共成员函数

static std::unique_ptr< chunked_packcreate (cudf::table_view const &input, std::size_t user_buffer_size, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref temp_mr=cudf::get_current_device_resource_ref())
 创建一个 chunked_pack 实例,用于对 table_view "input" 执行“打包”操作,其中大小为 user_buffer_size 的缓冲区会填充整体操作的各个分块。此操作可在 GPU 内存受限的情况下使用。 更多...
 

详细描述

使用用户提供的、大小为 user_buffer_size 的缓冲区,对输入的 table_view 执行分块的“打包”操作。

此操作旨在在 GPU 内存不足时以流式方式使用,在此情况下,我们希望最大程度地减少小的 cudaMemcpy 调用次数以及与 cudf 表相关联的所有元数据的跟踪。由于内存限制,所有 thrust 和 scratch 内存分配都仅使用传入的内存资源,而不使用每设备内存资源。

此类定义了两个必须协同使用的函数来执行 chunked_pack:has_next 和 next。示例如下:

// 创建一个 table_view
cudf::table_view tv = ...;
// 选择一个内存资源(可选)。此内存资源用于 scratch/thrust 临时
// 数据。在内存受限的情况下,此资源可用于在程序开始时为 chunked_pack 预留 scratch 内存。
// for `chunked_pack` at the beginning of a program.
auto mr = cudf::get_current_device_resource_ref();
// 定义每个分块的缓冲区大小:缓冲区越大,此算法可以占用的 SM 越多。
// occupied by this algorithm.
//
// 在内部,GPU 的工作单位是 1MB 的批次。当我们实例化 cudf::chunked_pack 时,
// source table_view 的所有 1MB 批次都会预先计算。此外,
// chunked_pack 会根据给定的 user_buffer_size 缓冲区计算遍历所有这些批次(分块)所需的迭代次数。
// chunked_pack calculates the number of iterations that are required to go through all those
// batches given a `user_buffer_size` buffer. The number of 1MB batches in each iteration (chunk)
//
std::size_t user_buffer_size = 128*1024*1024;
auto chunked_packer = cudf::chunked_pack::create(tv, user_buffer_size, mr);
std::size_t host_offset = 0;
auto host_buffer = ...; // 获取您要复制到的 host 缓冲区
while (chunked_packer->has_next()) {
// 获取大小为 user_buffer_size 的用户缓冲区
cudf::device_span<uint8_t> user_buffer = ...;
std::size_t bytes_copied = chunked_packer->next(user_buffer);
// 缓冲区将最多容纳 user_buffer_size 字节的连续打包输入 table_view 的内容。
// of the contiguously packed input `table_view`. You are now free to copy
// 您现在可以自由地将此内存复制到其他地方,例如 host。
cudaMemcpyAsync(
host_buffer.data() + host_offset,
user_buffer.data(),
bytes_copied,
cudaMemcpyDefault,
stream);
host_offset += bytes_copied;
}

此类的文档生成自以下文件:

构造函数与析构函数文档

◆ chunked_pack()

cudf::chunked_pack::chunked_pack ( cudf::table_view const &  input,
std::size_t  user_buffer_size,
rmm::cuda_stream_view  stream = cudf::get_default_stream(),
rmm::device_async_resource_ref  temp_mr = cudf::get_current_device_resource_ref() 
)
explicit

构造一个 chunked_pack 类。

参数
input要打包的源 table_view
user_buffer_size缓冲区大小(以字节为单位),将在 next 时传递。必须至少为 1MB
stream用于设备内存操作和内核启动的 CUDA stream
temp_mr一个可选的内存资源,仅用于临时和 scratch 分配

成员函数文档

◆ build_metadata()

std::unique_ptr<std::vector<uint8_t> > cudf::chunked_pack::build_metadata ( ) const

为所有添加的列构建不透明元数据。

返回值
包含序列化列元数据的 vector

◆ create()

static std::unique_ptr<chunked_pack> cudf::chunked_pack::create ( cudf::table_view const &  input,
std::size_t  user_buffer_size,
rmm::cuda_stream_view  stream = cudf::get_default_stream(),
rmm::device_async_resource_ref  temp_mr = cudf::get_current_device_resource_ref() 
)
static

创建一个 chunked_pack 实例,用于对 table_view "input" 执行“打包”操作,其中大小为 user_buffer_size 的缓冲区会填充整体操作的各个 chunk。此操作可在 GPU 内存受限的情况下使用。

内存资源 (temp_mr) 可以是用于在 GPU 内存不足时,希望从一小块保留内存池中进行 scratch 和临时分配的特殊内存资源。注意,它默认为常规的 cuDF 每设备资源。

异常
cudf::logic_erroruser_buffer_size 小于 1MB 时
参数
input要打包的源 table_view
user_buffer_size缓冲区大小(以字节为单位),将在 next 时传递。必须至少为 1MB
stream用于设备内存操作和内核启动的 CUDA stream
temp_mr仅用于临时和 scratch 分配的 RMM 内存资源
返回值
一个 chunked_pack 的 unique_ptr

◆ get_total_contiguous_size()

std::size_t cudf::chunked_pack::get_total_contiguous_size ( ) const

获取连续打包的 table_view 的总大小。

返回值
所有 chunk 的总大小(以字节为单位)

◆ has_next()

bool cudf::chunked_pack::has_next ( ) const

检查是否还有 chunk 剩余可供复制的函数。

返回值
如果还有 chunk 剩余可供复制则为 true,否则为 false

◆ next()

std::size_t cudf::chunked_pack::next ( cudf::device_span< uint8_t > const &  user_buffer)

将下一个 chunk 打包到 user_buffer 中。只要 has_next 返回 true,就应调用此函数。如果在 has_next 返回 false 时调用 next,则会抛出异常。

异常
cudf::logic_error如果 user_buffer 的大小与 user_buffer_size 不同
cudf::logic_error如果在所有 chunk 都已复制后调用
参数
user_bufferchunk 的 device span 目标。此 span 的大小必须等于构造时传递的 user_buffer_size 参数。
返回值
写入到 user_buffer 的字节数(最多为 user_buffer_size

此类的文档生成自以下文件