文章目录
-
- [一、为什么需要 Safe HWA API?](#一、为什么需要 Safe HWA API?)
- [二、Safe HWA API 的"最小够用"设计](#二、Safe HWA API 的“最小够用”设计)
- [三、10 分钟上手:典型流程 5 步曲](#三、10 分钟上手:典型流程 5 步曲)
- 四、几个经典场景
-
- [案例 1:多设备"择优录取"------同一算法自动挑最快设备](#案例 1:多设备“择优录取”——同一算法自动挑最快设备)
- [案例 2:双缓冲流水线------一边拷贝一边计算](#案例 2:双缓冲流水线——一边拷贝一边计算)
- [案例 3:功能安全"双保险"------同步+异步错误同时抓](#案例 3:功能安全“双保险”——同步+异步错误同时抓)
- [五、与 SYCL 2020 的关系------"汽车化"差异一览](#五、与 SYCL 2020 的关系——“汽车化”差异一览)
- 六、落地建议
- 七、结语
一、为什么需要 Safe HWA API?
- 趋势:AD/ADAS 算法(点云前处理、Transformer、BEV 融合)对 GPU/FPGA 算力需求指数级增长。
- 痛点:
- 各芯片厂 SDK 接口差异大,切换平台 = 重写代码。
- 传统 SYCL 依赖 C++ 异常,不符合 ISO-26262 "无异常" 要求。
- 任务异步执行,出错时无法快速定位,难以满足功能安全 ASIL-B 以上。
- 目标:在 Adaptive Platform 里提供"一套 C++ 头文件 + 配置清单",实现:
- 同一份源码可在 Intel-GPU、NVIDIA-GPU、Xilinx-FPGA、CPU 仿真上运行;
- 所有错误通过
ara::core::Result或回调返回,绝不抛异常; - 运行时监控设备健康度,超时/过温/故障时主动降级;
- 与 PHM、EM、State Management 无缝集成,支持 ASIL-C/D 量产。
二、Safe HWA API 的"最小够用"设计
| 模块 | 关键类 | 一句话职责 |
|---|---|---|
| 设备管理 | Platform, Device, DeviceMonitor |
枚举、选择、监控加速器 |
| 数据容器 | Buffer, Accessor, Range, Id |
主机↔设备零拷贝共享 |
| 任务调度 | Queue, TaskHandler, Event |
异步提交、顺序/乱序执行、超时取消 |
| 错误处理 | AsyncErrorHandler, ara::core::Result |
同步+异步双通道错误传递 |
所有构造函数均为
private,统一通过静态Create()返回Result<unique_ptr<T>>,失败原因一目了然。
三、10 分钟上手:典型流程 5 步曲
cpp
#include "ara/shwa/..." // 1. 包含头文件
// 2. 声明异步错误回调
auto onAsyncErr = [](ara::shwa::AsyncErrorList& errs){
PHM_ReportError(errs); // 自定义函数上报
};
// 3. 创建有序队列(默认设备)
auto queue = ara::shwa::Queue::CreateOrdered(onAsyncErr).Value();
// 4. 分配 1D 缓冲区并拿到访问器
constexpr size_t N = 300'000;
auto range = ara::shwa::Range<1>::Create(N).Value();
auto buffer = ara::shwa::Buffer<float,1>::Create(range).Value();
// 5. 提交 lambda 到设备
queue->Submit([&](ara::shwa::TaskHandler& h){
auto acc = ara::shwa::Accessor<float,1,AccessMode::read_write>
::Create(buffer,h).Value();
h.ParallelFor(N, [=](ara::shwa::Id<1> id){
(*acc)[id] = 0.5f * (*acc)[id] + 1.0f; // 点云滤波示例
});
});
运行结果:
- 在 x86 开发机 → 自动回落到 CPU SYCL 后端;
- 在 Orin 靶板 → 相同可执行文件调用 CUDA 后端;
- 若 GPU 温度 >85 ℃ →
DeviceMonitor::HealthStatus()返回OverTemp,应用可选择延迟调度或降低帧率。
四、几个经典场景
例子是最好的解释,这里通过几个例子,形象的介绍一下safe HWA API的使用。
案例 1:多设备"择优录取"------同一算法自动挑最快设备
cpp
// 枚举所有 GPU,挑负载最低的一块
ara::shwa::Device bestGpu;
int minLoad = 100;
for(auto& dev : ara::shwa::Platform::GetDevices()){
if(dev.IsGpu().Value()){
auto load = ara::shwa::DeviceMonitor::Create(dev)
.Value().CurrentLoad().Value();
if(load < minLoad){ minLoad = load; bestGpu = dev; }
}
}
auto queue = ara::shwa::Queue::CreateOrdered(onAsyncErr, bestGpu).Value();
亮点:
- 无需硬编码 PCIe ID;
- 与热管理策略联动,防止"最热 GPU"继续超载。
案例 2:双缓冲流水线------一边拷贝一边计算
cpp
auto bufIn = Buffer<float,1>::Create(range).Value();
auto bufOut = Buffer<float,1>::Create(range).Value();
queue->Submit([&](TaskHandler& h){
auto in = Accessor<float,1,AccessMode::read>::Create(bufIn,h).Value();
auto out = Accessor<float,1,AccessMode::write>::Create(bufOut,h).Value();
h.ParallelFor(N, [=](Id<1> i){ out[i] = sqrt(in[i]); });
});
通过 Buffer+Accessor 把"数据搬迁"与"内核执行"自动重叠,主机线程零阻塞,吞吐量提升 30%+。
案例 3:功能安全"双保险"------同步+异步错误同时抓
cpp
// 同步:创建设备失败立即知道
auto devRes = ara::shwa::Device::Create(GpuSelector);
if(devRes.HasError()){ // 同步路径
PHM_ReportSyncError(devRes.Error());
return;
}
// 异步:内核跑飞、ECC 报错、看门狗触发
auto asyncHandler = [](AsyncErrorList& errs){
for(auto& e : errs){
if(e.code == ErrorCode::DeviceHung){
PHM_ReportAsyncError(e); // 触发 SM 降级
}
}
};
满足 ISO-26262 "双通道诊断" 要求:
- 同步错误 → 立即回退 CPU 路径;
- 异步错误 → PHM 触发状态管理,重启功能组。
五、与 SYCL 2020 的关系------"汽车化"差异一览
| 维度 | SYCL 2020 | Safe HWA API |
|---|---|---|
| 异常机制 | C++ exception | ara::core::Result + 回调 |
| 设备监控 | 无 | DeviceMonitor 实时负载/健康 |
| 超时取消 | 阻塞式 | Submit() 支持超时令牌 |
| 功能安全 | 通用计算 | 集成 PHM、EM、HealthChannel |
| 头文件 | <CL/sycl.hpp> |
<ara/shwa/*.h> |
实现层允许直接复用 DPC++、hipSYCL、ComputeCpp,仅在上层做"汽车封装",降低移植成本。
六、落地建议
- 平台移植:先让供应商提供
libSHWA.so+machine-manifest.json,确认支持GpuSelector / FpgaSelector。 - 安全集成:把 AP 应用注册为 PHM Supervised Entity,按帧率设置 Alive/Deadline 监督。
- 性能调优:利用
Event::GetProfilingInfo()打印 kernel 耗时,结合DeviceMonitor动态调整并行规模。 - 版本管理:R25-11 为"需求+API"首版,后续 R26 计划加入
MultiQueue优先级调度,建议代码预留策略接口。
七、结语
Safe HWA API 首次把"高性能异构计算"与"车规级功能安全"装进同一个头文件。对于 Tier1 和算法供应商来说,意味着:
"写一次、跑遍所有加速器、过 ISO-26262 不再靠封装器。"
下一步,就等你把点云 pipeline 从 CUDA 迁移到 ara::shwa,在 Orin、EyeQ6、Xilinx Versal 上跑出一套真正的"安全加速" demo。