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

使用HIP编写GPU 算子向量加法

HIP (Heterogeneous-compute Interface for Portability)来编写一个 GPU 算子operator。HIP 是 AMD 推出的 GPU 编程接口类似 CUDA但可在 AMD 和 NVIDIA GPU 上运行。下面我给你一个完整示例演示如何写一个简单算子比如向量加法Vector Add并用 HIP 编译运行。实践1️⃣ 基本 HIP 算子示例向量加法#includehip/hip_runtime.h#includeiostream#defineN1024// 向量长度#defineTHREADS_PER_BLOCK256// HIP kernel: 向量加法__global__voidvector_add(constfloat*A,constfloat*B,float*C,intn){intidxblockIdx.x*blockDim.xthreadIdx.x;if(idxn){C[idx]A[idx]B[idx];}}intmain(){// 主机向量float*h_Anewfloat[N];float*h_Bnewfloat[N];float*h_Cnewfloat[N];// 初始化向量for(inti0;iN;i){h_A[i]i*1.0f;h_B[i](N-i)*1.0f;}// 设备向量float*d_A,*d_B,*d_C;hipMalloc(d_A,N*sizeof(float));hipMalloc(d_B,N*sizeof(float));hipMalloc(d_C,N*sizeof(float));// 拷贝数据到设备hipMemcpy(d_A,h_A,N*sizeof(float),hipMemcpyHostToDevice);hipMemcpy(d_B,h_B,N*sizeof(float),hipMemcpyHostToDevice);// 计算线程块和网格大小intblocks(NTHREADS_PER_BLOCK-1)/THREADS_PER_BLOCK;// 启动 kernelhipLaunchKernelGGL(vector_add,dim3(blocks),dim3(THREADS_PER_BLOCK),0,0,d_A,d_B,d_C,N);// 拷贝结果回主机hipMemcpy(h_C,d_C,N*sizeof(float),hipMemcpyDeviceToHost);// 验证结果for(inti0;i10;i){// 打印前 10 个元素std::couth_A[i] h_B[i] h_C[i]std::endl;}// 释放内存delete[]h_A;delete[]h_B;delete[]h_C;hipFree(d_A);hipFree(d_B);hipFree(d_C);return0;}2️⃣ 编译 运行# 编译hipcc vector_add.cpp-ovector_add# 运行./vector_add输出前 10 个元素类似0 1024 1024 1 1023 1024 2 1022 1024 ...3️⃣ 说明__global__修饰函数表示这是一个 GPU kernel。hipMalloc/hipFree对应 CUDA 的cudaMalloc/cudaFree。hipMemcpy负责主机和设备间数据拷贝。hipLaunchKernelGGL用来启动 kernelhipLaunchKernelGGL(kernel_name,dim3(blocks),dim3(threads_per_block),shared_mem_bytes,stream,args...)HIP 的算子逻辑和 CUDA 几乎一致只要把cudaXXX改成hipXXX就能跑在 AMD GPU。运行时报错/workspace/models/liuysh# hipcc vector_add.cpp -o vector_add vector_add.cpp:29:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 29 | hipMalloc(d_A, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:30:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 30 | hipMalloc(d_B, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:31:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 31 | hipMalloc(d_C, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:34:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 34 | hipMemcpy(d_A, h_A, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:35:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 35 | hipMemcpy(d_B, h_B, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:44:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 44 | hipMemcpy(h_C, d_C, N * sizeof(float), hipMemcpyDeviceToHost); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:53:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:19: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:33: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ 9 warnings generated when compiling for gfx906. vector_add.cpp:29:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 29 | hipMalloc(d_A, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:30:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 30 | hipMalloc(d_B, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:31:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 31 | hipMalloc(d_C, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:34:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 34 | hipMemcpy(d_A, h_A, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:35:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 35 | hipMemcpy(d_B, h_B, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:44:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 44 | hipMemcpy(h_C, d_C, N * sizeof(float), hipMemcpyDeviceToHost); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:53:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:19: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:33: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ 9 warnings generated when compiling for gfx926. vector_add.cpp:29:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 29 | hipMalloc(d_A, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:30:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 30 | hipMalloc(d_B, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:31:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 31 | hipMalloc(d_C, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:34:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 34 | hipMemcpy(d_A, h_A, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:35:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 35 | hipMemcpy(d_B, h_B, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:44:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 44 | hipMemcpy(h_C, d_C, N * sizeof(float), hipMemcpyDeviceToHost); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:53:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:19: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:33: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ 9 warnings generated when compiling for gfx928. vector_add.cpp:29:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 29 | hipMalloc(d_A, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:30:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 30 | hipMalloc(d_B, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:31:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 31 | hipMalloc(d_C, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:34:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 34 | hipMemcpy(d_A, h_A, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:35:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 35 | hipMemcpy(d_B, h_B, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:44:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 44 | hipMemcpy(h_C, d_C, N * sizeof(float), hipMemcpyDeviceToHost); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:53:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:19: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:33: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ 9 warnings generated when compiling for gfx936. vector_add.cpp:29:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 29 | hipMalloc(d_A, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:30:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 30 | hipMalloc(d_B, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:31:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 31 | hipMalloc(d_C, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:34:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 34 | hipMemcpy(d_A, h_A, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:35:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 35 | hipMemcpy(d_B, h_B, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:44:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 44 | hipMemcpy(h_C, d_C, N * sizeof(float), hipMemcpyDeviceToHost); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:53:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:19: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:33: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ 9 warnings generated when compiling for gfx938. vector_add.cpp:29:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 29 | hipMalloc(d_A, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:30:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 30 | hipMalloc(d_B, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:31:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 31 | hipMalloc(d_C, N * sizeof(float)); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:34:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 34 | hipMemcpy(d_A, h_A, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:35:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 35 | hipMemcpy(d_B, h_B, N * sizeof(float), hipMemcpyHostToDevice); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:44:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 44 | hipMemcpy(h_C, d_C, N * sizeof(float), hipMemcpyDeviceToHost); | ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ vector_add.cpp:53:5: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:19: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ vector_add.cpp:53:33: warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result] 53 | hipFree(d_A); hipFree(d_B); hipFree(d_C); | ^~~~~~~ ~~~ 9 warnings generated when compiling for host. rootf10r1n06:/workspace/models/liuysh# ./vector_add 0 1024 1024 1 1023 1024 2 1022 1024 3 1021 1024 4 1020 1024 5 1019 1024 6 1018 1024 7 1017 1024 8 1016 1024 9 1015 1024 Warning: Resource leak detected by SharedSignalPool, 68 Signals leaked.根据编译和运行日志来看遇到的“报错”主要是编译时的警告和运行时的资源泄漏提示1️⃣ 编译时警告日志里反复出现warning: ignoring return value of function declared with nodiscard attribute [-Wunused-result]出现在hipMalloc、hipMemcpy、hipFree这几行。原因从 HIP 5.x 版本开始这些函数都加了[[nodiscard]]属性意思是返回值不能忽略因为返回值中可能包含错误码。你现在的代码写法直接调用了函数没有检查返回值所以会产生警告。示例hipError_t errhipMalloc(d_A,N*sizeof(float));if(err!hipSuccess){std::cerrhipMalloc failed: hipGetErrorString(err)std::endl;}✅ 建议编译通过不会阻止程序运行但在生产环境中最好检查返回值。2️⃣ 运行时提示Warning: Resource leak detected by SharedSignalPool, 68 Signals leaked.这是 HIP / ROCm 在运行 kernel 后检测到 GPU 资源没有完全释放。可能原因kernel 启动后没有同步 (hipDeviceSynchronize())。某些 GPU 信号或流被泄漏在你的简单示例里可能是内部 runtime 的管理问题。解决方法在 kernel 调用后加同步确保所有操作完成hipLaunchKernelGGL(vector_add,dim3(blocks),dim3(THREADS_PER_BLOCK),0,0,d_A,d_B,d_C,N);hipDeviceSynchronize();// 等待 kernel 执行完成对于资源释放问题保证hipFree被调用即可。你原来的代码已经调用了hipFree(d_A)、hipFree(d_B)、hipFree(d_C)所以主要是 runtime 内部 signal 还未完全回收。加同步通常可以消除警告。✅ 总结编译警告nodiscard警告可以通过检查返回值消除。运行时警告SharedSignalPool 资源泄漏一般加hipDeviceSynchronize()后消失。程序逻辑你的向量加法结果是正确的所以算子逻辑没有问题。

相关文章:

使用HIP编写GPU 算子向量加法

HIP (Heterogeneous-compute Interface for Portability) 来编写一个 GPU 算子(operator)。HIP 是 AMD 推出的 GPU 编程接口,类似 CUDA,但可在 AMD 和 NVIDIA GPU 上运行。下面我给你一个完整示例,演示如何写一个简单算…...

成都口碑好的特斯拉专修公司有哪些

在成都,如果你是特斯拉车主,寻找一家靠谱的专修公司是非常重要的。今天就给大家推荐一家口碑极佳的特斯拉专修公司——TBA特斯拉专修(成都三业店),也就是成都市三业汽车服务有限责任公司。下面从多个方面来看看它的优势…...

微软 Qlib 实战:从零构建跑赢大盘的 AI 智能选股策略(附最新回测与全流程代码)

在 GitHub 的量化投资社区中,微软亚洲研究院开源的 Qlib 毫无疑问是王者级别的存在(13k Stars)。传统的量化策略通常依赖主观经验设定的指标(如:均线突破、MACD背离),而 Qlib 则是让 人工智能&a…...

前端开发者如何构建个人工具箱:从工具函数到配置片段的效率实践

1. 项目概述:一个前端开发者的“百宝箱”仓库在多年的前端开发生涯中,我养成了一个习惯:每当遇到一个精巧的解决方案、一个高频使用的工具函数,或者一个值得反复琢磨的配置片段,我都会把它们收集起来。久而久之&#x…...

数据库角色管理(Role Management)

1.1、角色基础角色是权限的集合,是 Oracle 权限管理的核心机制。12c 增强了角色的安全特性。创建角色:CREATE ROLE app_developer;创建带密码的角色(需激活时提供密码):CREATE ROLE sensitive_role IDENTIFIED BY &quo…...

AI代码助手与Django全栈开发:人机协同编程新范式实践

1. 项目概述:当AI代码助手遇上Django全栈开发如果你是一名独立开发者、初创公司的技术负责人,或者正在学习全栈开发,那么“Cursor-Django”这个项目绝对值得你花时间研究。这不是一个简单的Django教程,而是一个由Coding for Entre…...

2026年山东大学软件学院创新项目实训博客(五)

2026年山东大学软件学院创新项目实训博客(五) 一、工作进展 本阶段 Agent 架构模块的核心推进是将父级编排从「单次补全加强制工具调用」升级为有界多轮循环,并同步完成系统提示词的多步能力声明、意图分类器的域关键词防误路由、以及 SSE 事…...

[GESP202512 C++ 三级] 判断题第 9 题

【题目描述】 给定一个正整数 a ,当需要计算 -a 的补码时,有这样一个计算技巧:将 a 的二进制形式从右往左扫描,遇到第一个 1 之后,将找到的第一个 1 左边的所有位都取反,能得到 -a 的补码。 答:…...

【c++面向对象编程】第22篇:输入输出运算符重载:<< 与 >> 的友元实现

目录 一、为什么不能是成员函数? 二、标准写法(两步法) 第1步:在类中声明友元函数 第2步:实现全局函数 三、为什么要返回引用? 支持链式输出 正确 vs 错误示例 四、为什么需要友元?能否不…...

基于CircuitPython与蓝牙BLE的交互式电子糖果心制作指南

1. 项目概述:一个可交互的蓝牙电子糖果心 情人节期间,那些印着“BE MINE”、“HUG ME”等短句的糖果心(Conversation Hearts)总是能传递简单而直接的情感。你有没有想过,如果能亲手制作一个可以随时改变文字和颜色的电…...

微软UFO项目:统一AI模型调用的抽象层设计与工程实践

1. 项目概述:当“统一”成为AI开发的新范式最近在折腾大模型应用开发的朋友,可能都绕不开一个痛点:模型太多,工具链太杂。想用闭源的GPT-4处理文本,用开源的Llama搞本地推理,再用DALL-E 3生成图片&#xff…...

接手遗留系统第一周,我做了三件事,团队从此不再怕改老代码

刚跳槽到新公司,技术总监在入职谈话时递给我一杯咖啡,语气沉重地说:“我们最核心的交易系统已经跑了八年,负责它的老张去年离职了。现在整个团队没人敢动里面的代码,每次改需求都像在拆炸弹。”他停顿了一下&#xff0…...

【建筑学研究降维打击】:为什么顶尖事务所已禁用传统文献管理?NotebookLM智能溯源+跨语言规范比对实战拆解

更多请点击: https://intelliparadigm.com 第一章:NotebookLM建筑学研究辅助的范式革命 NotebookLM 作为 Google 推出的基于用户自有文档的 AI 助手,正悄然重塑建筑学研究的方法论边界。它不再依赖通用知识库的泛化回答,而是以建…...

代码审查时最该关注的不是语法,而是这五个“坏味道”

“这段代码能跑,但总觉得哪里不对劲。”如果你在审查代码时有过这种感觉,说明你已经嗅到了代码的坏味道。作为软件测试从业者,我们往往比开发人员更早感受到坏味道带来的痛苦——一个看似简单的变更导致回归测试大面积失败,一个边…...

书成紫微动,律定凤凰驯:从无心创作到天命显化的海棠山铁哥之路

书成紫微动,律定凤凰驯。 ——南北朝庾信一、千古谶语,千年未解诗句天道逻辑千年误读书成紫微动先著书立道,撼动文脉附会玄学,强行造神律定凤凰驯再定规立序,祥瑞归宁脑会剧情,虚妄狂欢 无人真正落地&#…...

我们团队的技术债已经堆成山,我用这四步说服老板给时间重构

在软件测试的日常工作中,我们或许是技术债最敏锐的感知者。每一次回归测试的漫长等待,每一个在“祖传代码”上小心翼翼打补丁的深夜,每一份因环境不稳定而飘红的测试报告,都在无声地控诉着那座压得团队喘不过气的“屎山”。然而&a…...

基于RAG与LLM的法律合规助手:架构、实现与工程实践

1. 项目概述:一个AI驱动的法律合规助手最近在GitHub上看到一个挺有意思的项目,叫ai-legal-compliance-assistant。光看名字,很多朋友可能觉得这又是一个蹭AI热点的“玩具”,或者是一个简单的规则匹配工具。但当我深入研究了它的架…...

ARM PMUv3架构详解与性能监控实战

1. ARM PMUv3架构概述 性能监控单元(Performance Monitor Unit, PMU)是现代处理器中用于硬件性能分析的关键组件。作为ARMv8架构的标准组成部分,PMUv3通过事件计数器和配置寄存器实现了对微架构事件的监测能力。在实际开发中,我们经常需要利用PMU来定位性…...

如何提升宝塔面板文件管理效率_使用SSH命令与Web端结合.txt

...

Proxima向量检索库:硬件优化与量化技术实战解析

1. 项目概述:一个为现代开发者打造的“近邻”代码库 最近在GitHub上看到一个挺有意思的项目,叫“Zen4-bit/Proxima”。乍一看这个标题,可能会有点摸不着头脑。“Zen4-bit”像是一个用户名或者某种架构的代号,而“Proxima”则让人联…...

LaTeX-PPT:3分钟学会在PowerPoint中快速插入专业数学公式的终极指南

LaTeX-PPT:3分钟学会在PowerPoint中快速插入专业数学公式的终极指南 【免费下载链接】latex-ppt Use LaTeX in PowerPoint 项目地址: https://gitcode.com/gh_mirrors/la/latex-ppt 你是否曾经在PowerPoint中为编辑复杂的数学公式而头疼?手动调整…...

开源破产法律实务知识库:构建结构化办案指南与协作平台

1. 项目概述:一个破产法律实务的开源知识库最近在整理过往的破产案件卷宗时,我一直在思考一个问题:如何将那些零散、重复但又至关重要的法律文书、办案流程和实务要点,系统地沉淀下来,形成一套可以随时查阅、迭代更新的…...

【架构实战】百万级Excel数据导入的“坑”与“填坑”指南(上):痛点剖析与破局利器 EasyExcel

前言大家好,这里是程序员阿亮!今天来给大家讲解一下在传统企业中报表和数据处理业务非常常见的工具-Excel在后端的使用和场景!引言:从一个看似简单的需求说起在日常的 B2B 业务、ERP 系统或者后台管理系统中,“Excel 导…...

大语言模型本地化部署利器:Synaptic-Link 模型文件管理工具详解

1. 项目概述与核心价值最近在折腾一些AI相关的本地化部署和模型管理,发现一个挺有意思的项目,叫dlxeva/synaptic-link。乍一看这个名字,可能有点摸不着头脑,“突触链接”?听起来像是神经科学或者生物信息学的东西。但如…...

交通事故车辆受损情况数据集分享(适用于YOLO系列深度学习分类检测任务)

交通事故车辆受损情况数据集分享(适用于YOLO系列深度学习分类检测任务) 源码下载链接:https://pan.baidu.com/s/1zYLg1EOwHB-HTBlxQr4w7A?pwdyhmd 提取码:yhmd前言 随着道路交通量的不断增加,交通事故的发生频率也呈现上升趋势。事故发生后&…...

基于视觉大模型的GUI自动化:从原理到实践

1. 项目概述:当GUI自动化遇见视觉大模型 最近在折腾自动化测试和RPA(机器人流程自动化)的时候,我遇到了一个老生常谈但又极其棘手的问题:如何稳定、高效地识别和操作那些没有标准控件标识的图形界面元素?传…...

AI编程也开始“贵价提速”?Cursor上线Opus极速模式,官方却劝你:别开,真不值!

前言各位码农老铁们,最近有没有感觉写代码像在开手动挡老爷车——油门踩到底,AI还在“思考人生”?别急,Cursor贴心地给你装了个“涡轮增压”:Claude Opus 4.7 Fast mode,号称速度拉满、输出飞起&#xff01…...

ARM ETMv4跟踪寄存器架构与调试实践

1. ARM ETMv4 跟踪寄存器架构概述ARM嵌入式跟踪宏单元(ETM)是处理器调试架构中的关键组件,ETMv4作为其第四代架构,提供了更强大的指令和数据跟踪能力。与传统的断点调试不同,ETM采用实时跟踪技术,能够在不中断处理器运行的情况下&…...

Bash脚本集成AI:实现智能运维自动化与决策增强

1. 项目概述:当Bash脚本遇见AI,自动化运维的“智能大脑”如果你和我一样,是个常年和Linux服务器、运维脚本打交道的“老运维”或开发者,那你肯定对Bash脚本又爱又恨。爱的是它的直接、高效,几行命令就能串联起复杂的系…...

OpenClaw AVP:构建统一音视频协议栈,实现多协议流媒体处理

1. 项目概述:一个面向音视频处理的协议栈最近在整理一些音视频项目时,又翻到了avp-protocol/openclaw-avp这个仓库。对于从事流媒体、实时通信或者音视频编解码开发的工程师来说,看到avp这个缩写,第一反应多半是 “Audio-Video Pr…...