Device API#
注意
免责声明:Device API 是实验性的,可能会在 nvCOMP 的后续版本中更改。
Operators#
-
namespace device#
Enums
-
enum nvcomp_algo#
要选择的压缩算法。
Values
-
enumerator ans#
-
enumerator zstd#
-
enumerator bitcomp#
-
enumerator lz4#
-
enumerator deflate#
-
enumerator gdeflate#
-
enumerator ans#
-
namespace detail#
-
enum nvcomp_algo#
User API#
-
namespace device
-
namespace detail
-
template<class ...Operators>
class nvcomp_device_execution# - #include <user_api.hpp>
为了使用设备端 API,需要构造 `nvcomp_device_execution` 类型的对象。为此,首先使用以下 operators 声明用户定义的类型
`Direction()` `Algo()` `Grouptype()` `Datatype()` `MaxUncompChunkSize()`
请参阅 `operators.hpp` 中这些 operators 的描述
自定义类型是使用可用 operators 之间的 `+` 创建的。然后,生成的类型用于初始化 `nvcomp_device_execution` 类型的对象,并且可以从该对象进行设备 API 调用。
使用 ANS 压缩的示例: ``` using namespace nvcomp::device;
constexpr size_t max_uncomp_chunk_size = 1<<15; constexpr size_t num_warps_per_block = 1;
using ans_base_type = decltype(Grouptype<nvcomp_grouptype::warp>() + Algo<nvcomp_algo::ans>() + Datatype<nvcomp_datatype::float16>());
using ans_compressor_type = decltype(ans_base_type() + Direction<nvcomp_direction::compress>() + MaxUncompChunkSize<max_uncomp_chunk_size>());
auto compressor = ans_compressor_type(); size_t shmem_size_warp = compressor.shmem_size_group(); size_t tmp_size_warp = compressor.tmp_size_group(); constexpr size_t scs = compressor.shmem_size_block(num_warps_per_block); constexpr size_t shmem_alignment = compressor.shmem_alignment(); __shared__ uint8_t __align__(shmem_alignment) shared_buffer[scs];
auto block = cg::this_thread_block(); auto warp = cg::tiled_partition<32>(block);
// one warp per CTA in this example auto wid = blockIdx.x; auto wid_in_block = threadIdx.x/32;
compressor.compress( uncomp_chunks[wid], comp_chunks[wid], uncomp_chunk_sizes[wid], comp_chunk_sizes + wid, shared_buffer + shmem_size_warp*wid_in_block, tmp_buf + tmp_size_warp*wid, warp); ```
Public Functions
- template<typename CG> inline void __device__ compress (const void *input_chunk, void *output_chunk, const size_t input_size, size_t *output_size, uint8_t *shared_mem_buf, uint8_t *tmp_buf, CG &group)
压缩连续的数据缓冲区。
- Parameters:
input_chunk – [in] 要压缩的块。应与 16 字节边界对齐。
output_chunk – [in] 生成的压缩块。应与 8 字节边界对齐。
input_size – [in] 要压缩的块的大小(以字节为单位)
output_size – [in] 生成的压缩块的大小(以字节为单位)
shared_mem_buf – [in] API 内部使用的共享内存缓冲区
tmp_buf – [in] API 内部使用的全局暂存缓冲区
group – [in] 压缩输入的协同组
- template<typename CG> inline void __device__ decompress (const void *input_chunk, void *output_chunk, uint8_t *shared_mem_buf, uint8_t *tmp_buf, CG &group)
解压缩连续的数据缓冲区。
- Parameters:
input_chunk – [in] 要解压缩的块。应与 8 字节边界对齐。
output_chunk – [in] 生成的解压缩块
shared_mem_buf – [in] API 内部使用的共享内存缓冲区
tmp_buf – [in] API 内部使用的全局暂存缓冲区
group – [in] 解压缩输入的协同组
- template<typename CG> inline void __device__ decompress (const void *input_chunk, void *output_chunk, const size_t comp_chunk_size, size_t *const decomp_chunk_size, uint8_t *shared_mem_buf, uint8_t *tmp_buf, CG &group)
解压缩连续的数据缓冲区。
- Parameters:
input_chunk – [in] 要解压缩的块。应与 8 字节边界对齐。
output_chunk – [in] 生成的解压缩块
comp_chunk_size – [in] 压缩块的大小
decomp_chunk_size – [in] 生成的解压缩块的大小
shared_mem_buf – [in] API 内部使用的共享内存缓冲区
tmp_buf – [in] API 内部使用的全局暂存缓冲区
group – [in] 解压缩输入的协同组
Public Static Functions
- static inline __device__ __host__ constexpr size_t shmem_size_block (size_t num_warps_per_block)
返回给定 CTA 所需的共享内存量。
- Parameters:
num_warps_per_block – [in] 每个块的 warp 数量
- Returns:
共享内存量(以字节为单位)
- static inline __device__ __host__ constexpr size_t shmem_size_group ()
返回每个协同组所需的共享内存量。与 `shmem_size_block` 不同,因为可能存在多个 API 调用,每个调用都有不同的协同组,它们都属于同一个 CTA。
- Returns:
共享内存量(以字节为单位)
- static inline __device__ __host__ constexpr size_t shmem_alignment ()
返回 CG 的共享内存分配所需的对齐方式。
- Returns:
共享内存对齐大小
-
static inline constexpr size_t max_comp_chunk_size()#
返回最大压缩块大小。
- Returns:
最大压缩块大小(以字节为单位)
-
static inline constexpr size_t tmp_size_total(size_t num_warps)#
返回整个内核所需的暂存空间大小。
- Parameters:
num_warps – [in] 所有内核块中的 warp 总数。
- Returns:
内存暂存空间大小(以字节为单位)
- static inline __device__ __host__ constexpr size_t tmp_size_group ()
返回每个协同组所需的全局内存暂存空间。与 `tmp_size_total` 不同,因为每个内核可能存在多个 API 调用,每个调用都需要全局暂存内存总量的一部分。
- Returns:
全局内存暂存空间大小(以字节为单位)
-
template<class ...Operators>
-
namespace detail