CANN特征向量检索指南
特征向量检索FV【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs基本原理该部分主要实现了对特征检索的功能验证生成随机底库随机生成特征数据进行特征检索当前支持1:N、M:N两种检索模式下文的示例代码以1N为例。大致可分为初始化、添加特征到底库、底库搜索、精准修改或删除底库特征、去初始化几个主要步骤具体接口调用方式如下初始化调用aclInit接口进行初始化调用aclfvCreateInitPara接口创建aclfvInitPara类型的数据来指定特征向量检索的初始化参数。添加特征到底库主要调用aclfvCreateFeatureInfo接口创建aclfvFeatureInfo类型数据来表示创建特征的描述信息然后调用aclfvRepoAdd添加底库。底库搜索调用aclfvSearch接口来实现检索。精准修改或删除底库特征调用aclfvDel和aclfvModify接口来实现删除或修改底库中某个特征。下文的代码以删除底库特征为例。去初始化主要包括释放运行时资源、调用aclfvDestroyInitPara接口销毁aclfvInitPara类型的数据、调用aclfvRelease接口特征检索模块去初始化释放内存空间。示例代码本节中的示例重点介绍特征向量检索的代码逻辑不能直接拷贝编译运行仅供参考。完整样例代码可单击Link查看。调用接口后需增加异常处理的分支并记录报错日志、提示日志此处不一一列举。// 设置默认的运行模式为HOST aclrtRunMode runMode ACL_HOST; // 1.初始化 // 1.1 初始化特征检索模块此处以底库特征数100000为例 size_t fsNum 100000; fvInitPara aclfvCreateInitPara(fsNum); // 1.2 指定特征向量检索的初始化参数 ret aclfvInit(fvInitPara); // 2.添加底库和特征向量 // 2.1 增加第一个特征创建特征描述信息时偏移量offset参数值为0 uint32_t offset 0; uint32_t featureCount 1000; uint32_t featureLen 36; // 此处的自定义函数BaseShortFeaAlloc用于生成特征随机数据由用户自行实现 void *featureData BaseShortFeaAlloc(1000, static_castsize_t(featureCount), 0); std::shared_ptrvoid feaBufPtr(featureData, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files){(void)aclrtFreeHost(p);}); void *inputData featureData; std::shared_ptrvoid inputDataPtr nullptr; // 如果运行模式为ACL_HOST则需要申请内存再通过aclrtMemcpy接口将Host的随机特征数据传输到Device否则直接将随机特征数据读入Device内存 if (aclrtGetRunMode(runMode) ACL_HOST) { // 为inputData申请内存 ret aclrtMalloc(inputData, featureLen * featureCount, ACL_MEM_MALLOC_HUGE_FIRST); // 将随机特征数据读入到Device内存中 inputDataPtr.reset(inputData, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files) {(void)aclrtFree(p);}); // 将featureData从Host侧拷贝到Device侧 ret aclrtMemcpy(inputData, featureLen * featureCount, featureData, featureLen * featureCount, ACL_MEMCPY_HOST_TO_DEVICE); } // 创建特征描述信息inputData表示前一步的特征随机数据 auto featureInfo aclfvCreateFeatureInfo(id0, id1, offset, featureLen, featureCount, reinterpret_castuint8_t *(inputData), featureLen * featureCount); // 添加底库并向底库中添加特征featureInfo表示前一步的特征描述信息 aclError ret aclfvRepoAdd(SEARCH_1_N, featureInfo); // 销毁aclfvFeatureInfo特征描述信息 aclfvDestroyFeatureInfo(featureInfo); // 2.2增加第二个特征创建特征描述信息时偏移值offset需要与库中已添加特征个数一致并精确删除或修改底库中的某个特征 offset featureCount; // 增加特征到底库的步骤参考4.1中的代码 // .... uint8_t featureData[36]; for (size_t i 0; i 36; i) { featureData[i] static_castuint8_t(i); } // 创建内存并传输特征数据 void *inputData nullptr; aclrtMalloc(inputData, 36, ACL_MEM_MALLOC_HUGE_FIRST); std::shared_ptrvoid inputDataPtr(inputData, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files){(void)aclrtFree(p);}); aclrtMemcpyKind kind ACL_MEMCPY_DEVICE_TO_DEVICE; // 如果运行模式是ACL_HOST,将特征数据拷贝到Device侧否则无需拷贝其中dataLen为featureData指针申请的内存长度 if (aclrtGetRunMode(runMode) ACL_HOST) { kind ACL_MEMCPY_HOST_TO_DEVICE; } aclrtMemcpy(inputData, 36, featureData, dataLen, kind); // 创建特征描述信息 uint32_t id0 0; uint32_t id1 0; auto featureInfo1 aclfvCreateFeatureInfo(id0, id1, offset, 36, 1, reinterpret_castuint8_t *(inputData), 36); std::shared_ptraclfvFeatureInfo featureInfoPtr(featureInfo1, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/aclfvFeatureInfo *p?utm_sourcegitcode_repo_files){(void)aclfvDestroyFeatureInfo(p);}); // 删除1个特征 aclfvDel(featureInfo1); // 2.3 增加特征到其它底库,其中一级底库为1二级底库为1 id0 1; id1 1; offset 0; // 增加特征到底库步骤参考2.1中的代码 // .... // 3 底库检索以1N检索为例主要包括特征检索预处理特征1:N检索特征检索结果处理三个部分 // 3.1 特征检索预处理对于1:N来说, queryCnt必须为1 uint32_t queryCnt 1; uint32_t topK 5; uint32_t dataLen queryCnt * topK * sizeof(uint32_t); uint32_t resultNumDataLen queryCnt * sizeof(uint32_t); const uint32_t tableLen 32 * 1024; uint32_t tableDataLen queryCnt * tableLen; // 生成数据表用户通过数据表进行检索比对此处的自定义函数AdcTabInit用于初始化特征检索输入Adc表由用户自行实现 uint8_t *tableDataTmp (uint8_t *)AdcTabInit(1000, queryCnt * 1024); std::shared_ptrvoid tableDataTmpPtr(tableDataTmp,[](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files){(void)aclrtFreeHost(p);}); // 为数据表分配内存tableDataDev用于创建检索输入表信息 void *devPtr nullptr; aclrtMalloc(devPtr, tableDataLen, ACL_MEM_MALLOC_HUGE_FIRST); tableDataDev.reset(devPtr, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files) {(void)aclrtFree(p);}); // 拷贝表数据到Device侧 uint8_t *devPtrTmp reinterpret_castuint8_t *(devPtr); for (uint32_t i 0; i queryCnt; i) { for (uint32_t j 0; j 32; j) { uint8_t *dst devPtrTmp i * 32 * 1024 j * 1024; uint8_t *src tableDataTmp i * 1024; aclrtMemcpy(dst, 1024, src, 1024, ACL_MEMCPY_HOST_TO_DEVICE); } } // 为检索结果resultNumDev,id0Dev,id1Dev,resultOffsetDev,resultDistanceDev分配内存 aclrtMalloc(devPtr, resultNumDataLen, ACL_MEM_MALLOC_HUGE_FIRST); resultNumDev.reset(devPtr, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files) {(void)aclrtFree(p);}); aclrtMalloc(devPtr, dataLen, ACL_MEM_MALLOC_HUGE_FIRST); id0Dev.reset(devPtr, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files) {(void)aclrtFree(p);}); aclrtMalloc(devPtr, dataLen, ACL_MEM_MALLOC_HUGE_FIRST); id1Dev.reset(devPtr, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files) {(void)aclrtFree(p);}); aclrtMalloc(devPtr, dataLen, ACL_MEM_MALLOC_HUGE_FIRST); resultOffsetDev.reset(devPtr, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files) {(void)aclrtFree(p);}); aclrtMalloc(devPtr, dataLen, ACL_MEM_MALLOC_HUGE_FIRST); resultDistanceDev.reset(devPtr, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/void *p?utm_sourcegitcode_repo_files) {(void)aclrtFree(p);}); // 创建检索输入表信息结果用于创建检索任务输入信息 aclfvQueryTable *searchQueryTable aclfvCreateQueryTable(queryCnt, tableLen, reinterpret_castuint8_t * (tableDataDev.get()), tableDataLen); searchQueryTable.reset(searchQueryTable, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/aclfvQueryTable *p?utm_sourcegitcode_repo_files){(void)aclfvDestroyQueryTable(p);}); // 创建特征库范围参数结果用于创建检索任务输入信息 aclfvRepoRange *searchRange aclfvCreateRepoRange(0, 1023, 0, 1023); searchRange.reset(searchRange, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/aclfvRepoRange *p?utm_sourcegitcode_repo_files){(void)aclfvDestroyRepoRange(p);}); // 创建检索任务输入信息结果用于特征1:N检索 aclfvSearchInput *searchInput aclfvCreateSearchInput(searchQueryTable, searchRange, topK); searchInput.reset(searchInput, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/aclfvSearchInput *p?utm_sourcegitcode_repo_files){(void)aclfvDestroySearchInput(p);}); // 创建检索结果信息结果用于特征1:N检索 aclfvSearchResult *searchResult aclfvCreateSearchResult(queryCnt, reinterpret_castuint32_t *(resultNumDev.get()), resultNumDataLen, reinterpret_castuint32_t *(id0Dev.get()), reinterpret_castuint32_t *(id1Dev.get()), reinterpret_castuint32_t *(resultOffsetDev.get()), reinterpret_castfloat *(resultDistanceDev.get()), dataLen); searchResult.reset(searchResult, [](https://gitcode.com/cann/docs/blob/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/aclfvSearchResult *p?utm_sourcegitcode_repo_files){(void)aclfvDestroySearchResult(p);}); // 3.2 特征1:N检索 aclfvSearch(SEARCH_1_N, searchInput.get(), searchResult.get()); // 3.3 特征检索结果处理 // 获取检索结果 uint32_t dataLen queryCnt * topK * sizeof(uint32_t); uint32_t *id0 (uint32_t *)id0Dev.get(); uint32_t *id1 (uint32_t *)id1Dev.get(); uint32_t *resultOffset (uint32_t *)resultOffsetDev.get(); float *resultDistance (float *)resultDistanceDev.get(); // 如果运行模式为ACL_HOST则需要通过aclrtMemcpy接口将Device的检索结果回传到Host侧否则无需回传 if (aclrtGetRunMode(runMode) ACL_HOST) { // 从Device侧拷贝数据到Host侧 id0 (uint32_t *)malloc(dataLen); id0Ptr.reset(id0); id1 (uint32_t *)malloc(dataLen); id1Ptr.reset(id1); resultOffset (uint32_t *)malloc(dataLen); resultOffsetPtr.reset(resultOffset); resultDistance (float *)malloc(dataLen); resultDistancePtr.reset(resultDistance); aclrtMemcpy(id0, dataLen, id0Dev.get(), dataLen, ACL_MEMCPY_DEVICE_TO_HOST); aclrtMemcpy(id1, dataLen, id0Dev.get(), dataLen, ACL_MEMCPY_DEVICE_TO_HOST); aclrtMemcpy(resultOffset, dataLen, resultOffsetDev.get(), dataLen, ACL_MEMCPY_DEVICE_TO_HOST); aclrtMemcpy(resultDistance, dataLen, resultDistanceDev.get(), dataLen, ACL_MEMCPY_DEVICE_TO_HOST); } // 展示底库中的数据 for (uint32_t i 0; i queryCnt; i) { for (uint32_t j 0; j topK; j) { uint32_t i0 id0[i * topK j]; uint32_t i1 id1[i * topK j]; uint32_t offset resultOffset[i * topK j]; float distance resultDistance[i * topK j]; } } // 4. 删除底库和数据 // 创建特征库范围并删除指定范围内的底库 uint32_t id0Min 0; uint32_t id0Max 1023; uint32_t id1Min 0; uint32_t id1Max 1023; aclfvRepoRange *repoRange aclfvCreateRepoRange(id0Min, id0Max, id1Min, id1Max); aclfvRepoDel(SEARCH_1_N, repoRange); // 销毁aclfvInitPara类型的数据 aclfvDestroyInitPara(fvInitPara); ......【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

5个核心场景解锁:NBTExplorer可视化编辑器让Minecraft数据编辑变得如此简单

5个核心场景解锁:NBTExplorer可视化编辑器让Minecraft数据编辑变得如此简单

5个核心场景解锁:NBTExplorer可视化编辑器让Minecraft数据编辑变得如此简单 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾经因为看不懂Minec…

2026/7/5 19:58:15 阅读更多 →
终极黑苹果配置革命:智能硬件识别与OpenCore自动化配置

终极黑苹果配置革命:智能硬件识别与OpenCore自动化配置

终极黑苹果配置革命:智能硬件识别与OpenCore自动化配置 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在传统黑苹果配置过程中&#xff0…

2026/7/5 19:58:15 阅读更多 →
D-Link DCS摄像头CVE-2020-25078漏洞剖析与批量检测脚本实现

D-Link DCS摄像头CVE-2020-25078漏洞剖析与批量检测脚本实现

1. 项目概述:一次对D-Link DCS监控设备信息泄露漏洞的深度剖析最近在整理网络设备安全审计案例时,一个老生常谈但又屡见不鲜的漏洞类型再次引起了我的注意——硬编码或未授权访问导致的信息泄露。D-Link DCS系列网络监控摄像头爆出的CVE-2020-25078漏洞&…

2026/7/5 19:58:15 阅读更多 →

最新新闻

如何用ComfyUI-KJNodes解决AI工作流复杂性问题:实战指南

如何用ComfyUI-KJNodes解决AI工作流复杂性问题:实战指南

如何用ComfyUI-KJNodes解决AI工作流复杂性问题:实战指南 【免费下载链接】ComfyUI-KJNodes Various custom nodes for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-KJNodes 在构建AI图像生成和视频处理工作流时,你是否经常面临…

2026/7/5 21:40:38 阅读更多 →
Apache Tomcat路径等价漏洞CVE-2025-24813:从原理到复现的深度剖析

Apache Tomcat路径等价漏洞CVE-2025-24813:从原理到复现的深度剖析

1. 漏洞概述与影响范围CVE-2025-24813,一个在2025年初披露的Apache Tomcat高危漏洞,其CVSS 3.x评分一度高达9.8分(CRITICAL),被美国网络安全和基础设施安全局(CISA)列入已知被利用漏洞目录。这个…

2026/7/5 21:40:38 阅读更多 →
CMFM模块:基于Mamba的多模态目标检测技术解析

CMFM模块:基于Mamba的多模态目标检测技术解析

1. 项目概述在计算机视觉领域,多模态目标检测一直是研究热点,特别是在复杂环境下的应用场景。传统基于可见光(RGB)的单模态检测系统在恶劣天气条件下(如雨、雾、雪等)性能会显著下降。本文介绍的CMFM(Cross-Modal Feature Fusion …

2026/7/5 21:36:37 阅读更多 →
特效字体翻译中的视觉风格迁移技术解析

特效字体翻译中的视觉风格迁移技术解析

1. 特效字体翻译的视觉困境与行业痛点 在跨境电商和数字营销领域,特效字体(Visual Effects Typography)已经成为产品视觉呈现的核心竞争力。根据2023年亚马逊平台数据显示,带有火焰、金属、霓虹等特效字体的产品主图,其…

2026/7/5 21:36:37 阅读更多 →
大数据原生集群 (Hadoop2.X为核心) 本地测试环境搭建二

大数据原生集群 (Hadoop2.X为核心) 本地测试环境搭建二

上一篇补充小提示 根据上一篇安装好虚拟机和系统之后,在安装软件之前我有两个对于虚拟机的注意点想送给大家,大家可以不看,但是后期在虚拟机的使用上或许对你有帮助 一、在安装配置集群的时候,涉及到不同机器之间有关IP地址的设…

2026/7/5 21:30:36 阅读更多 →
英雄联盟智能助手Seraphine:5分钟快速上手的游戏增强工具

英雄联盟智能助手Seraphine:5分钟快速上手的游戏增强工具

英雄联盟智能助手Seraphine:5分钟快速上手的游戏增强工具 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 你是否厌倦了在英雄联盟中手动查询对手战绩、错过对局接受,或是在BP阶段手忙脚…

2026/7/5 21:26:35 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻