推理池
一个 darra_pool* = 同一模型的 1..8 个 darra_session + 有界任务队列。每张图仍走 darra_session_infer_image。没有按张数批张量的 API。
功能概览
| 页面 | 函数 | 说明 |
|---|---|---|
| 打开 | darra_pool_open / darra_pool_open_plain | 打开加密容器或明文模型池 |
| API | darra_pool_submit / darra_pool_wait / darra_pool_try_wait / darra_pool_close / darra_sched_set_gpu_slots | 进图、取结果、关池、GPU 并发槽 |
句柄
typedef struct darra_pool darra_pool;
不透明句柄:定义只在 Core 内部,绑定侧永远只持有指针。worker 的 unique 强制为 1,不会跟调用方自己 darra_session_open 的驻留实例挤成一份。
darra_pool_close 之后句柄失效,再用 = 未定义行为。NULL 关闭是安全的。
流程
darra_sched_set_gpu_slots 可选;同卡多模型才需要
│
darra_pool_open / open_plain
│ 验票 / 解密 / 按 PayloadKind × 硬件选 Provider
│ 建 max_workers 个独立会话(硬顶 8)
▼
darra_pool*
│
├─ darra_pool_submit 进一张图,立刻返回 ticket;字节已拷走
│
└─ darra_pool_wait / try_wait 取该票 JSON
│
▼
darra_pool_close 拒新任务、等在飞 Infer 结束、关全部会话
100 张突发 = 把队列拉到 ≥ 张数(或 overflow=BLOCK),不是开 100 个会话。
进图与溢出
突发:一次 submit 多张。queue_capacity 必须 ≥ 突发量,或 overflow=BLOCK。
流式:每毫秒一张。GPU 若 5ms/张,队列会积压,必须选 overflow:
DARRA_OVERFLOW_FAIL— 队列满,submit立即DARRA_BUSYDARRA_OVERFLOW_BLOCK— 队列满,submit等到有空位DARRA_OVERFLOW_DROP_OLDEST— 丢掉最旧未开跑的任务(它的wait得DARRA_BUSY);摄像头保最新帧
并行与 GPU
max_workers:0 = 1;合法 1..8,硬顶 8。默认 1。GPU 上 yolov8n 建议 1–2;8GB+ 可试 2–4。- Core 不链 CUDA,不探测「显存还能塞几个」——由调用方设
max_workers。 - 每会话 CPU 线程走嵌套的
worker(intra_op_threads/inter_op_threads/cpu_affinity_mask/gpu_device/weight),同 打开会话。 - 禁止改 Windows
ReservedCpuSets,禁止动 PLC 隔离核。 - 多卡:每个池钉
worker.gpu_device;4 卡 = 4 个池,卡号 0..3。 - 多模型抢同一卡:
weight+darra_sched_set_gpu_slots。这是并发推理槽,不是 CUDA SM%。 - Paddle 是运行时载荷(
PayloadKind=paddle)。明文可接.pdmodel(同目录须有.pdiparams)或含二者的目录。.pt/.pth仍拒。 - Windows 无 RKNN。 rknn 载荷只在 linux-arm64 板端运行;Windows 收到即
DARRA_UNSUPPORTED_PAYLOAD。指名edge-rknn返回DARRA_UNSUPPORTED_PLATFORM。 - PLC:池必须在扫描周期外的线程里跑。不承诺硬实时。
线程约定
| 函数 | 线程安全 | 备注 |
|---|---|---|
| darra_pool_open / darra_pool_open_plain | 是 | 各开各的池可并发;缺包时内部 ensure 走同一把进程锁 |
| darra_pool_submit | 是 | 可多线程 submit |
| darra_pool_wait / darra_pool_try_wait | 是 | DROP_OLDEST 挤掉或尚未完成 → DARRA_BUSY |
| darra_pool_close | 仅在不与 submit / wait 并发时 | close 后句柄失效;NULL 安全 |
| darra_sched_set_gpu_slots | 是 | 进程内调度,与池句柄无关 |