当前位置: 首页 > news >正文

cann/sip asdConvolve卷积滤波算子

asdConvolve

【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip

产品支持情况

产品是否支持
Atlas 200I/500 A2 推理产品×
Atlas 推理系列产品×
Atlas 训练系列产品×
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Ascend 950PR/Ascend 950DT×

功能说明

  • 接口功能:对给定的信号进行一维滤波操作。

  • 计算公式: $$ w(k)=\sum _{j}u(j)v(k-j+1) $$ 其中,w(k)为输出的k位置的元素,u(j)为输入位置为j的一维信号,v(k-j+1)为位置为k-j+1的滤波卷积核。一维信号为复数向量,滤波卷积核为实数向量。

    示例: 输入“u”为: [[1.+1.j 2.+2.j] [1.+1.j 2.+2.j]] 输入“v”为: [1. 2. 3. 4.] 调用“asdConvolve”算子后,输出“result”为: [[4.+4.j, 7.+7.j], [4.+4.j, 7.+7.j]]

函数原型

AspbStatus asdConvolve( const aclTensor * signal, const aclTensor * kernel, aclTensor * output, asdConvolveMode_t mode, void *stream, void * workspace)

asdConvolve

  • 参数说明:

    参数名输入/输出描述
    signal(aclTensor *)输入
    • 输入的一维信号。
    • 支持的数据类型为COMPLEX32、COMPLEX64。
    • 输入信号shape为[BatchCount, n]。
    kernel(aclTensor *)输入
    • 输入的滤波卷积核。
    • 支持的数据类型为FLOAT16、FLOAT32。
    • 输入滤波卷积核shape为[k]。
    output(aclTensor *)输入/输出
    • 输入/输出信号。
    • 支持的数据类型为COMPLEX32、COMPLEX64。
    • 输出shape与输入shape保持一致。
    mode(asdConvolveMode_t)输入滤波卷积模式,当前仅支持ASD_CONVOLVE_SAME,即输入和输出的向量维度保持一致。
    stream(void*)输入算子执行时的stream。
    workspace(void*)输入算子所需的Workspace指针。
  • 返回值

    返回状态码,具体参见SiP返回码。

约束说明

调用示例

示例代码如下,该样例旨在提供快速上手、开发和调试算子的最小化实现,其核心目标是使用最精简的代码展示算子的核心功能,而非提供生产级的安全保障。不推荐用户直接将示例代码作为业务代码,若用户将示例代码应用在自身的真实业务场景中且发生了安全问题,则需用户自行承担。

#include <iostream> #include "asdsip.h" #include "filter_api.h" #include "acl/acl.h" #include "acl/acl_base.h" #include "acl_meta.h" #include <complex> #include <vector> using namespace AsdSip; using half = op::fp16_t; #define ASD_STATUS_CHECK(err) \ do { \ AsdSip::AspbStatus err_ = (err); \ if (err_ != AsdSip::ACL_SUCCESS) { \ std::cout << "Execute failed." << std::endl; \ exit(-1); \ } \ } while (0) #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) #define LOG_PRINT(message, ...) \ do { \ printf(message, ##__VA_ARGS__); \ } while (0) int64_t GetShapeSize(const std::vector<int64_t> &shape) { int64_t shapeSize = 1; for (auto i : shape) { shapeSize *= i; } return shapeSize; } int Init(int32_t deviceId, aclrtStream *stream) { // 固定写法,acl初始化 auto ret = aclInit(nullptr); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("aclInit failed. ERROR: %d\n", ret); return ret); ret = aclrtSetDevice(deviceId); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("aclrtSetDevice failed. ERROR: %d\n", ret); return ret); ret = aclrtCreateStream(stream); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("aclrtCreateStream failed. ERROR: %d\n", ret); return ret); return 0; } template <typename T> int CreateAclTensor(const std::vector<T> &hostData, const std::vector<int64_t> &shape, void **deviceAddr, aclDataType dataType, aclTensor **tensor) { auto size = GetShapeSize(shape) * sizeof(T); // 调用aclrtMalloc申请device侧内存 auto ret = aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("aclrtMalloc failed. ERROR: %d\n", ret); return ret); // 调用aclrtMemcpy将host侧数据复制到device侧内存上 ret = aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("aclrtMemcpy failed. ERROR: %d\n", ret); return ret); // 计算连续tensor的strides std::vector<int64_t> strides(shape.size(), 1); for (int64_t i = shape.size() - 2; i >= 0; i--) { strides[i] = shape[i + 1] * strides[i + 1]; } // 调用aclCreateTensor接口创建aclTensor *tensor = aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return 0; } template <typename T> void printTensor(std::vector<T> tensorData, int64_t tensorSize) { for (int64_t i = 0; i < tensorSize; i++) { std::cout << tensorData[i] << " "; } std::cout << std::endl; } int main(int argc, char **argv) { int deviceId = 0; aclrtStream stream; auto ret = Init(deviceId, &stream); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret); int64_t signalLen = 128; // 26208 int64_t kernelLen = 32; int64_t batchCount = 2; // 768 std::vector<std::complex<half>> tensorSignalData; tensorSignalData.reserve(signalLen * batchCount); std::vector<half> tensorKernelData; tensorKernelData.reserve(kernelLen); for (int64_t i = 0; i < signalLen * batchCount; i++) { tensorSignalData[i] = {(half)1.0, (half)1.0}; } for (int64_t i = 0; i < kernelLen; i++) { tensorKernelData[i] = (half)(1.0 + i); // tensorKernelData[i] = 1.0; } std::vector<std::complex<half>> tensorOutData; tensorOutData.reserve(signalLen * batchCount); for (int64_t i = 0; i < signalLen * batchCount; i++) { tensorOutData[i] = {(half)-1.0, (half)-1.0}; } std::vector<int64_t> signalShape = {batchCount, signalLen}; std::vector<int64_t> kernelShape = {kernelLen}; std::vector<int64_t> resultShape = {batchCount, signalLen}; aclTensor *signal = nullptr; aclTensor *kernel = nullptr; aclTensor *output = nullptr; void *signalDeviceAddr = nullptr; void *kernelDeviceAddr = nullptr; void *outputDeviceAddr = nullptr; ret = CreateAclTensor<std::complex<half>>( tensorSignalData, signalShape, &signalDeviceAddr, aclDataType::ACL_COMPLEX32, &signal); CHECK_RET(ret == ::ACL_SUCCESS, return ret); ret = CreateAclTensor<half>( tensorKernelData, kernelShape, &kernelDeviceAddr, aclDataType::ACL_FLOAT16, &kernel); CHECK_RET(ret == ::ACL_SUCCESS, return ret); ret = CreateAclTensor<std::complex<half>>( tensorOutData, resultShape, &outputDeviceAddr, aclDataType::ACL_COMPLEX32, &output); CHECK_RET(ret == ::ACL_SUCCESS, return ret); size_t lwork = 0; AsdSip::asdConvolveGetWorkspaceSize(signalLen, kernelLen, lwork); void *buffer = nullptr; std::cout << "lwork = " << lwork << std::endl; if (lwork > 0) { ret = aclrtMalloc(&buffer, static_cast<int64_t>(lwork), ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("allocate workspace failed. ERROR: %d\n", ret); return ret); } ASD_STATUS_CHECK(AsdSip::asdConvolve(signal, kernel, output, asdConvolveMode_t::ASD_CONVOLVE_SAME, stream, buffer)); ret = aclrtSynchronizeStream(stream); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret); ret = aclrtMemcpy(tensorOutData.data(), signalLen * batchCount * sizeof(std::complex<half>), outputDeviceAddr, signalLen * batchCount * sizeof(std::complex<half>), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret == ::ACL_SUCCESS, LOG_PRINT("copy result from device to host failed. ERROR: %d\n", ret); return ret); std::cout << "------- result -------" << std::endl; for (int batchIdx = 0; batchIdx < batchCount; batchIdx++) { for (int i = 0; i < signalLen; i++) { std::cout << "(" << (float)tensorOutData[batchIdx * signalLen + i].real() << "," << (float)tensorOutData[batchIdx * signalLen + i].imag() << ")" << " "; } std::cout << std::endl; } aclDestroyTensor(signal); aclDestroyTensor(kernel); aclDestroyTensor(output); aclrtFree(signalDeviceAddr); aclrtFree(kernelDeviceAddr); aclrtFree(outputDeviceAddr); aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }

【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/785434/

相关文章:

  • 2026 年鼓楼区 GEO 优化公司深度测评:南京赢之乐凭本土深耕与合规技术领跑 - 小艾信息发布
  • AI智能体技能开发实战:从黄历查询看垂直领域知识封装
  • 多模态机器学习:从融合范式到MULTIBENCH基准实践
  • 3篇3章8节:Obsidian 的全方位写作工作流
  • 解锁私人游戏云:用Sunshine打造专属游戏串流服务器
  • AI数据污染与模型退化:扩散模型自训练实验揭示反馈循环风险
  • 顶会论文模块复现与二次创新:ICLR 2026 复现:状态空间模型 Vim 模块在视觉检测中的高效替代与 YOLO 集成
  • 2026年5月武汉殡葬机构靠谱服务商深度测评攻略 - 海棠依旧大
  • 鄂尔多斯地磅配件采购指南:本地标杆厂家与高性价比定制方案推荐 - 品牌策略师
  • 从FOLD规则到反事实解释:构建可信AI系统的核心技术路径
  • CANN/HCCL集合通信库快速入门指南
  • 芯片设计实战:变异感知设计方法论与先进工艺下的良率挑战
  • 扩散模型原理与实践:从噪声预测到图像生成的AI核心技术
  • cann/ops-math矩阵乘压缩解压缩算子
  • 《龙虾OpenClaw系列:从嵌入式裸机到芯片级系统深度实战60课》038、多核架构入门——双核通信与共享内存
  • AI赋能分子相互作用:几何深度学习在药物与材料设计中的实践
  • 保姆级教程:用Tinc在Ubuntu 22.04上搭建一个加密的虚拟局域网(附多节点配置避坑指南)
  • UIKit开发者的桌面助手:生命周期、内存、并发与集合视图实践指南
  • 《网络攻防实践》实践八报告
  • 告别‘黑盒子’:用一台标准服务器搞定防火墙、路由和DHCP,聊聊NFV在家庭和企业网关的实战应用
  • XHS-Downloader:专业级小红书内容采集与批量下载技术方案
  • Rust轻量级LLM推理框架graniet/llm:本地部署与高性能实践
  • 4.30 redis简介
  • 强化学习中的文化累积:从个体智能到群体智慧的进化范式
  • AR-LLM大规模部署下的自然语言攻击:原理、风险与纵深防御实践
  • Datasette与ChatGPT插件:用自然语言查询数据库的实践指南
  • 20254209 实验三《Python程序设计》实验报告
  • 如何为你的大模型应用快速接入稳定且低成本的API服务
  • 别再硬扛了!Halcon局部形变匹配(Deformable)参数调优实战,解决工业零件轻微变形识别难题
  • 从萃取到分析全闭环,西恩士AI液冷清洁度萃取+分析全套设备深度解读 - 工业干货社