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

CANN/sip BLAS Swap算子文档

Swap【免费下载链接】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×功能说明接口功能asdBlasMakeSwapPlan初始化该句柄对应的Swap算子配置。asdBlasSswap交换两个实数向量。asdBlasCswap交换两个复数向量。计算公式asdBlasSswap的公式$$ t x, x y, yt $$示例 输入“x”为 [1.0, 2.0] 输入“y”为 [3.0, 4.0] 调用asdBlasSswap算子后输出“x”为 [3.0, 4.0] 输出“y”为 [1.0, 2.0]asdBlasCswap的公式$$ t x, x y, yt $$示例 输入“x”为[1.0 1.0i, 2.0 2.0i] 输入“y”为[3.0 3.0i, 4.0 4.0i] 调用asdBlasCswap算子后输出“x”为 [3.0 3.0i, 4.0 4.0i] 输出“y”为 [1.0 1.0i, 2.0 2.0i]函数原型AspbStatus asdBlasMakeSwapPlan( asdBlasHandle handle)AspbStatus asdBlasSswap( asdBlasHandle handle, const int64_t n, aclTensor * x, const int64_t incx, aclTensor * y, const int64_t incy)AspbStatus asdBlasCswap( asdBlasHandle handle, const int64_t n, aclTensor *x, const int64_t incx, aclTensor *y, const int64_t incy)asdBlasMakeSwapPlan参数说明参数名输入/输出描述handleasdBlasHandle输入算子的句柄返回值返回状态码具体参见SiP返回码。asdBlasSswap asdBlasCswap参数说明参数名输入/输出描述handleasdBlasHandle输入算子的句柄。nint64_t输入向量x或者向量y中元素的个数。xaclTensor *输入/输出对应公式中的x。asdBlasSswap支持的数据类型支持FLOAT32。asdBlasCswap支持的数据类型支持COMPLEX64。数据格式支持ND。shape为[n]。incxint64_t输入x相邻元素间的内存地址偏移量当前约束为1。yaclTensor *输入/输出对应公式中的y。asdBlasSswap支持的数据类型支持FLOAT32。asdBlasCswap支持的数据类型支持COMPLEX64。数据格式支持ND。shape为[n]。incyint64_t输入y相邻元素间的内存地址偏移量当前约束为1。返回值返回状态码具体参见SiP返回码。约束说明输入和输出数据格式、数据类型、shape保持一致。输入的元素个数n当前覆盖支持[16.71e07]。算子输入shape为[n]、[n]输出shape为[n]、[n]。算子实际计算时不支持ND高维度运算不支持维度≥3的运算。调用示例示例代码如下该样例旨在提供快速上手、开发和调试算子的最小化实现其核心目标是使用最精简的代码展示算子的核心功能而非提供生产级的安全保障。不推荐用户直接将示例代码作为业务代码若用户将示例代码应用在自身的真实业务场景中且发生了安全问题则需用户自行承担。asdBlasSswap#include iostream #include vector #include asdsip.h #include acl/acl.h #include acl_meta.h using namespace AsdSip; #define ASD_STATUS_CHECK(err) \ do { \ AsdSip::AspbStatus err_ (err); \ if (err_ ! AsdSip::ErrorType::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::vectorint64_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::vectorT hostData, const std::vectorint64_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::vectorint64_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; } 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 n 8; int64_t incx 1; int64_t incy 1; const int64_t xSize 8; std::vectorfloat tensorInXData; tensorInXData.reserve(xSize); for (int64_t i 0; i xSize; i) { tensorInXData[i] 1.0; } const int64_t ySize 8; std::vectorfloat tensorInYData; tensorInYData.reserve(ySize); for (int64_t i 0; i ySize; i) { tensorInYData[i] 2.0; } std::cout ------- input X ------- std::endl; for (int64_t i 0; i xSize; i) { std::cout tensorInXData[i] ; } std::cout std::endl; std::cout ------- input Y ------- std::endl; for (int64_t i 0; i ySize; i) { std::cout tensorInYData[i] ; } std::cout std::endl; std::vectorint64_t xShape {xSize}; std::vectorint64_t yShape {ySize}; aclTensor *inputX nullptr; aclTensor *inputY nullptr; void *inputXDeviceAddr nullptr; void *inputYDeviceAddr nullptr; ret CreateAclTensor(tensorInXData, xShape, inputXDeviceAddr, aclDataType::ACL_FLOAT, inputX); CHECK_RET(ret ::ACL_SUCCESS, return ret); ret CreateAclTensor(tensorInYData, yShape, inputYDeviceAddr, aclDataType::ACL_FLOAT, inputY); CHECK_RET(ret ::ACL_SUCCESS, return ret); asdBlasHandle handle; asdBlasCreate(handle); size_t lwork 0; void *buffer nullptr; asdBlasMakeSwapPlan(handle); asdBlasGetWorkspaceSize(handle, lwork); std::cout lwork lwork std::endl; if (lwork 0) { ret aclrtMalloc(buffer, static_castint64_t(lwork), ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ::ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret); } asdBlasSetWorkspace(handle, buffer); asdBlasSetStream(handle, stream); ASD_STATUS_CHECK(asdBlasSswap(handle, n, inputX, incx, inputY, incy)); asdBlasSynchronize(handle); asdBlasDestroy(handle); ret aclrtMemcpy(tensorInXData.data(), xSize * sizeof(float), inputXDeviceAddr, xSize * sizeof(float), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ::ACL_SUCCESS, LOG_PRINT(copy tensor x from device to host failed. ERROR: %d\n, ret); return ret); ret aclrtMemcpy(tensorInYData.data(), ySize * sizeof(float), inputYDeviceAddr, ySize * sizeof(float), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ::ACL_SUCCESS, LOG_PRINT(copy tensor y from device to host failed. ERROR: %d\n, ret); return ret); std::cout ------- output X ------- std::endl; for (int64_t i 0; i xSize; i) { std::cout tensorInXData[i] ; } std::cout std::endl; std::cout ------- output Y ------- std::endl; for (int64_t i 0; i ySize; i) { std::cout tensorInYData[i] ; } std::cout std::endl; std::cout Execute successfully. std::endl; aclDestroyTensor(inputX); aclDestroyTensor(inputY); aclrtFree(inputXDeviceAddr); aclrtFree(inputYDeviceAddr); aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }asdBlasCswap#include iostream #include vector #include asdsip.h #include cmath #include acl/acl.h #include acl_meta.h using namespace AsdSip; #define ASD_STATUS_CHECK(err) \ do { \ AsdSip::AspbStatus err_ (err); \ if (err_ ! AsdSip::ErrorType::ACL_SUCCESS) { \ std::cout Execute failed. std::endl; \ exit(-1); \ } else { \ std::cout Execute successfully. std::endl; \ } \ } 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::vectorint64_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::vectorT hostData, const std::vectorint64_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::vectorint64_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; } 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 n 6; int64_t incx 1; int64_t incy 1; int64_t xSize n; std::vectorstd::complexfloat tensorInXData; tensorInXData.reserve(xSize); for (int64_t i 0; i xSize; i) { tensorInXData[i] (std::complexfloat){2.0, -2.0}; } int64_t ySize n; std::vectorstd::complexfloat tensorInYData; tensorInYData.reserve(ySize); for (int64_t i 0; i ySize; i) { tensorInYData[i] (std::complexfloat){4.0, -4.0}; } std::cout ------- input TensorInX ------- std::endl; for (int64_t i 0; i xSize; i) { std::cout tensorInXData[i] ; } std::cout std::endl; std::cout ------- input TensorInY ------- std::endl; for (int64_t i 0; i ySize; i) { std::cout tensorInYData[i] ; } std::cout std::endl; std::vectorint64_t xShape {xSize}; std::vectorint64_t yShape {ySize}; aclTensor *inputX nullptr; aclTensor *inputY nullptr; void *inputXDeviceAddr nullptr; void *inputYDeviceAddr nullptr; ret CreateAclTensor(tensorInXData, xShape, inputXDeviceAddr, aclDataType::ACL_COMPLEX64, inputX); CHECK_RET(ret ::ACL_SUCCESS, return ret); ret CreateAclTensor(tensorInYData, yShape, inputYDeviceAddr, aclDataType::ACL_COMPLEX64, inputY); CHECK_RET(ret ::ACL_SUCCESS, return ret); asdBlasHandle handle; asdBlasCreate(handle); size_t lwork 0; void *buffer nullptr; asdBlasMakeSwapPlan(handle); asdBlasGetWorkspaceSize(handle, lwork); std::cout lwork lwork std::endl; if (lwork 0) { ret aclrtMalloc(buffer, static_castint64_t(lwork), ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ::ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); return ret); } asdBlasSetWorkspace(handle, buffer); asdBlasSetStream(handle, stream); ASD_STATUS_CHECK(asdBlasCswap(handle, n, inputX, incx, inputY, incy)); asdBlasSynchronize(handle); asdBlasDestroy(handle); ret aclrtMemcpy(tensorInXData.data(), xSize * sizeof(std::complexfloat), inputXDeviceAddr, xSize * sizeof(std::complexfloat), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ::ACL_SUCCESS, LOG_PRINT(copy tensor x from device to host failed. ERROR: %d\n, ret); return ret); ret aclrtMemcpy(tensorInYData.data(), ySize * sizeof(std::complexfloat), inputYDeviceAddr, ySize * sizeof(std::complexfloat), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ::ACL_SUCCESS, LOG_PRINT(copy tensor y from device to host failed. ERROR: %d\n, ret); return ret); std::cout ------- output TensorInX ------- std::endl; for (int64_t i 0; i xSize; i) { std::cout tensorInXData[i] ; } std::cout std::endl; std::cout ------- output TensorInY ------- std::endl; for (int64_t i 0; i ySize; i) { std::cout tensorInYData[i] ; } std::cout std::endl; aclDestroyTensor(inputX); aclDestroyTensor(inputY); aclrtFree(inputXDeviceAddr); aclrtFree(inputYDeviceAddr); aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库基于华为Ascend AI处理器专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

CANN/sip BLAS Swap算子文档

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

CANN/VGGT昇腾推理适配

VGGT inference on Ascend Atlas A2 【免费下载链接】cann-recipes-spatial-intelligence 本项目针对空间智能业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-spatial-intelligence CANN Environm…...

为内容生成平台集成Taotoken,实现按需切换不同风格的大模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内容生成平台集成Taotoken,实现按需切换不同风格的大模型 在构建内容生成平台时,一个常见的需求是希望输…...

自定义鼠标光标引擎:从原理到实现,打造个性化交互体验

1. 项目概述:一个鼠标光标背后的交互革命最近在GitHub上看到一个挺有意思的项目,叫“Mouse-Cursor”。初看标题,你可能觉得这有什么好研究的?不就是操作系统里那个跟着你手移动的小箭头或者小手图标吗?但点进去深入了解…...

基于SocialDAO的性勒索防御系统:技术架构与工程实践

1. 项目概述:一个面向未来的性勒索综合防御体系在数字生活的阴影面,性勒索(Sxtortion)正成为一种日益猖獗且极具破坏性的网络犯罪。它利用受害者的私密信息或影像进行威胁、敲诈,造成的心理创伤和社会伤害往往难以估量…...

可解释AI(xAI)如何破解医疗AI黑盒?以OCT辅助诊断多发性硬化为例

1. 项目概述:当AI诊断遇上“黑盒”困境,我们如何让医生信服? 在神经眼科和神经退行性疾病的研究前沿,光学相干断层扫描(OCT)已经成为一种革命性的无创成像工具。它能以微米级的精度,清晰地呈现视…...

算法审查委员会(ARB)建设指南:从设计到落地的负责任AI治理实践

1. 项目概述:为什么我们需要算法审查委员会?在过去的几年里,我亲眼见证了AI项目从实验室原型到大规模生产部署的惊人速度。随之而来的,是越来越多的深夜电话和紧急会议,议题往往围绕着某个已上线的模型出现了意想不到的…...

AI伦理框架实战:IEEE与WEF双轨制如何指导负责任的AI系统开发

1. 项目概述:为什么我们需要在AI项目中嵌入伦理框架?最近几年,AI项目从实验室走向了千家万户和各行各业。作为一名从业者,我亲眼见证了从“能用就行”到“必须好用且安全”的观念转变。早期我们更关注模型的准确率、响应速度&…...

CANN/opbase AllocScalar API文档

AllocScalar 【免费下载链接】opbase 本项目是CANN算子库的基础框架库,为算子提供公共依赖文件和基础调度能力。 项目地址: https://gitcode.com/cann/opbase 功能说明 申请一个aclScalar对象,并对其赋值。通过多个重载函数,用于支持…...

CANN/metadef AppendStride函数

AppendStride 【免费下载链接】metadef Ascend Metadata Definition 项目地址: https://gitcode.com/cann/metadef 函数功能 向后扩展一个步长值,如果扩展的步长数量超出Stride的最大限制,那么本函数不做任何事情。 函数原型 Stride& Appe…...

3秒获取百度网盘提取码:baidupankey智能工具的终极解决方案

3秒获取百度网盘提取码:baidupankey智能工具的终极解决方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字资源共享日益频繁的今天,百度网盘提取码成为获取资料的关键屏障。据统计,超…...

AI算力治理五大核心原则:平衡风险管控与技术创新

1. 项目概述:为什么我们需要关注AI算力治理?最近几年,AI的发展速度让人眼花缭乱,从能写代码的Copilot到能生成逼真图像的Stable Diffusion,背后都离不开一个核心驱动力:算力。简单来说,没有海量…...

Segment Anything生态全景:从基础模型到垂直应用实战指南

1. 项目概述:Segment Anything 生态全景图如果你在2023年之后关注过计算机视觉领域,那么“Segment Anything Model”这个名字你一定不会陌生。它就像一颗投入平静湖面的巨石,激起的涟漪迅速扩散到了图像分割、医学影像、机器人、遥感乃至生物…...

BLDC无刷直流电机作为发电机的波形图

这是张价值上千块的图片,因为花了上千块买了个示波器才发现的这个图片...

CANN/pto-isa异步通信Demo

Allgather Async Demo 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across …...

Cap开源视频消息工具:自托管部署、技术架构与Loom替代方案

1. 项目概述:一个开源的视频消息工具 如果你正在寻找一个可以替代 Loom 的、功能强大且能完全掌控在自己手中的视频录制与分享工具,那么 Cap 绝对值得你花时间深入了解。简单来说,Cap 是一个开源的视频消息工具,它允许你快速录制、…...

开源AI录音助理ClawHark:用Wear OS手表打造隐私优先的语音采集方案

1. 项目概述:将你的智能手表变成全天候AI录音助理 如果你和我一样,对Omi、Limitless这类AI录音硬件感兴趣,但又不想额外花钱买设备,也不想把个人对话数据交给第三方云服务,那么ClawHark这个项目可能就是你要找的答案。…...

企业级AI应用开发,利用Taotoken实现API访问控制与审计日志

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业级AI应用开发,利用Taotoken实现API访问控制与审计日志 在将大模型能力集成到企业应用的过程中,开发团队…...

基于Docker的AI Agent安全部署实践:Carapace项目深度解析

1. 项目概述:为AI Agent打造一个安全的“家”如果你正在运行一个像OpenClaw这样的AI Agent网关,那么你手里握着的是一把双刃剑。它强大、灵活,能帮你处理各种任务,但同时也意味着你赋予了一个AI程序访问你的Shell、文件系统乃至外…...

多模态AI重塑教育:从评估到个性化支持的实践与伦理挑战

1. 项目概述:当多模态AI走进课堂,我们面临什么?作为一名长期关注教育技术前沿的从业者,我亲眼见证了AI从实验室概念到课堂助手的演变。最初,AI在教育中的应用多是单点突破,比如用算法批改选择题&#xff0c…...

医疗AI可解释性实战:SHAP与EBM模型在眼科诊断中的对比解析

1. 项目概述:当AI遇见眼科,我们如何看清“决策黑箱”?在眼科神经领域,多发性硬化(MS)的诊断与病程监测,正经历一场从“经验依赖”到“数据驱动”的深刻变革。光学相干断层扫描(OCT&a…...

Nucleus Co-Op终极指南:如何让任何单机游戏变身为多人派对神器

Nucleus Co-Op终极指南:如何让任何单机游戏变身为多人派对神器 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经想过&#xf…...

AI平台竞争中的合谋与网络效应:市场博弈的底层逻辑分析

1. 项目概述:当AI平台开始“默契”时,市场会发生什么? 最近和几位做投资和产品战略的朋友聊天,话题总绕不开一个现象:几个头部的AI大模型平台,无论是定价策略、功能迭代节奏,还是对开发者的扶持…...

LLM推理服务调度优化:KV$缓存与负载均衡的乘法组合方法

1. LLM推理服务调度优化概述大型语言模型(LLM)推理服务面临的核心挑战之一是如何高效调度用户请求。当多个用户同时向部署在GPU集群上的LLM服务发送请求时,调度系统需要决定将每个请求分配给哪个计算实例。这个决策直接影响两个关键性能指标:首令牌延迟(…...

基于LLM智能体的多模态医疗AI系统:架构、实现与临床评估

1. 项目概述与核心思路在肿瘤诊疗的日常工作中,我们常常面临一个困境:信息是海量的,但时间是有限的。一位晚期结直肠癌患者,他的病历里可能包含长达数年的门诊记录、几次手术的病理报告、不同时期的CT/MRI影像、以及一份包含数百个…...

CANN/ops-blas Scopy算子实现

Scopy算子实现 【免费下载链接】ops-blas 本项目是CANN提供的高性能线性代数计算以及轻量化GEMM调用算子库。 项目地址: https://gitcode.com/cann/ops-blas 概述 BLAS Scopy算子实现,同时支持Ccopy复数向量复制。 支持的接口 aclblasScopy: 实数向量复制…...

快速提取视频中的PPT内容:一键将视频转PDF的终极解决方案

快速提取视频中的PPT内容:一键将视频转PDF的终极解决方案 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 在数字化学习时代,你是否经常需要从教学视频、会议录…...

报名截止前最后48小时,你必须确认的7项资格校验清单,漏1项直接失去参会编码!

更多请点击: https://intelliparadigm.com 第一章:2026年AI技术大会报名截止时间 2026年AI技术大会(AI Tech Summit 2026)官方报名通道将于北京时间2026年3月15日23:59正式关闭,逾期系统将自动终止注册与资料提交。所…...

[具身智能-617]:激光雷达传感器的工作原理、接口信号、数据格式

激光雷达(LiDAR)是一种主动式三维环境感知传感器,核心是通过发射激光并测量反射信号,获取周围物体的精确距离、角度与反射特性,最终生成点云(Point Cloud)。以下从工作原理、接口信号、数据格式…...

[具身智能-616]:IMU 四元数是什么?(大白话 + 原理 + 作用 + 为什么不用欧拉角)

一、一句话极简定义四元数是用来描述物体在 3D 空间姿态、旋转的数学工具,在 IMU 九轴里,就是用 4 个数字,唯一表示传感器当前的倾斜、旋转、朝向。格式:\(q [w,\ x,\ y,\ z]\)4 个浮点数,没有角度,纯数学…...