公开 dbhoo-lpu开源版 v1.0.1 更新于 2026-07-21

配置参考

版本: dbhoo-lpu v1.0.1 (Open Source)
最后更新: 2026-07-20


目录


1. 概述

dbhoo-lpu提供了多层次的配置选项,从编译期选项到运行时配置,以适应不同的部署场景和性能需求。

配置分为以下几类:

  • 编译选项: 通过 CMake 或编译宏设置,编译时生效
  • 运行时配置: 通过 API 函数在运行时设置
  • 限制常量: 定义算法层的上界和默认值
  • 状态码: 统一的错误码定义

2. 编译选项

2.1 CMake 选项

选项默认值类型说明
CMAKE_BUILD_TYPEReleaseSTRING构建类型: Debug, Release, RelWithDebInfo, MinSizeRel
CMAKE_INSTALL_PREFIX/usr/localPATH安装路径
LPU_BUILD_TESTSONBOOL是否构建测试套件
LPU_BUILD_SHAREDONBOOL是否构建共享库 (.so/.dll/.dylib)
LPU_BUILD_STATICONBOOL是否构建静态库 (.a/.lib)
LPU_WITH_CUDAOFFBOOL是否启用 CUDA 支持(商业版)
LPU_WITH_PLUGINONBOOL是否启用插件系统
LPU_ENABLE_SAFETYONBOOL是否启用安全检查

2.2 使用示例

# 最小化构建(仅静态库,无测试)
cmake .. \
    -DCMAKE_BUILD_TYPE=Release \
    -DLPU_BUILD_TESTS=OFF \
    -DLPU_BUILD_SHARED=OFF \
    -DLPU_BUILD_STATIC=ON

# Debug 构建(含调试信息)
cmake .. \
    -DCMAKE_BUILD_TYPE=Debug \
    -DLPU_BUILD_TESTS=ON

# 自定义安装路径
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/lpu

2.3 编译宏定义

说明位置
DBHOO_LPU_EDITION版本类型 (0=开源, 1=商业)lpu_version_info.h
LPU_WITH_CUDA编译时启用 CUDA编译选项
LPU_LIMIT_MHA_MAX_SEQMHA 最大序列长度上限lpu_limits.h
LPU_LIMIT_LOGITS_CAPLogits 处理上限lpu_limits.h
LPU_LIMIT_MOE_FFN_DHMoE FFN hidden 上限lpu_limits.h

3. 运行时配置

3.1 设备管理配置

设备管理相关函数定义在 lpu_device.h 中。

设备偏好

typedef enum lpu_device_preference_e {
  LPU_DEV_PREF_CPU = 0U,       // 强制使用 CPU
  LPU_DEV_PREF_GPU_CUDA = 1U,  // 优先使用 CUDA GPU(不可用则回退)
  LPU_DEV_PREF_AUTO = 2U       // 自动选择(根据规模和功耗策略)
} lpu_device_preference_t;

设置和获取:

void lpu_device_set_preference(lpu_device_preference_t pref);
lpu_device_preference_t lpu_device_get_preference(void);

功耗策略

typedef enum lpu_device_power_e {
  LPU_DEV_POWER_BALANCED = 0U,    // 平衡模式
  LPU_DEV_POWER_LOW = 1U,         // 低功耗模式(禁用 GPU)
  LPU_DEV_POWER_PERFORMANCE = 2U  // 高性能模式(倾向 GPU)
} lpu_device_power_t;

设置和获取:

void lpu_device_set_power(lpu_device_power_t power);
lpu_device_power_t lpu_device_get_power(void);

部署形态

typedef enum lpu_deployment_e {
  LPU_DEPLOYMENT_EDGE = 0U,   // 端侧部署(保守使用 GPU)
  LPU_DEPLOYMENT_CLOUD = 1U   // 云侧部署(激进使用 GPU)
} lpu_deployment_t;

设置和获取:

void lpu_device_set_deployment(lpu_deployment_t dep);
lpu_deployment_t lpu_device_get_deployment(void);

CUDA 设备选择

void lpu_device_set_cuda_device(int device_index);
int lpu_device_get_cuda_device(void);

运行时配置应用

一次性应用所有配置:

void lpu_device_apply_runtime_config(
    uint32_t deployment,        // 0=EDGE, 1=CLOUD
    uint32_t device_preference, // 0=CPU, 1=GPU_CUDA, 2=AUTO
    uint32_t power_mode         // 0=BALANCED, 1=LOW, 2=PERFORMANCE
);

设备查询

// 初始化设备探测(幂等,可多次调用)
void lpu_device_init(void);

// CUDA 是否可用
int lpu_device_cuda_available(void);

// ARM 架构是否可用
int lpu_device_arm_available(void);

// RISC-V 架构是否可用
int lpu_device_riscv_available(void);

// AMD GPU 是否可用
int lpu_device_amd_gpu_available(void);

// Intel GPU 是否可用
int lpu_device_intel_gpu_available(void);

GEMM 设备决策

// 判断指定大小的 GEMM 是否应该使用 GPU
int lpu_device_want_gpu_for_gemm_size(size_t m, size_t k, size_t n);

// 获取 GEMM 的有效设备
lpu_device_effective_t lpu_device_effective_gemm(size_t m, size_t k, size_t n);

3.2 GEMM 配置

GEMM 分块参数通过函数参数配置:

lpu_status lpu_gemm_f32(
    const float *a,
    const float *b,
    float *c,
    size_t m,
    size_t k,
    size_t n,
    size_t bm,    // M 分块大小 (0 = 使用默认值)
    size_t bk,    // K 分块大小 (0 = 使用默认值)
    size_t bn     // N 分块大小 (0 = 使用默认值)
);

分块参数选择指南:

  • 设为 0 时使用内置默认值,适合大多数情况
  • 对于特定硬件,可以调整分块大小优化缓存命中率
  • 典型值: bm=64~256, bk=64~256, bn=64~256
  • 分块过大可能导致缓存不足,过小可能增加开销

3.3 注意力配置

typedef struct lpu_mha_config {
  uint32_t num_heads;           // 查询头数
  uint32_t head_dim;            // 头维度
  uint32_t num_kv_heads;        // KV 头数 (GQA)
  uint32_t max_seq;             // 最大序列长度
  lpu_dtype_t qkv_dtype;        // QKV 数据类型
  lpu_dtype_t acc_dtype;        // 累加数据类型
  uint32_t flags;               // 标志位
  float causal_mask_value;      // 因果掩码值
  uint32_t sliding_window;      // 滑动窗口大小
} lpu_mha_config_t;

标志位定义

#define LPU_MHA_FLAG_CAUSAL 1U   // 启用因果掩码

支持检查

lpu_status lpu_mha_check_supported(
    const lpu_mha_config_t *cfg,
    char *reason_out,           // 不支持的原因输出
    size_t reason_cap           // 缓冲区大小
);

3.4 KV Cache 配置

typedef struct lpu_kvcache_desc {
  uint32_t num_layers;          // 层数
  uint32_t num_heads;           // 头数(含义取决于 num_kv_heads)
  uint32_t num_kv_heads;        // KV 头数 (0 = 不启用 GQA 解释)
  uint32_t head_dim;            // 头维度
  uint32_t max_seq;             // 最大序列长度
  lpu_dtype_t dtype;            // 数据类型
} lpu_kvcache_desc_t;

内存需求计算

lpu_status lpu_kvcache_bytes(
    const lpu_kvcache_desc_t *d,
    size_t *out_bytes           // 输出所需字节数
);

计算公式(F32):

总字节数 = num_layers * 2 * max_seq * num_kv_heads * head_dim * 4

3.5 采样配置

采样配置通过函数参数传递:

lpu_status lpu_sample_topk_topp_f32(
    const float *logits,
    size_t vocab_size,
    uint32_t top_k,             // Top-K 值 (0 = 禁用)
    float top_p,                // Top-P 值 (0 = 禁用)
    float temperature,          // 温度系数 (> 0)
    uint32_t seed,              // 随机种子
    uint32_t *out_token,
    float *out_prob
);

典型配置:

场景temperaturetop_ktop_p说明
确定性输出0.0 / 接近 0Greedy 采样
创意写作0.7 ~ 1.0500.9平衡质量和多样性
高多样性1.0 ~ 1.51000.95更随机的输出
代码生成0.2 ~ 0.7100.95更精确的输出

4. 设备配置

4.1 设备配置组合

以下是一些典型的设备配置组合:

配置 1: 纯 CPU(低功耗/端侧)

lpu_device_set_deployment(LPU_DEPLOYMENT_EDGE);
lpu_device_set_preference(LPU_DEV_PREF_CPU);
lpu_device_set_power(LPU_DEV_POWER_LOW);

适用场景:

  • 嵌入式设备
  • 电池供电设备
  • 对功耗敏感的场景

配置 2: 自动选择(平衡)

lpu_device_set_deployment(LPU_DEPLOYMENT_EDGE);
lpu_device_set_preference(LPU_DEV_PREF_AUTO);
lpu_device_set_power(LPU_DEV_POWER_BALANCED);

适用场景:

  • 通用桌面端
  • 兼顾性能和功耗

配置 3: 高性能(云侧)

lpu_device_set_deployment(LPU_DEPLOYMENT_CLOUD);
lpu_device_set_preference(LPU_DEV_PREF_AUTO);
lpu_device_set_power(LPU_DEV_POWER_PERFORMANCE);

适用场景:

  • 服务器部署
  • 高吞吐推理服务

配置 4: 强制 GPU

lpu_device_set_preference(LPU_DEV_PREF_GPU_CUDA);
lpu_device_set_power(LPU_DEV_POWER_PERFORMANCE);

适用场景:

  • 已知有 GPU 且确定需要 GPU 加速
  • 性能基准测试

注意: 开源版仅支持 CPU,GPU 支持需要 LPU 商业版。以上配置 API 在开源版中可用,但实际执行始终回退到 CPU。


5. 数据类型配置

5.1 数据类型枚举

typedef enum lpu_dtype {
  LPU_DTYPE_F32 = 0,    // 单精度浮点 (32-bit)
  LPU_DTYPE_F16 = 1,    // 半精度浮点 (16-bit)
  LPU_DTYPE_I8  = 2,    // 8 位有符号整数
  LPU_DTYPE_I4  = 3,    // 4 位整数
  LPU_DTYPE_FP8 = 4,    // 8 位浮点
} lpu_dtype_t;

5.2 数据类型大小查询

lpu_status lpu_dtype_size_bytes(lpu_dtype_t dt, uint32_t *out_bytes);

各类型大小:

类型字节数位宽开源版支持
LPU_DTYPE_F32432
LPU_DTYPE_F16216
LPU_DTYPE_I818
LPU_DTYPE_I40.54
LPU_DTYPE_FP818

注意: I4 类型按 2 个元素打包为 1 字节计步长,lpu_dtype_size_bytes 返回的是对齐粒度参考值。


6. 限制常量

限制常量定义在 lpu_limits.h 中:

// MHA / SDPA 最大序列长度上限
#define LPU_LIMIT_MHA_MAX_SEQ 512U

// 采样 / Logits 处理上限(top-k/top-p 内部排序数组大小等)
#define LPU_LIMIT_LOGITS_CAP 256U

// MoE FFN hidden 维度上限(参考实现)
#define LPU_LIMIT_MOE_FFN_DH 512U

6.1 注意力最大序列长度

#define LPU_MHA_SDPA_F32_MAX_SEQ 8192U   // F32 SDPA 最大序列长度

注意: LPU_LIMIT_MHA_MAX_SEQ 是算法层统一上界,LPU_MHA_SDPA_F32_MAX_SEQ 是 F32 SDPA 的具体上限。实际可支持的序列长度还受限于内存和计算资源。

6.2 调整限制

如需调整限制,修改 lpu_limits.h 中的宏定义后重新编译即可。调整时需注意:

  • 增大限制可能增加内存使用
  • 过小的限制可能导致功能受限
  • 建议根据实际部署场景调整

7. 状态码

所有 dbhoo-lpu函数返回统一的状态码,定义在 lpu_status.h 中:

typedef int lpu_status;

#define LPU_OK              0     // 成功
#define LPU_ERR_NULL        (-1)  // NULL 指针错误
#define LPU_ERR_INVALID_ARG (-2)  // 无效参数
#define LPU_ERR_ALIGN       (-3)  // 对齐错误
#define LPU_ERR_UNSUPPORTED (-4)  // 不支持的操作
#define LPU_ERR_RANGE       (-5)  // 范围错误(溢出、越界等)
#define LPU_ERR_NO_MEM      (-6)  // 内存不足
#define LPU_ERR_DEVICE      (-7)  // 设备错误(GPU 不可用等)

7.1 状态码表

状态码含义常见原因
LPU_OK0成功操作正常完成
LPU_ERR_NULL-1NULL 指针输入指针为 NULL
LPU_ERR_INVALID_ARG-2无效参数参数值非法(如负数维度)
LPU_ERR_ALIGN-3对齐错误内存地址未按要求对齐
LPU_ERR_UNSUPPORTED-4不支持请求的功能/配置不支持
LPU_ERR_RANGE-5范围错误溢出、越界、数值非有限等
LPU_ERR_NO_MEM-6内存不足内存分配失败
LPU_ERR_DEVICE-7设备错误GPU 不可用或策略禁止

7.2 错误检查模式

推荐的错误检查模式:

lpu_status status = lpu_some_function(...);
if (status != LPU_OK) {
    // 处理错误
    fprintf(stderr, "Error: %d\n", status);
    return status;
}

8. 插件配置

注意: 插件系统 API 在开源版中定义,但主要扩展功能需商业版插件。本章节介绍配置接口。

8.1 插件类型

typedef enum lpu_plugin_type_e {
    LPU_PLUGIN_TYPE_UNKNOWN = 0,
    LPU_PLUGIN_TYPE_GEMM = 1,
    LPU_PLUGIN_TYPE_ATTENTION = 2,
    LPU_PLUGIN_TYPE_QUANT = 3,
    LPU_PLUGIN_TYPE_KVCACHE = 4,
    LPU_PLUGIN_TYPE_SAMPLING = 5,
    LPU_PLUGIN_TYPE_AUTOTUNE = 6,
    LPU_PLUGIN_TYPE_GRAPH_OPT = 7,
    LPU_PLUGIN_TYPE_OFFLOAD = 8,
    LPU_PLUGIN_TYPE_COMPRESSION = 9,
    LPU_PLUGIN_TYPE_OBSERVABILITY = 10,
    LPU_PLUGIN_TYPE_CUDA = 11,
    LPU_PLUGIN_TYPE_COLLECTIVE = 12,
    LPU_PLUGIN_TYPE_MOE = 13,
    LPU_PLUGIN_TYPE_VISION = 14,
    LPU_PLUGIN_TYPE_SECURITY = 15,
    LPU_PLUGIN_TYPE_CUSTOM = 255
} lpu_plugin_type_t;

8.2 插件许可证类型

typedef enum lpu_plugin_license_type_e {
    LPU_PLUGIN_LICENSE_OPEN_SOURCE = 0,
    LPU_PLUGIN_LICENSE_COMMERCIAL = 1
} lpu_plugin_license_type_t;

8.3 插件管理器 API

// 初始化插件管理器
lpu_status lpu_plugin_manager_init(void);

// 关闭插件管理器
lpu_status lpu_plugin_manager_shutdown(void);

// 加载插件
lpu_status lpu_plugin_load(const char* path, lpu_plugin_handle_t* out_handle);

// 卸载插件
lpu_status lpu_plugin_unload(lpu_plugin_handle_t handle);

// 获取插件信息
lpu_status lpu_plugin_get_info(lpu_plugin_handle_t handle, lpu_plugin_info_t* info);

// 列出所有已加载插件
lpu_status lpu_plugin_list(lpu_plugin_handle_t* handles, size_t* count);

// 按类型查找插件
lpu_status lpu_plugin_find_by_type(
    lpu_plugin_type_t type,
    lpu_plugin_handle_t* handles,
    size_t* count);

// 按许可证查找插件
lpu_status lpu_plugin_find_by_license(
    lpu_plugin_license_type_t license_type,
    lpu_plugin_handle_t* handles,
    size_t* count);

// 检查某类型插件是否已加载
lpu_status lpu_plugin_is_loaded(lpu_plugin_type_t type, bool* is_loaded);